bash.im ithappens.me zadolba.li
12145

В одну погибель

27 апреля 2014, 07:24

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

Работаю в новой компании почти месяц. Когда устроился, в части офиса был ещё ремонт, все коммуникации провели до меня, и я, понадеявшись на благоразумность моего предшественника, особо сильно не вдавался в подробности. Ну, работает — и нехай работает. Настал день, когда ремонт был завершён. Приходят ко мне и говорят: «Надо бы нам главного акционера в его новый кабинет перевезти». Ну, не вопрос. Делов-то — компик из одного кабинета в другой, проводок туда, проводок сюда. Все перенёс, начал подключать. И вот тут случился ужас. Розетки не подписаны. И как быть? Ни LAN-тестера, ни схемы, вообще ничего у меня нету. И возле стола розетка только одна. То есть либо подключаем телефон, либо комп. С компом долго мучиться не стал: моноблок, слава великому Туксу, оснащён модулем «вайфай». Ну, значит, розетку отведём под телефон. Съездил в магазин, купил LAN-тестер, отыскал, где же наша розетка находится в стойке, и занялся уже механической работой…

Перенёс, поставил, подключил — и вижу фигу. «Server connected» — и на этом разговор закончился.

Что я только не пытался сделать! Сначала тщательно проверил, правильно ли я всё воткнул. Да, всё верно, провода подключены как положено. Втыкаю провод с тестером в розетку, в стойке ответка. Линк есть. Втыкаю в телефон… «Server connected» — и тишина.

Чем чёрт не шутит — может, когда телефон отключил, настройки сбились? Ну, разные чудеса бывали в моей практике. Полез в консоль АТС — всё тип-топ! Только пишет, что аппарат не подключён.

Окей, видимо, настройки телефона. Просматриваю настройки такого же аппарата, стоящего в переговорной. Делаю по аналогии — ни фига.

Тут мне в голову приходит шальная мысль: а что, если дело в проводе от аппарата до розетки? Достаю, вставляю в тестер — работает! Всё, что приходит на ум, это только потанцевать вокруг с бубном и вознести хвалу всем богам. Возвращаюсь к себе в кабинет, устало опускаюсь в кресло… На меня заманчиво, почти соблазняя, смотрит новенький телефонный проводок. А почему бы и нет? Попытка — не пытка. Хватаю его, бегу подключаю, включаю питалово аппарата… Победа — оно работает! Проверяю старый провод через тестер. Работает! Голова отказывается понимать, в чём разница. Начинаю внимательно осматривать провод и понимаю, в чём зарылась причина. Проводок перебился. Когда его распрямляешь, коннект есть, когда сгибаешь, чтобы засунуть в аппарат, коннект пропадает…

Так что, господа, коллеги и друзья, не ищите себе проблем на ровном месте! Всегда проверяйте мелочёвку в первую очередь — сэкономите себе время и силы.

12144

Камера! Моторчик!

27 апреля 2014, 07:12

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

12143

Иногда они всё-таки лажают

27 апреля 2014, 07:00

Я предпочитаю начинать решение проблем в программах с вопроса «а где я ошибся?», так как мой опыт показывает, что в большинстве случаев ошибка именно моя. Но иногда…

Случилось мне заниматься разработкой программного комплекса, один из компонентов которого вертелся в MySQL. При этом всю логику взаимодействия с БД я по возможности перенёс в хранимые процедуры внутри БД. Возникла необходимость оптимизации одной из хранимых процедур, которая при попытке всунуть в БД жалкие 10К строк зависала на два часа. Нужно было найти узкое место этой процедуры. Поиск «бутылочного горлышка» довольно прост: засекаем, сколько миллисекунд уходит на каждый шаг, смотрим, где проблема…

