bash.im ithappens.me zadolba.li
13434

Совпадение? Не думаю!

Вступлюсь за честь коллег из геймдева.

Во-первых, где вы видели, чтобы обычный рандом был с нормальным распределением? Спору нет, есть всякие мат. библиотеки, позволяющие привязать его к любой функции распределения, но кто же их будет специально искать и использовать, не зная, что это такое? Бывают глупые ошибки типа произведений рандома (или рандома от рандома).

Во-вторых, сессия для инициализации рандома используется в одиночных играх с целью борьбы с читерской магией load-save. Другого смысла постоянно дёргать seed просто нет.

В-третьих, игрокам вообще много что кажется, и они с радостью это интерпретируют как факты. Плюс — confirmation bias. Я помню случай, когда игроки были свято убеждены, что по случайному номеру в ссылке для предотвращения кеширования можно было определить успех ремонта предмета. И никого не смущало, что к скрипту шли десятки обращений в секунду и от момента генерации ссылки до последующего запроса рандом дёргался более тысячи раз.

Это же касается вообще любых якобы повторяющихся паттернов в рандоме. И «вычисления алгоритма работы». Чего его вычислять — всё есть в открытом доступе, почти всегда используется штатная функция выбранного языка разработки. Только никому это знание ничего не даёт.

Искренне порадовался аргументу про сокращение выборки. Ясное дело, что чем меньше выборка, тем более она неравномерна — это очевидно. Нетрудно получить «решку» в 8−10 случаях из 10, шанс на это чуть более 5%. А вот получить её в 80−100 случаях из 100 уже вряд ли удастся хотя бы раз за миллион попыток.

P.S. Ну, а парень из предыдущей истории просто не учёл, что по умолчанию большинство генераторов псевдослучайных чисел инициализируются от текущего времени с точностью до секунды. Так что, запустив одну и ту же программу на разных машинах, вторая из которых отстаёт примерно на пару секунд, можно получить полностью идентичные результаты.

13433

Длина имеет значение

Дело было в 98−99 году, когда, скопив приблизительно 1000 $, я наконец-то приобрёл свой первый комп (кстати, он неплохо работает до сих пор в качестве маршрутизатора под FreeBSD в режиме 24/7/365, пару раз в год чистится от пыли, и меняются кулеры).

Эпопея началась в процессе освоения, Windows я на тот момент не видел даже в книжках и свежая 98 была откровением. Через год товарищ из параллели открыл для меня NT4 Workstation (не буду рассказывать, как я первый раз ставил её пять часов без smartdrv), на которой я просидел следующие несколько лет (года аж до 2002, несмотря на Win2000), что меня и спасло. Система была офигительно стабильна, по сравнению с 95/98, и падала, только когда я сковыривал в ней что-то руками. Не припомню ни одного случая, чтобы она упала сама.

У NT было ещё одно большое «но» — DirectX for NT застрял на версии 5, и та была unofficial сборкой, игры же уже требовали шестую версию. Это и спасло меня от бесцельного прожигания времени. Хотя через несколько лет я с помощью Win32Dasm и Hiew убедил The Sims запуститься, заNOPав все проверки версии ОС наличия DirectX, но это уже отдельная история.

Так как играть я не мог, всё времяпровождение за компом тратилось на изучение и исследование. В том числе чрезвычайно внимательно были изучены все бумажки, прилагавшиеся к компу, практически целиком прочитан весь встроенный в винду хелп (Пуск → Справка, кстати до сих пор есть множество описанных там вещей, о которых знакомые айтишники знать не знают) и методом тыка изучено содержимое CD-диска с драйверами-утилитами от ASUS’овской материнки. Знание английского у меня тоже было никакое, поэтому буржуинские мануалы воспринимались со словарём с большим трудом. В конечном итоге я понял главное — на диске записаны драйвера. Это программы для лучшего взаимодействия Windows с железом. И если установлены «родные» драйвера, то производительность будет лучше. Эпопея «как уронить Windows» стартовала.

В принципе, всё обходилось спокойно, кроме одного пункта. На диске были UDMA66 драйвера, в комментариях к которым было сказано, что эти драйвера ощутимо ускоряют работу с диском (что с 32 MB оперативки и уползанием в своп было актуально), и я решил, что установить их просто критически необходимо. После установки картинки грузиться отказались… Восстановив работоспособность винды, я перечитал readme.txt буквально по словам со словарём, и из него я постиг, что с этими драйверами винт сможет работать только с родным же асусовским шлейфом, потому что он имеет определённую capacity в отличие от других.

