Работаю админом в отделе сопровождения софта в %companyname%.
Помимо обслуживания серверов, сети, а также юзверей у себя на месте, приходится мотаться по бюджетным организациям и внедрять софт, который мы сопровождаем.
Только недавно вышел из отпуска, утром сонный и злой еду на работу. Оказалось, злой был я неспроста — по приходе девчонки, которые принимают заявки от бюджетников, «обрадовали» — за каждый день моего отпуска поступала как минимум одна заявка.
Ну, думаю, выпью чашку кофе — и в бой.
Звоню в одну организацию — просят перенести визит на неопределённый срок по технической причине. Не хотите — как хотите. Звоню во вторую, опять же, чтобы уточнить время визита — такая же ситуация. И так со всеми, кроме одной. Съездил туда, закрыл заявку, радостный возвращаюсь восвояси.
Раздаётся звонок от начальства. Сообщают, что есть две хорошие новости: первая — послезавтра привезут новые сервера и сетевое оборудование, а вторая — начальство отметило мои старания и трудовой энтузиазм и решило повысить меня до старшего админа, так что по заявкам мотаться больше не придётся.
Занимались не так давно внедрением интернет-магазина для торговой компании. Стояла задача подготовить счёт, который выставляется юридическим лицам. Все мы знаем, что в любом счёте внизу обычно размещаются подписи директора и бухгалтера, а также печать организации. Естественно, я запросила их у заказчика, мол, просим предоставить образцы печати и подписи для оформления счёта интернет-магазина. Заказчик мне ответила, что пока «живые» печать и подпись вам не нужны, справляйтесь без них.
Не вопрос, справились. Взяли первую попавшуюся подходящую демо-печать с прозрачным фоном. Далеко ходить не нужно, всё нашлось в картинках одного из поисковиков. Ну и попутно подготовили себе в запасничек демо-подписи «Гендиректор» и «Главбух», выведенные красивым рукописным шрифтом. Всё настроили и забыли до получения оригиналов. На следующий день нам приходит грозное письмо от разъярённого клиента:
Добрый день!
Прошу вас остановить работу по сайту. После вчерашней шутки в общем доступе на сайте (подпись и печать «Рога и копыта») я хочу прекратить наши деловые отношения.
Естественно, мы принесли заказчику извинения:
Здравствуйте, ООО ***.
Для тестирования интернет-магазина необходимо заполнение ключевых элементов счёта. Так как запрошенную информацию мы от вас не получили, а работы необходимо было провести, то соответствующие элементы счёта были заменены демонстрационными данными абстрактной компании. Наши действия не являлись какой-либо шуткой или провокацией. Приносим свои извинения, если вы сочли их некорректными.
Мораль сей басни очевидна: нужно быть внимательнее при выборе демо-материалов, чтобы не травмировать чувствительную психику клиента. Ибо для нас, разработчиков, это просто сайт с демо-контентом, а для владелеца — дело всей жизни, и он вполне может принять за личное оскорбление безобидные картинки.
Знаете, эффект присутствия — это круто. Но не в том случае, когда надо диагностировать причину поломки.
Друг пожаловался, что компьютер работает минут 15 и выпадает в BSOD. Ошибку посмотреть не успевает, так как толком не владеет английским. В общем, надо самому разбираться.
Пришёл. Сижу час. На компьютере вертится Google Chrome, играющий музыку из интернета. Никаких проблем, ничего не вылетает. Ушёл по своим делам, через 15 минут звонок: «Паш, он опять вырубился».
Прихожу опять. Заставляю своего друга сесть и делать всё то же, что и обычно, вдруг в этом причина. Снова просидел чуть больше часа — никакого эффекта, прекрасная работоспособность. Ушёл. Пришёл домой — звонок: снова отключился.
Иду в третий раз. С собой взял Visual Studio и исходники одного из своих проектов. Устанавливаю, ставлю компиляцию, запускаю одну из самых требовательных игрушек, что нашлись, в общем, всячески нагружаю железо. Полтора часа стресс-теста и опять никакого эффекта. Опять ушёл. Только вышел из подъезда — звонок. Плюнул, подниматься не стал. Сейчас вот думаю, как ошибку дальше искать?
В 2011 году после долгого перерыва в работе длиной в три года я вновь устроился админом в одну небольшую, но очень важную фирму. Из семнадцати пользователей не VIP-ом с некоторой натяжкой можно было назвать разве что офис-менеджера.
Фирма молодая, постоянного человека у них никогда не было, по части IT всё всегда делалось по принципу «срочно, сейчас, лишь бы работало». Соответственно, за два года накопилось столько всякого, что все эти важные дядечки могли в любой день лишиться всей своей системной работы, но так как все поголовно VIP, с их точки зрения у них, конечно же, всё было хорошо.
По инициативе директора было решено перекроить, точнее — построить с нуля IT-инфраструктуру с привлечением экспертов, а моё дело лишь поддержка и сопровождение. Естественно, всё перестраивать надо было на ходу, потому как бизнес ждать не будет.
Изначально вся эта красота держалась на одном сервере с Pentium 4, на котором кто-то с прямыми руками настраивал Server 2003 ещё пять лет назад, там же и 1С, и Kerio, и файловое хранилище, и всё на свете. При этом все пользователи работали по Wi-Fi через однорогий 801.11g-роутер.
И началось… Проблемы по всем фронтам, вопли «у нас всё работало», принтеры зависают, почта не ходит, рвётся Wi-FI, any-key нажать некому, и компы тормозят, и прям застрелиться. Месяц разгребания «авгиевых конюшен» в режиме аврал-нон-стоп, всё более-менее уладилось, стало потише. Естественно, всё это под беспрестанные вопли «раньше у нас всё именно так и работало», серьёзные разговоры про «не усложняй нам работу», «отцепись — не мешай, но чтобы всё работало прям сейчас», ну и, конечно же, чуть ли не служебные записки с требованием одной кнопки «сделать всё зашибись». И всё время виноват, виноват, виноват…
Причём вся эта мистика в какой-то момент перестала происходить сама по себе. Потом мы уже спокойно налаживали сервера и приводили всё к задуманному виду.
Из этой истории я сделал вывод, что все серьёзные бизнес-дядечки и тётечки свято верят в сказку и волшебство, если дело касается не их сферы. И ещё то, что все проблемы — они от лукавого, просто господам VIP-ам надо меньше нервничать, а господам айтишникам чистить карму и всегда быть немножко психологами, для людей ведь работаем.
Во-первых, где вы видели, чтобы обычный рандом был с нормальным распределением? Спору нет, есть всякие мат. библиотеки, позволяющие привязать его к любой функции распределения, но кто же их будет специально искать и использовать, не зная, что это такое? Бывают глупые ошибки типа произведений рандома (или рандома от рандома).
Во-вторых, сессия для инициализации рандома используется в одиночных играх с целью борьбы с читерской магией load-save. Другого смысла постоянно дёргать seed просто нет.
В-третьих, игрокам вообще много что кажется, и они с радостью это интерпретируют как факты. Плюс — confirmation bias. Я помню случай, когда игроки были свято убеждены, что по случайному номеру в ссылке для предотвращения кеширования можно было определить успех ремонта предмета. И никого не смущало, что к скрипту шли десятки обращений в секунду и от момента генерации ссылки до последующего запроса рандом дёргался более тысячи раз.
Это же касается вообще любых якобы повторяющихся паттернов в рандоме. И «вычисления алгоритма работы». Чего его вычислять — всё есть в открытом доступе, почти всегда используется штатная функция выбранного языка разработки. Только никому это знание ничего не даёт.
Искренне порадовался аргументу про сокращение выборки. Ясное дело, что чем меньше выборка, тем более она неравномерна — это очевидно. Нетрудно получить «решку» в 8−10 случаях из 10, шанс на это чуть более 5%. А вот получить её в 80−100 случаях из 100 уже вряд ли удастся хотя бы раз за миллион попыток.
P.S. Ну, а парень из предыдущей истории просто не учёл, что по-умолчанию большинство генераторов псевдослучайных чисел инициализируются от текущего времени с точностью до секунды. Так что, запустив одну и ту же программу на разных машинах, вторая из которых отстаёт примерно на пару секунд, можно получить полностью идентичные результаты.
Дело было в 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%, провода не идеальны и тоже имеют своё сопротивление и ёмкость.
Великий корейский рандом, говорите? Всего лишь особенности работы генератора псевдослучайных чисел. Это очень хорошо, что вы только IP с его помощью формируете и ничего более, куда печальней дела обстоят в геймдеве, я вам скажу.
Уже более пятнадцати лет я наблюдаю пляски разработчиков игр вокруг рандомизаторов, и мне слегка несмешно временами, такое ощущение, что матчасть даже не пытались изучать:
if (rand(10000)==1) и прочие подобные глупости при использовании генератора с нормальным распределением.
Выбор по таблице добычи при помощи генератора с нормальным распределением. Если сюда добавить ещё разный шанс трофеям, то для некоторых позиций вырисовывается совсем запредельная схема.
Генерация энтропии на основе данных игрока/сессии/сервера. Обычно легко прослеживается и явно заметна.
Выборка случайного элемента из некоторой части списка для придания «большей случайности». За пределами добра и зла. В одной известной игрушке про убийство монстров это привело к тому, что можно было сутками пытаться выбить шмотку, которой просто не может выпасть в текущей сессии.
Скрытая манипуляция выборкой под видом случайного выбора.
… и даже сочетание всего вышеперечисленного.
Самое смешное, что когда пользователи жалуются на симптомы подобных решений или вычисляют примерный алгоритм работы рандомизатора, начинается тотальное отрицание всего и вся. В крайнем случае, проверки алгоритма за пределами возможного матожидания, например: «Вот, смотрите, мы протестировали алгоритм на выборке из 300 выстрелов, всё чудесно». После этой фразы уже объяснять, что если сократить количество итераций до 30, картина меняется в корне, абсолютно бесполезно.
Очень хотелось бы обратиться ко всем коллегам: если вы пользуетесь радномизаторами в своих приложениях, прикиньте, как их поведение будет отражаться на ваших пользователях, разберитесь в алгоритме, подумайте тщательно. А то уже глаз дергается, ей богу.
Прочитав историю про ноль, расключённый на контакт заземления, получил лицевую травму от фейспалма.
Для кого выпускают ГОСТы, СНиПы и прочие стандарты? В основном, разумеется, для профессионалов. Но раз уж ты решил что-то сделать, ну так хотя бы загугли, можно вообще так поступить или лучше не надо.
Помните давнюю историю про таксу, которая за потолком тянула UTP? Задорно, ага. ГОСТ Р 53246? ANSI/TIA/EIA-569A? Не, не слышали. Профи, безусловно.
Золотое правило: если ты всё делаешь по соответствующему стандарту, ты гарантированно получишь работоспособную систему. Потому что стандарты предусматривают хороший такой «запас прочности», он же «защита от дурака», и в них в принципе отсутствуют так называемые узкие места.
А когда лень и недосуг почитать стандарт, получаются различные казусы. И не всегда забавные. Минимальный радиус изгиба оптики? Не в курсе? Тогда считай, что дешевле — ставить муфту на перелом кабеля или перетягивать трассу. Пучок UTP в одном лотке с вводным кабелем толщиной в руку — и чего это у нас тест на категорию 6 не проходит? Незаземлённый лоток — ой, откуда коллизии?
Иной раз складывается впечатление, что ГОСТы — это такая вещь в себе, никому, кроме авторов, не интересная. Добрая половина факапов, описанных на IT happens, как раз и случилась по причине пренебрежения правилами.
Собственно, это всё к чему? Есть такой документ — ПУЭ, Правила устройства электроустановок. Он совершенно не интересен ни админам, ни монтажникам слаботочки, ни, тем более, обычным гражданам, ровно до тех пор, пока не приходится столкнуться с сетью электропитания. Поскольку подавляющее число компьютерной и бытовой техники хочет для работы 220 В, в какой-то момент это столкновение произойдёт.
Так вот, когда это произойдёт, не поленитесь хотя бы Гуглом воспользоваться, если на ПУЭ сил не хватит. Узнаете много интересного про рабочий ноль и защитный ноль, например. Про то, что в распределительных щитах на вводе принято делать повторное заземление — соединять ноль и «землю». И про то, что после распределительного щита делать такое соединение категорически запрещается. Заодно узнаете, почему. Потому что, если вы этого не узнаете теоретически, то запросто можете узнать практически. Со всеми вытекающими.
Пишу на C# тест для детей. Первое задание — перевести маску подсети в сокращённый вид, второе — перевести маску подсети из сокращённого вида в полный, далее — вычисление адреса сети и так далее.
Прога практически дописана. И тут я замечаю, что у меня выдается одна и та же маска в первом и во втором задании, просто в разной форме записи. Ну, совпало, думаю.
Перезапускаю прогу ещё раз… маска совпадает. Ещё четыре раза — маска совпадает. Проверяю переменные — всё в порядке. Проверяю вывод данных — всё в порядке. Лезу в подпрограмму генератора маски — опять не вижу ошибок! Прямо перед отображением работы запускаю вхолостую генератор маски шесть раз — каждый раз выдаёт разные.
И тут я замечаю, что маски в первом и во втором задании больше не одинаковы. Перезапускаю программу — маски разные. Удаляю холостые запуски генератора — маски опять разные. Это всего лишь шесть раз подряд маски в первом и во втором случае совпали. Рандом — такой рандом…
Пару лет назад в доме у родителей случилась беда: любимый полуантикварный компьютер с «Одноклассниками», фотоархивом и прочими полезными вещами перестал включаться. Сначала просто системник 1−2 раза в день решал отправиться поспать, списывали на жару и перегрев процессора при плохой вентиляции. Но наступила осень, и отключений стало только больше.
Тогда решили поменять блок питания, так как знали, что из-за старого блока тоже бывают аналогичные проблемы. С новым блоком комп проработал ещё пару недель и сдох окончательно.
Вздохнув и признав, что всё же я не инженер и не специалист в железе (максимум могу собрать что-то из стандартных компонентов «для своих» и настроить систему), решили вызвать мастера.
Мастер надиагностировал сгоревшую материнку и сгоревший процессор. Заменил на антиквариат из собственных запасов. Но через пару недель история повторилась.
Тут мы вспомнили, что не раз обращали внимание на наводки на корпусе. И наконец-то догадались проверить напряжение на контактах в розетке.
В общем, в конце 90-х мы делали ремонт. Для компьютера решили поставить «европейскую» трёхконтактную розетку, которые тогда ещё были непривычны. Так как в стене шёл обычный советский двужильный провод, решили боковые контакты замкнуть на ноль, ведь на нём же нет напряжения, чем не «земля»? Прошло время, и то ли в щитке, то ли на подстанции наш ноль поменяли с фазой. Теперь удивляюсь, что техника в таких условиях вообще жила несколько месяцев, и даже данные на дисках остались неповреждёнными.