Проблема нашлась гораздо раньше: СУБД категорически отказалась выдавать нам информацию о миллисекундах. Даже под пытками. И даже с Гуглом. При этом информации в интернете было на удивление мало; у меня даже закралось страшное подозрение, которое со временем окрепло, что народ свои базы вообще не оптимизирует. В конце концов Гугл раскололся и выдал ссылку на точное описание проблемы… в багрепорте разработчиков. Читая добросовестное описание проблемы, я испытывал невероятное умиление: моя ситуация один в один! Сейчас дочитаю до ответа разрабов, пойму, где я дурак, всё сделаю как надо… Ответ разрабов был как ушат холодной воды: «Да. Такая проблема существует. MySQL не умеет возвращать миллисекунды».

Не было информации о том, что ведутся работы по устранению проблемы. Ни слово о том, что в версиях с xx.x.xx проблема решена. Просто признание, что жопа есть.

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

На помощь мне пришёл метод Монте-Карло. В моём случае вероятность изменения значения секунды во время атомарной операции была пропорциональна количеству миллисекунд, на эту операцию затрачиваемых. Тут-то и пригодился ввод из 10К строк.

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

Кстати, в результате оптимизации я довольно много узнал о внутренней логике MySQL, встроенных в него инструментах отладки и оптимизации и всерьёз зауважал его разработчиков. Временные таблицы, индексы, JOIN вместо вложенных SELECT — и время внесения 10K строк сократилось с двух часов до трёх минут.

12142

Лучший антивирус — мухобойка

Здесь очень много историй про хороших и плохих бухгалтеров, монтажников, программистов, админов, юзеров и начальников. А мне достался главный инженер… Если честно, после каждой планёрки хочется взять тетрадку и записать его перлы и безумные идеи. И этот случай явно займёт достойное место.

Надеюсь, все помнят прикол с мухами на Яндексе первого апреля этого года? С утра пораньше раздаётся звонок с приказом моментально «починить компьютер от вирусов». Бегу через три этажа, вижу на экране рой мух, невозмутимо выбираю мухобойку и ставлю рекорд: десять крылатых за шесть секунд. Сканирование завершено, все угрозы размазаны!

12141

Последняя верста глубинки

26 апреля 2014, 07:12

Кого-то задолбали провайдеры, навязывающие свои услуги, а я этим людям даже немного завидую.

Дело в том, что мой дом находится в недавно построенном коттеджном посёлке. Конечно, тут работает и 3G, и 4G, и мобильники — но всё-таки это не сравнить с быстрым интернетом по оптике или витой паре.

Уважаемые провайдеры! Может быть, вы перестанете задалбывать жителей многоэтажек, тратя миллионы на колл-центры, а вложитесь немного в прокладку «последней мили» в подобные посёлки, которых тут вокруг великое множество? До ближайшего города — прямая видимость и какие-то коммуникации. Наверняка можно либо договориться с энергетиками и кинуть оптику, либо повесить приличные радиомодемы.

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

12140

Сейчас станет горячо

26 апреля 2014, 07:00

Я медленно, бережно достаю из коробки свеженький чёрный корпус. Отделяю пенопласт, отправляю его обратно в коробку, затем нетерпеливо снимаю с корпуса полиэтилен. Подрагивающей в предвкушении рукой откручиваю левую стенку…

Материнка, уже лишённая покровов, лежит на столе. Плавно вставляю в слот двухгигабайтную палку DDR3. Аккуратно снимаю заглушку со слота процессора. Достаю из упаковки новенький Core i3, нежно ставлю его на место и уверенно защёлкиваю фиксатор: сейчас начнётся! Тюбик без опознавательных знаков тонким слоем размазывает по процессору поблёскивающую термопасту, излишки мажу на радиатор кулера. Аккуратно, но уверенно вставляю защёлки кулера в отверстия платы. Кулер закреплён, материнка готова. Я бережно помещаю её в корпус, подрагивающими от волнения руками закручиваю винты. Подключение питания и разъёмов — особое удовольствие. Их много, входят с небольшим усилием, но сидят прекрасно!

Винчестер нехотя позволил себя вкрутить и подключить. Сейчас станет горячо! Подключена периферия и загрузочная флешка. У кнопки питания фантастический звук щелчка.