Вскрыв машину я обнаружил, что на родном асусовском шлейфе висит CD-ROM, а винт подключён на шлейф без эмблемы ASUS. Поменял шлейфы — и вуаля! Винда стартанула! Выключил машину, снял шлейфы и приложил друг к другу. Замерял разницу линейкой. Как сейчас помню: родной асусовский был на 12 с лишним сантиметров (!) короче… Впрочем, помогло мне это не сильно — двухгиговый Fujitsu (работает в «роутере» до сих пор) отказался стабильно работать в UDMA66, и NT-шка буквально через пару минут засыпала меня сообщениями об ошибках чтения-записи. Пришлось откатиться на UDMA33.

Следи за длиной шлейфов, %username%, провода не идеальны и тоже имеют своё сопротивление и ёмкость.

13432

Fair dice roll

Великий корейский рандом, говорите? Всего лишь особенности работы генератора псевдослучайных чисел. Это очень хорошо, что вы только IP с его помощью формируете и ничего более, куда печальней дела обстоят в геймдеве, я вам скажу.

Уже более пятнадцати лет я наблюдаю пляски разработчиков игр вокруг рандомизаторов, и мне слегка несмешно временами, такое ощущение, что матчасть даже не пытались изучать:

  • if (rand(10000)==1) и прочие подобные глупости при использовании генератора с нормальным распределением.

  • Выбор по таблице добычи при помощи генератора с нормальным распределением. Если сюда добавить ещё разный шанс трофеям, то для некоторых позиций вырисовывается совсем запредельная схема.

  • Генерация энтропии на основе данных игрока/сессии/сервера. Обычно легко прослеживается и явно заметна.

  • Выборка случайного элемента из некоторой части списка для придания «большей случайности». За пределами добра и зла. В одной известной игрушке про убийство монстров это привело к тому, что можно было сутками пытаться выбить шмотку, которой просто не может выпасть в текущей сессии.

  • Скрытая манипуляция выборкой под видом случайного выбора.

  • ...и даже сочетание всего вышеперечисленного.

Самое смешное, что когда пользователи жалуются на симптомы подобных решений или вычисляют примерный алгоритм работы рандомизатора, начинается тотальное отрицание всего и вся. В крайнем случае, проверки алгоритма за пределами возможного матожидания, например: «Вот, смотрите, мы протестировали алгоритм на выборке из 300 выстрелов, всё чудесно». После этой фразы уже объяснять, что если сократить количество итераций до 30, картина меняется в корне, абсолютно бесполезно.

Очень хотелось бы обратиться ко всем коллегам: если вы пользуетесь радномизаторами в своих приложениях, прикиньте, как их поведение будет отражаться на ваших пользователях, разберитесь в алгоритме, подумайте тщательно. А то уже глаз дергается, ей богу.

13431

Гугл в помощь

Прочитав историю про ноль, расключённый на контакт заземления, получил лицевую травму от фейспалма.

Для кого выпускают ГОСТы, СНиПы и прочие стандарты? В основном, разумеется, для профессионалов. Но раз уж ты решил что-то сделать, ну так хотя бы загугли, можно вообще так поступить или лучше не надо.

Помните давнюю историю про таксу, которая за потолком тянула UTP? Задорно, ага. ГОСТ Р 53246? ANSI/TIA/EIA-569A? Не, не слышали. Профи, безусловно.

Золотое правило: если ты всё делаешь по соответствующему стандарту, ты гарантированно получишь работоспособную систему. Потому что стандарты предусматривают хороший такой «запас прочности», он же «защита от дурака», и в них в принципе отсутствуют так называемые узкие места.

А когда лень и недосуг почитать стандарт, получаются различные казусы. И не всегда забавные. Минимальный радиус изгиба оптики? Не в курсе? Тогда считай, что дешевле — ставить муфту на перелом кабеля или перетягивать трассу. Пучок UTP в одном лотке с вводным кабелем толщиной в руку — и чего это у нас тест на категорию 6 не проходит? Незаземлённый лоток — ой, откуда коллизии?

Иной раз складывается впечатление, что ГОСТы — это такая вещь в себе, никому, кроме авторов, не интересная. Добрая половина факапов, описанных на IT happens, как раз и случилась по причине пренебрежения правилами.

