Как рандомный человек из недалекого будущего, не имеющий никакого отношения к контесту, просто хочу выразить своё искреннее и очень сильное восхищение! Проект с потрясающей идеей, продуманными деталями, качественной атмосферой, пасхалками и настоящим инопланетным интерфейсом это просто космос! Сказал бы, что это большая редкость, но на самом деле здесь буквально once-in-a-lifetime-experience, который вы кому-то смогли подарить!
Расскажите, для чего вам реальная дата драйверов из состава ОС?
Есть очень классный, естественный, а главное простой подход: информация не нужна — не показывай, показываешь — показывай корректно. Даже если считать дату релиза излишней (с чем я несогласен) текущий вариант ни разу не оправдан.
Оффтопик: Почему несогласен? Дата релиза это быстрый способ оценить «насколько драйвер свежий». Если у меня глючит девайс, то глянуть инфу по использующемуся драйверу — один из естественных шагов сбора данных о проблеме. И, обнаружив в системе окаменелости 2006 года, я полезу вбивать в гугл «почему оно не обновляется», т.е. решать несуществующую проблему.
Дата отображается корректно, но не та, которую вы, возможно, ожидаете увидеть.
Я это в рамочку повешу. Смотришь в поле «Дата разработки» и видишь дату, которая не является датой разработки, но отображается, безусловно, корректно.
Ваш пример не корректен. Тут дата осталась датой, и не несет дополнительной информации о погоде в Редмонде.
Это, простите, как? Дата перестала быть датой релиза драйвера от слова совсем, а превратилась в метод назначения наименьшего приоритета. Хотя да, погоду в Редмонде туда пока не засунули.
Если компания ставит на проект программиста, предварительно, не ознакомив его с соглашениями, принятыми в данном проекте, то это проблема чья угодно, но не программистов которые писали проект.
Если программист пишет костыльный непродуманный связный неустойчивый плохо поддерживаемый код, который требуется разъяснять всем новоприбывшим (что, кстати, технически невозможно: в крупных проектах разъяснение ВСЕХ костылей займет времени заведомо больше времени жизни отдельно взятого разраба, что никак не оправдывает написание новых костылей), то это называется чудесным термином технический долг и является достаточно тяжелой ношей для кармы и совести программиста (при наличии последней, конечно же). У компании в этой ситуации, впрочем, тоже есть проблемы: организация сроков и метрик, вероятно, подталкивает к быстрым непродуманным фиксам, а практика code review недостаточно развита, чтобы настучать автору по рукам.
Достаточно писать логичный самодокументированный код, в котором дата релиза это реально дата релиза, и никаких разъяснений новоприбывшим не потребуется, никаких потенциальных факапов не будет заложено, никаких статей на GK не будет выложено. Но да, для этого требуется и подумать подольше, и покодить побольше, что сложно.
Расскажите нам, как нужно было решить проблему с приоритетом?
Концепт без специфики. При установке драйвера есть некий источник (набор источников?), откуда система получает о нём информацию (версию, дату, whatever). Источник контролируется автором дров. Очевидно, в нём не хватает информации о приоритетности драйвера. Следовательно, формат этого источника необходимо расширить необязательным полем «low_priority_source». При отстутсвии такого поля или при значении false считать драйвер нормальным вендорским, в противном случае ставить как системный.
Мне ни разу не было необходимости смотреть дату системного драйвера. Зачем она мне?
Ну раз вам не надо, то и никому не надо, очевидно же. Вот же майкрософтовцы, напридумывали полей пользователям отображать почем зря, но потом исправились и стали отображать их неверно. Очень правильный подход.
Я вот еще раз переспрошу, ну, на всякий, вас точно не смущает, что окошко дату типа отображает, но делает это некорректно? Это модная фича? Разумный подход? Или зависит от религиозных предпочтений?
С программистом вообще надуманная проблема.
Да не говорите, работая в sustain ни разу не возникало трудностей с неожиданным и нетрадиционным использованием данных. А, нет, подождите, возникало. Вот недавно всплыл баг из-за того, что isPasswordEmpty неожиданно определял не только наличие пароля, но и предпочитаемый тип хеша для его сохранения, а дизайнер, который правил этот участок, особенностей кода не заметил. Нет бы флаг изначально добавить для этой функциональности, не было бы беды. Но на хак с датами драйверов ни капельки не похоже, да.
Вообще, костыль является эталонным в том плане, что он на ровном месте делает логику программы неочевидной одновременно и пользователям и разработчикам. Обычно вредят только одной из сторон.
Способ хорош? Не имеет недостатков, кроме как плохо выглядит? Серьёзно? Вы, случаем не из MS? И этот комментарий заплюсован?
Давайте я подскажу поверхностные проблемы этого подхода:
Крайне неожиданно, но юзер не может узнать дату релиза драйвера из предназначенного для этого меню. Удивительная логичность ситуации: пункт «Дата разработки» есть, а реальной даты нет. Не смущает?
Хуже того (и да, достойно отдельного пункта) «дата» вводит в заблуждение неподготовленного человека. Этот «атата» можно исправить независимо от предыдущего пункта, например, очередным костылем: видишь специальную дату, отображай «нет инфы» или что-нибудь поинтересней в соответствующем поле
Это решение очень плохо поддерживаемое. Разработчик не может довериться логике названия поля, нужно знать особенность системы: даты не просто так, а в них может крыться спец смысл. При смене поколений девелоперов, новый может быть не посвящен в эти таинства, в результате чего мы будем обсуждать очередную статью «свежие системные драйвера неожиданно имеют приоритет выше вендорских», а человек всего лишь сделал доброе дело и поставил наконец нормальную дату в описание нового драйвера
Система может быть проста, последовательна и логична. Дата обозначает дату, флаг «системный» — источник драйвера. Я могу понять, когда программисты суют костыли по причине острой нехватки времени и/или квалификации, но вот людей, которые целенаправленно этот подход одобряют- увы, не в состоянии.
Что вас останавливает от более широкой трактовки даты в таком случае? Почему бы четным годам до 2006 не поставить в соответствие, скажем, наличие в драйвере поддержки режима X, а месяцем «декабрь» отмечать те, что являются краткосрочными и будут скоро обновлены? А дату «29 февраля» интерпретировать как «заглушка драйвера с минимально возможным функционалом»? Красота такого решения, надо полагать, будет непревзойденной: ни одного лишнего флага вводить не придется.
P.S. писать на GT через неделю после публикации сродни некропостинку, но я, как человек из sustain команды, проклинающий авторов подобного кода до 7 колена включительно, не могу смотреть на то, какой пример вы показываете детям оставляете будущим читателям.
… а так бы дети играли в войнушку и «казаков разбойников». Знаете, как и без нас называются две самые популярные игры у детей в возрасте старше 12 лет? «Мафия» и «Изнасилование». Механика продажи конфет погоды не сделают.
То, во что играют дети между собой, лежит в их зоне ответственности. Они не могут и не будут воспитывать друг друга так, как мы бы того хотели, за редким исключением. Игры, которые предлагаются взрослыми, лежат в нашей зоне ответственности. И вполне разумно включать в игру укрепление разумного поведения. Хороший подход — учить через игру, показывать правильные примеры, а не придумывать способ занять ребенка на следующие N минут.
Если дети в лагере любят матерные частушки это ни разу не повод выносить их на сцену для всеобщего развлечения, даже несмотря на «они же и так без нас их слушают».
Плюс, я бы хотел заметить, что изначально правило, запрещающее сладкое объявляется явно как самодурство ведущего. Ничем не обоснованное и заведомо глупое. На этом делается акцент. А если я научу детей, что всегда нужно критически мыслить, то я буду только прав. К примеру, им с 18 лет можно будет покупать и курить сигареты. Законом это разрешается. Но может иногда стоит задуматься, все ли законы выгодны для тебя.
Надеюсь, это действительно оооочень хороший акцент, а то многие взрослые указания (в том числе и лагерные правила) выглядят ничем не обоснованными и заведомо глупыми с точки зрения не очень проницательных детей. Плюс под критическим мышлением я привык понимать взвешенные самостоятельные решения, а не банальное следование призыву «ну его, давайте нарушим».
В общем, подытожу свою позицию: учить ребенка думать своей головой вместо слепого следования правилам нужно, но этот аспект в такой постановке сомнителен. Провоцировать ребенка на игнорирование правил без обсуждения происходящего, мотивируя материальной наградой, больше похоже на разложение моральных устоев, нежели на обучение чему-то разумному. Играть в город профессий очень полезно и конструктивно. Играть в город профессий с мафией, наркотиками и проститутками гораздо веселей, но педагогический момент уходит в минус.
Shultc, спасибо за статью. Игра антуражна, механика увлекательна, но посыл… Посыл ужасен, на мой взгляд. Может это надвигается старость, но, глядя на веселую бесшабашную игру, которая обязательно увлекла бы меня-ребенка, я вижу выставление плохих ролей (контрабандист/наркоторговец) в очень привлекательном для детей свете.
Не уверен, что предлагать детям нарушить четко озвученные правила ради легкой прибыли разумно. Те, кто идут на это, примеривают не лучшую роль и убеждаются в ее успешности. Те, кто отказываются, получают классическое моральное испытание «я сделал, как велят моральные устои, и остался у разбитого корыта». Напрашивается предложение добавить механику кражи/грабежа/разбоя/убийства в игру для большей аутентичности.
И тех и других детей вы толкаете к пренебрежению правилами ради собственной выгоды, ломая и без того хрупкую конструкцию морального воспитания. Урок, который могут извлечь дети из этой игры, отнюдь не украсит наше общество.
Три дня я гналась за Вами — да! — чтобы сказать Вам, как Вы мне безразличны!
Откопал год как пылящийся хабровский пароль только ради выражения своего «фи». У вас получился невероятно самодовольный категоричный комментарий напрочь игнорирующий контр-примеры из статьи. Что забавно, вы продолжили игнорировать их упоминание и в последующих обсуждениях. Можете уже ясно и без экивоков пояснить, как пафосная фраза про
Через двадцать лет компиляторы таки научились понимать основные паттерны, и правильно генерировать для них код
может существовать в мире с оптимизацией minmax1() в minmax2()?
Пожалуй, только выглядит он не грозным суперзлодеем, пытающимся захватить мир, построить звезду смерти или хотя бы аннигилировать человечество, а тянет в лучшем случае на старуху Шапокляк с ее мелкими мерзкими пакостями.
… А сколько эти игры породили «городских легенд», не пересчитать. Можно ли запустить шаттл хабологов? Как спровоцировать анклав прилететь на электростанцию в Гекко? Только ради этих неосуществимых целей я перепроходил игру совершенно другим персонажем не один раз…
Если говорить о несуществующих номерах уровня, то приведенный алгоритм генерации пароля может различить только 40 вариантов: в зависимости от выбранного номера, pass[7] может принять любое из 10 значений, а pass[1] только четыре значения. В качестве примера можно сгенерировать пароль для уровней, скажем, 6 и 46 — получится одно и то же число.
Становится очевидно, что для подбора пароля достаточно, чтобы контрольная сумма подходила к закодированным данным. Тогда, если не учитывать её специфику, можно посчитать вероятность подобрать пароль: ровно 1% (единица делить на количество возможных значений суммы) — довольно много.
Не совсем верно: пароль с правильной контрольной суммой может быть невалиден, если в нем закодирован несуществующий номер уровня.
К сожалению, я затрудняюсь посчитать вероятность подбора, но и так ясно, что она куда больше одного процента.
Хм, вероятность всё так же считается делением количества валидных паролей на количество всех, а именно: 14(число уровней) * 100(возможные значения времени) * 10 * 10 (выбор случайных чисел) / 100000000
Это равно 0,14%, или, что тоже самое, один верный пароль на 700 неправильных.
Последний комментарий pravic оставил в контексте обсуждения CD /D. Мол, выученную тысячу лет назад информацию о базовых командах стоит обновить, т.к. они могли существенно измениться в процессе эволюции command.com => cmd.exe => cmd.exe /E:ON
Забавно. Выученная с детства команда CD уже давно воспринимается как данность. Даже в голову не приходило посмотреть ее ключи и возможности. Ушел перечитывать справки по MD, TYPE и пр. — вдруг и в них кроется какой-нибудь чудесный функционал.
Вторую часть проблемы — поддержку UNC-путей — насколько я понимаю, тоже можно решить при помощи subst (или net use) + CD /D, так что в этом участке кода вполне реально обойтись правильным использованием CD, если такая прихоть возникнет.
В данный момент я (подозреваю, как и многие другие начинающие авторы) очень остро нуждаюсь в обратной связи. Количество людей, минусующих статью и/или карму, вполне ощутимо, и, разумеется, за каждым таким минусом скрывается недочет, требующий доработки. Но плохая оценка без оглашения претензии не позволяет что-либо исправить, оставляя меня недоумевать, строить догадки и продолжать наступать на старые грабли.
А посему прошу, занеся курсор над стрелкой вниз, потратьте две минуты на то, чтобы сформулировать свой обвинительный приговор.
Не имею никакого отношения к ICFPC, но отчет восхитителен. Жаль, хабр не даёт плюсовать старые посты.
Как рандомный человек из недалекого будущего, не имеющий никакого отношения к контесту, просто хочу выразить своё искреннее и очень сильное восхищение! Проект с потрясающей идеей, продуманными деталями, качественной атмосферой, пасхалками и настоящим инопланетным интерфейсом это просто космос! Сказал бы, что это большая редкость, но на самом деле здесь буквально once-in-a-lifetime-experience, который вы кому-то смогли подарить!
Есть очень классный, естественный, а главное простой подход: информация не нужна — не показывай, показываешь — показывай корректно. Даже если считать дату релиза излишней (с чем я несогласен) текущий вариант ни разу не оправдан.
Оффтопик: Почему несогласен? Дата релиза это быстрый способ оценить «насколько драйвер свежий». Если у меня глючит девайс, то глянуть инфу по использующемуся драйверу — один из естественных шагов сбора данных о проблеме. И, обнаружив в системе окаменелости 2006 года, я полезу вбивать в гугл «почему оно не обновляется», т.е. решать несуществующую проблему.
Я это в рамочку повешу. Смотришь в поле «Дата разработки» и видишь дату, которая не является датой разработки, но отображается, безусловно, корректно.
Это, простите, как? Дата перестала быть датой релиза драйвера от слова совсем, а превратилась в метод назначения наименьшего приоритета. Хотя да, погоду в Редмонде туда пока не засунули.
Если программист пишет костыльный непродуманный связный неустойчивый плохо поддерживаемый код, который требуется разъяснять всем новоприбывшим (что, кстати, технически невозможно: в крупных проектах разъяснение ВСЕХ костылей займет времени заведомо больше времени жизни отдельно взятого разраба, что никак не оправдывает написание новых костылей), то это называется чудесным термином технический долг и является достаточно тяжелой ношей для кармы и совести программиста (при наличии последней, конечно же). У компании в этой ситуации, впрочем, тоже есть проблемы: организация сроков и метрик, вероятно, подталкивает к быстрым непродуманным фиксам, а практика code review недостаточно развита, чтобы настучать автору по рукам.
Достаточно писать логичный самодокументированный код, в котором дата релиза это реально дата релиза, и никаких разъяснений новоприбывшим не потребуется, никаких потенциальных факапов не будет заложено, никаких статей на GK не будет выложено. Но да, для этого требуется и подумать подольше, и покодить побольше, что сложно.
Концепт без специфики. При установке драйвера есть некий источник (набор источников?), откуда система получает о нём информацию (версию, дату, whatever). Источник контролируется автором дров. Очевидно, в нём не хватает информации о приоритетности драйвера. Следовательно, формат этого источника необходимо расширить необязательным полем «low_priority_source». При отстутсвии такого поля или при значении false считать драйвер нормальным вендорским, в противном случае ставить как системный.
Ну раз вам не надо, то и никому не надо, очевидно же. Вот же майкрософтовцы, напридумывали полей пользователям отображать почем зря, но потом исправились и стали отображать их неверно. Очень правильный подход.
Я вот еще раз переспрошу, ну, на всякий, вас точно не смущает, что окошко дату типа отображает, но делает это некорректно? Это модная фича? Разумный подход? Или зависит от религиозных предпочтений?
Да не говорите, работая в sustain ни разу не возникало трудностей с неожиданным и нетрадиционным использованием данных. А, нет, подождите, возникало. Вот недавно всплыл баг из-за того, что isPasswordEmpty неожиданно определял не только наличие пароля, но и предпочитаемый тип хеша для его сохранения, а дизайнер, который правил этот участок, особенностей кода не заметил. Нет бы флаг изначально добавить для этой функциональности, не было бы беды. Но на хак с датами драйверов ни капельки не похоже, да.
Вообще, костыль является эталонным в том плане, что он на ровном месте делает логику программы неочевидной одновременно и пользователям и разработчикам. Обычно вредят только одной из сторон.
Вы, случаем не из MS?И этот комментарий заплюсован?Давайте я подскажу поверхностные проблемы этого подхода:
Система может быть проста, последовательна и логична. Дата обозначает дату, флаг «системный» — источник драйвера. Я могу понять, когда программисты суют костыли по причине острой нехватки времени и/или квалификации, но вот людей, которые целенаправленно этот подход одобряют- увы, не в состоянии.
Что вас останавливает от более широкой трактовки даты в таком случае? Почему бы четным годам до 2006 не поставить в соответствие, скажем, наличие в драйвере поддержки режима X, а месяцем «декабрь» отмечать те, что являются краткосрочными и будут скоро обновлены? А дату «29 февраля» интерпретировать как «заглушка драйвера с минимально возможным функционалом»? Красота такого решения, надо полагать, будет непревзойденной: ни одного лишнего флага вводить не придется.
P.S. писать на GT через неделю после публикации сродни некропостинку, но я, как человек из sustain команды, проклинающий авторов подобного кода до 7 колена включительно, не могу смотреть на то, какой пример вы
показываете детямоставляете будущим читателям.Так или иначе, спасибо за вашу работу. Нестандартные задумки редки и ценны, вы делаете наш мир интереснее, так что удачи в любом случае.
То, во что играют дети между собой, лежит в их зоне ответственности. Они не могут и не будут воспитывать друг друга так, как мы бы того хотели, за редким исключением. Игры, которые предлагаются взрослыми, лежат в нашей зоне ответственности. И вполне разумно включать в игру укрепление разумного поведения. Хороший подход — учить через игру, показывать правильные примеры, а не придумывать способ занять ребенка на следующие N минут.
Если дети в лагере любят матерные частушки это ни разу не повод выносить их на сцену для всеобщего развлечения, даже несмотря на «они же и так без нас их слушают».
Надеюсь, это действительно оооочень хороший акцент, а то многие взрослые указания (в том числе и лагерные правила) выглядят ничем не обоснованными и заведомо глупыми с точки зрения не очень проницательных детей. Плюс под критическим мышлением я привык понимать взвешенные самостоятельные решения, а не банальное следование призыву «ну его, давайте нарушим».
В общем, подытожу свою позицию: учить ребенка думать своей головой вместо слепого следования правилам нужно, но этот аспект в такой постановке сомнителен. Провоцировать ребенка на игнорирование правил без обсуждения происходящего, мотивируя материальной наградой, больше похоже на разложение моральных устоев, нежели на обучение чему-то разумному. Играть в город профессий очень полезно и конструктивно. Играть в город профессий с мафией,
наркотиками и проституткамигораздо веселей, но педагогический момент уходит в минус.Не уверен, что предлагать детям нарушить четко озвученные правила ради легкой прибыли разумно. Те, кто идут на это, примеривают не лучшую роль и убеждаются в ее успешности. Те, кто отказываются, получают классическое моральное испытание «я сделал, как велят моральные устои, и остался у разбитого корыта». Напрашивается предложение добавить механику кражи/грабежа/разбоя/убийства в игру для большей аутентичности.
И тех и других детей вы толкаете к пренебрежению правилами ради собственной выгоды, ломая и без того хрупкую конструкцию морального воспитания. Урок, который могут извлечь дети из этой игры, отнюдь не украсит наше общество.
Три дня я гналась за Вами — да! — чтобы сказать Вам, как Вы мне безразличны!Откопал год как пылящийся хабровский пароль только ради выражения своего «фи». У вас получился невероятно самодовольный категоричный комментарий напрочь игнорирующий контр-примеры из статьи. Что забавно, вы продолжили игнорировать их упоминание и в последующих обсуждениях. Можете уже ясно и без экивоков пояснить, как пафосная фраза про
может существовать в мире с оптимизацией minmax1() в minmax2()?
Можно узнать, почему? Честно говоря, не вижу причин, по которым страна не должна знать своих героев.
Не совсем верно: пароль с правильной контрольной суммой может быть невалиден, если в нем закодирован несуществующий номер уровня.
Хм, вероятность всё так же считается делением количества валидных паролей на количество всех, а именно:
14(число уровней) * 100(возможные значения времени) * 10 * 10 (выбор случайных чисел) / 100000000
Это равно 0,14%, или, что тоже самое, один верный пароль на 700 неправильных.
Ах, если бы. Вот же он
Последний комментарий pravic оставил в контексте обсуждения CD /D. Мол, выученную тысячу лет назад информацию о базовых командах стоит обновить, т.к. они могли существенно измениться в процессе эволюции command.com => cmd.exe => cmd.exe /E:ON
Вторую часть проблемы — поддержку UNC-путей — насколько я понимаю, тоже можно решить при помощи subst (или net use) + CD /D, так что в этом участке кода вполне реально обойтись правильным использованием CD, если такая прихоть возникнет.
А посему прошу, занеся курсор над стрелкой вниз, потратьте две минуты на то, чтобы сформулировать свой обвинительный приговор.