Тихонько зашуршали кулеры… На мониторе пробежала серая полоска, вспыхнул «витраж», синенький диалог на синем фоне — о да! А пока дистриб распаковывается, можно и покурить… Как же приятно собирать новую машинку, пускай и офисную минималку!

Люди, я нормальный? Это лечится? Или стоит всё же нормальный прон сквозь отвращение смотреть?

12139

А не дурак ли я?

25 апреля 2014, 07:24

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

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

Выбор детерминанта на роль хеш-функции. У меня даже слов не хватает, чтобы выразить всю глупость этого. Во-первых, это очень дорогая в вычислительном плане функция, причём с неприятным ростом количества вычислений от размера матрицы. Лобовая реализация имеет факториальную зависимость, а через метод Гаусса «всего лишь» кубическую. Во-вторых, очень подвержена коллизиям, причём как раз на наиболее вероятных причинах модификации исходной матрицы. Например определитель транспонированной матрицы всегда равен определителю исходной.

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

Незнание об автоматическом приведении типов в используемом языке (скорее всего, C). Функция det() может возвращать значение не double, а более ёмкого типа, который компилятор приводит в double при присвоении в double и, наоборот, до которого расширит double при сравнении. С учётом этого факта никаких странностей в приведённом коде нет вообще — всё вполне логично. Перед тем как кидаться с обвинениями в адрес разработчиков компилятора, стоило открыть определение функции det() и посмотреть на тип результата, потом внимательно почитать описание стандарта языка программирования и сравнить реализацию на соответствие; наконец, почитать описание компилятора на тему особенностей реализации на той или иной аппаратной платформе и возможных отклонений от стандартов.

Морали в этой истории две.

Первая: не выпендривайтесь с применением того, что вы толком не понимаете. Вместо ускорения вы можете получить торможение, а задачу при этом так и не решите.

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

12138

Наше вам с кисточками

25 апреля 2014, 07:12

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

Понимание такой причёски пришло, когда мы выехали устранять последствия КЗ на 10-киловольтной линии. Причины были неясны, на линии пусто и сухо. Зашли в будку, дверь ветром благополучно прикрыло, но мы работаем. Всё проверили, ключ на старт — есть напряжение. Направляемся к выходу — и вдруг ор Андрюхи:

— Стоять, #& вашу мать!

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

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

12137

Без единой царапины

25 апреля 2014, 07:00

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

Как у многих авторов здешних историй, детство у меня было увлекательным и связанным с компьютерами. Ничто не вечно в этом мире, в том числе и мой тогдашний «электронный друг». После поломки «спектрума» и вердикта мастера «восстановлению не подлежит» родители не очень долго думали и подарили один из клонов NES, наводнивших постсоветское пространство. Картриджи к ним были такие же неофициальные. Волею судьбы в одну из игр закрался прекраснейший баг: у персонажа был всего один хит-пойнт. Игра нам безумно нравилась из-за своей активности, частой смены локаций и нарастания сложности. А одна-единственная «жизнь» была невероятной «изюминкой» игры.

Только спустя пять лет, зайдя в гости к кому-то из приятелей, я увидел аналогичный, но только «нормальный» картридж. Приятель и все, кто сидели рядом, никогда не видели такого мастерства в прохождении игры. Мышечная память сработала прекрасно, и я за несколько минут, почти шутя, преодолел все те препятствия, на которые у них уходила неделя.

На застывший в воздухе и всё-таки озвученный позже вопрос: «Чёрт подери, как, как у тебя это получается?! Это же почти невозможно!» я мысленно махнул рукой, попытался что-то невнятно объяснить, а потом просто промолчал.

Спасибо тебе, Bucky O’Hare, за невероятное и безумно весёлое «трудное» детство!


Примечание редакции. Чуть позже автор сообщил, что описанный баг — на самом деле фича. Таким образом разработчики защищали игру от пиратства. Век живи — век учись.