Собственно, это всё к чему? Есть такой документ — ПУЭ, Правила устройства электроустановок. Он совершенно не интересен ни админам, ни монтажникам слаботочки, ни, тем более, обычным гражданам, ровно до тех пор, пока не приходится столкнуться с сетью электропитания. Поскольку подавляющее число компьютерной и бытовой техники хочет для работы 220 В, в какой-то момент это столкновение произойдёт.

Так вот, когда это произойдёт, не поленитесь хотя бы Гуглом воспользоваться, если на ПУЭ сил не хватит. Узнаете много интересного про рабочий ноль и защитный ноль, например. Про то, что в распределительных щитах на вводе принято делать повторное заземление — соединять ноль и «землю». И про то, что после распределительного щита делать такое соединение категорически запрещается. Заодно узнаете, почему. Потому что, если вы этого не узнаете теоретически, то запросто можете узнать практически. Со всеми вытекающими.

13430

Великий корейский рандом

Пишу на C# тест для детей. Первое задание — перевести маску подсети в сокращённый вид, второе — перевести маску подсети из сокращённого вида в полный, далее — вычисление адреса сети и так далее.

Прога практически дописана. И тут я замечаю, что у меня выдается одна и та же маска в первом и во втором задании, просто в разной форме записи. Ну, совпало, думаю.

Перезапускаю прогу ещё раз… маска совпадает. Ещё четыре раза — маска совпадает. Проверяю переменные — всё в порядке. Проверяю вывод данных — всё в порядке. Лезу в подпрограмму генератора маски — опять не вижу ошибок! Прямо перед отображением работы запускаю вхолостую генератор маски шесть раз — каждый раз выдаёт разные.

И тут я замечаю, что маски в первом и во втором задании больше не одинаковы. Перезапускаю программу — маски разные. Удаляю холостые запуски генератора — маски опять разные. Это всего лишь шесть раз подряд маски в первом и во втором случае совпали. Рандом — такой рандом…

13429

Земля курильщика

Пару лет назад в доме у родителей случилась беда: любимый полуантикварный компьютер с «Одноклассниками», фотоархивом и прочими полезными вещами перестал включаться. Сначала просто системник 1−2 раза в день решал отправиться поспать, списывали на жару и перегрев процессора при плохой вентиляции. Но наступила осень, и отключений стало только больше.

Тогда решили поменять блок питания, так как знали, что из-за старого блока тоже бывают аналогичные проблемы. С новым блоком комп проработал ещё пару недель и сдох окончательно.

Вздохнув и признав, что всё же я не инженер и не специалист в железе (максимум могу собрать что-то из стандартных компонентов «для своих» и настроить систему), решили вызвать мастера.

Мастер надиагностировал сгоревшую материнку и сгоревший процессор. Заменил на антиквариат из собственных запасов. Но через пару недель история повторилась.

Тут мы вспомнили, что не раз обращали внимание на наводки на корпусе. И наконец-то догадались проверить напряжение на контактах в розетке.

В общем, в конце 90-х мы делали ремонт. Для компьютера решили поставить «европейскую» трёхконтактную розетку, которые тогда ещё были непривычны. Так как в стене шёл обычный советский двужильный провод, решили боковые контакты замкнуть на ноль, ведь на нём же нет напряжения, чем не «земля»? Прошло время, и то ли в щитке, то ли на подстанции наш ноль поменяли с фазой. Теперь удивляюсь, что техника в таких условиях вообще жила несколько месяцев, и даже данные на дисках остались неповреждёнными.

13428

Опасные игры

Дело было в середине девяностых. Учились в универе в нашей группе три товарища. Нещадно прогуливали пары, особенно по непрофильным предметам. Мотивировали тем, что работают программистами в одной крупной софтверной фирме, и мы все им немного завидовали.

В локальной сети универа было много всякого разного, натасканного студентами, в том числе и популярные в то время игры. И вот эти товарищи навострились играть на парах одного из спецпредметов в режиме мультиплей. Благо преподаватель этого предмета слова поперёк не говорил и вообще никак не реагировал на столь вопиющую наглость, тогда как все остальные преподы напрочь запрещали игры на парах, и при них играть можно было только украдкой.

Дошло до того, что эти три друга, приходя на пару, сразу запускали свои любимые игрушки и в открытую отчаянно резались до звонка, даже не сдерживая своих эмоций. Преподаватель этот был вовсе и не преподаватель, а профессиональный программист, подрабатывающий в нашем универе. Внешностью был похож на Вассермана, только худой. Давал несложные задания и не требовал полного их выполнения, больше дискутировал за жизнь, нежели по тематике предмета, и мы все понимали, что с экзаменом проблем не будет.

Так оно и случилось. На экзамене он вызывал студентов по очереди, задавал всего один вопрос, если студент отвечал, то получал пятёрку, если ответа не знал, то преподаватель сам отвечал на этот вопрос и ставил четвёрку, если, конечно, студент был согласен не на высший балл, иначе добро пожаловать на пересдачу, но таких не находилось.

И вот прошли все, остались только те три геймера. Взглянул на них «Вассерман» с улыбкой и сказал: «Ну что ж, для вас у меня особый экзамен, чем весь семестр занимались, то и будете сдавать». И дал он им три задания — завалить его в Quake в мультиплее трое против одного, побить его рекорды на всех трассах в NFS II и пройти созданный им уровень в Warcraft II (если уровень не проходится с первого раза, то на пересдаче даётся новый уровень). Сдавали они этот экзамен всю сессию долго и упорно, и однажды кто-то из студентов или преподавателей не выдержал и спросил его, зачем он их так мучает, они же ведь работают. «Знаю я, как они работают, — ответил „Вассерман“. — Я генеральный директор той фирмы, в которой они якобы работают».

Уж и не помнится, чем там дело закончилось, но к компьютерным играм те товарищи стали абсолютно равнодушными.

13427

Неуловимый Джо

Индусы, индусы, индусы… Пару часов назад столкнулся с тем, что коренные американцы способны накосячить не хуже индусов.

Вставляем в программу проверку входных бинарных данных (_fpclass) — вдруг нам NaN пришёл (или ещё какой мусор). И неожиданно для себя получаем три жирных бага в совсем других местах: зависание, некорректное отображение данных, движение времени «большими рывками».

Пара часов отладки — и становится понятно, что дело в том, что _fpclass портит режим сопроцессора. И вместо long double у нас сопроцессор считает всё как float.

Открываем сорцы. Ну странно же, когда стандартная подпрограмма из системной библиотеки не восстанавливает регистры оборудования. Гм, она восстанавливает. Угу, восстанавливает. Но с перепутанным порядком параметров в вызове _control87.

Дата написания кода — © 1998, 2000. Версия библиотеки 10.0. Как этот баг прожил 15 лет? 15 лет, Карл!

13426

Много шума из ничего

Непрекращающийся фейспалм? Вон из профессии? Плавали, знаем. В карьере каждого айтишника есть такое чудо, которое, не пройдя обычный испытательный срок, лезет напрямую к директору: «Они там всё делают не так, неправильно делают, один я знаю, как надо!»

Не дай боже директор поддастся на харизму этого фейспалмщика или просто окажется внушаемым. Как минимум фирма потратит дополнительные ресурсы, чтобы запустить параллельно «как правильно», и не факт, что нововведения окупят что-либо.

В большинстве случаев фейспалмщик будет пытаться перекинуть внедрение новой «как правильно» технологии на старый персонал. Сам же будет бегать вокруг, лезть под руки и театрально стонать: «Ну кто вас учил так делать?! У вас же руки из жопы, вы ничего не умеете! Как вас только в профессию взяли?!» Если старые сотрудники достаточно умны и не позволят повесить на себя внедрение «как правильно» технологий, фейспалмщик будет обвинять их в саботаже: «Они мне не дали чего-то там, куда-то там не пустили, не предупредили, что оборудование старое».

К сожалению, если гадалка вытащила карту таро «Чувак с фейспалмом», от айтишника зависит очень мало. Всё решает компетентность руководства. Начальник адекватный — максимум поручит харизматичному новичку автоматизацию нового отдела или магазина, чтобы не рисковать работой всей фирмы, а там уже по результатам. Босс является иллюстрацией эффекта Даннинга — Крюгера — надо постараться уйти, пока всё не развалилось.

Конечно, есть случаи, когда человек, орущий «ну кто вас учил так делать, у вас же руки из жопы, вы ничего не умеете, как вас только в профессию взяли?!» является специалистом высокого класса. Тогда уход старого специалиста пройдёт безболезненно — ему не будут названивать домой с вопросами:

— Почему вдруг ничего не работает?

— Где ещё могут быть резервные копии. Не, там мы удалили случайно, где ещё?

— Не будет ли любезен многоуважаемый джин за премию починить всё обратно? А вернуться на прежнее место с повышением?