bash.im ithappens.me zadolba.li
9677

Бар «Двойной инкремент»

4 августа 2012, 07:15

Нужно было добавить на одну из страниц проекта счётчик просмотров. Самый-самый простой: если кто-то запросил страницу, то увеличиваем на один предыдущее значение в базе. Но такая простая задача заняла ровно один вечер и одно утро, почти заставив меня поверить в сверхъестественное, прежде чем была реализована.

В качестве библиотеки для общения с базой MySQL на сайте используется библиотека ActiveRecord. Соответственно, весь код составил пару строк:

$faq = Faq::find($id);
$faq->views++;
$faq->save();

Получаем нужную запись, увеличиваем значение поля на единицу и сохраняем.

При тестировании выяснилось, что счётчик посещений при заходе увеличивается не на один, а на два. Перепроверил на всякий случай структуру таблицы в базе данных, попробовал на всякий случай обновить значение другим способом (вдруг ошибка в библиотеке?), погуглил по запросу «activerecord double increment problem» — всё без толку. Не понимая, что может быть не так в коде, ушёл спать, так как обычно это помогает — за ночь мозг переосмысляет проблему и утром выдаёт свежее решение.

Решения утром не оказалось, и я уже был готов поверить в сверхъестественное и выводить количество посещений как значение поля, делённое на два, но в очередной раз перезагружая страницу с этим адским счётчиком, в статусной строке браузера я заметил промелькнувшее на мгновение слово «yandex». Да, я тестировал сайт в Firefox с установленной панелью RDS bar, которая дёргала страницу синхронно со мной, увеличивая счетчик ещё на единицу.

9676

Без трёх одиннадцать

4 августа 2012, 07:15

Работаю админом в госорганизации. Для передачи платёжек и прочего в банк на одном из бухгалтерских компов стоит банк-клиент с круглым зелёно-белым логотипом.

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

Бухгалтер в панике (скоро зарплата и вообще) садится на телефон дозваниваться в техподдержку. Всего есть четыре телефона: тот, откуда звонили первоначально, но «мы ничего не знаем, мы только уведомляем», второй со «скажите ваш номер телефона, я заявку оставлю, вам перезвонят» и два именно техподдержки, но там, как водится, занято или трубку не берут. Принимается волевое решение попробовать снова через часок.

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

В недрах великого Гугла находится непонятно когда и непонятно кем созданная тема, как восстановить пароль. Надо в %foldername% удалить %filename% и заново всех перерегистрировать. Деваться некуда, приступаю. Бэкап, удаление файла, начало новой регистрации. Программа предлагает сразу ввести новый пароль для админа два раза, как водится. Печатаю я вслепую, а тут пароль крипкостойкий, и смотрю я на клавиатуру, поэтому не сразу замечаю, что из 11 вводимых символов в форму добавляется только восемь!

Меня осеняет. Отменяю всё, восстанавливаю из бэкапа файл, ввожу восемь символов нового пароля — получается! То бишь при замене пароля в форму можно вбить только восемь символов, а при авторизации — сколько угодно. Спасибо программистам из банка за два дня нервов.

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

9675

Коричневый картридж

4 августа 2012, 07:15

— Принтер не печатает.

Смотрю — а в принтере застряла шоколадка.

— Как она туда попала?
— Я не знаю, я ничего не делала.

Шоколад по всему принтеру размазан — ролики, валы… Подача бумаги снизу. Это очаровательное создание положило шоколадку на бумажку и послало на печать.

Вспоминаются все фильмы и мульты, где кто-то «случайно» оказывается на конвейере и медленно едет в сторону погибели, пока главный герой меряется писюнами с главным злодеем.

Шоколадку! Одну! Беззащитную! В пекло! Зато в принтере так приятно пахнет…

9674

Ликбез в картинках и стрелках

3 августа 2012, 13:15

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

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

Свою проблему я решил, но грусть никуда не ушла. За всю работу админом компьютерно-несовместимых людей я встречал крайне мало. Остальные были простыми лентяями. Если человек чего-то не знает, но интересуется и хочет научиться, это вызывает у меня восторг, и я потрачу даже личное время, чтобы помочь. Но чаще хочется дать в тыкву, когда очередное чванливое чмо требует, чтобы ты делал его работу.

9673

В дальнее плаванье

3 августа 2012, 13:15

Свой первый системник я собрал в 16 лет из целой горы комплектующих. Отец привёз тогда меня к себе на работу и сказал: «Если соберёшь и сможешь запустить, он твой». Я собрал древнее нечто с процом на 300 МГц и 64 МБ оперативы, шуршащее под 98-й (хотя тогда ХР уже пробралась в массы).

С тех пор прошло много времени. Апгрейд за апгрейдом, я улучшал его настолько, насколько это позволяла древняя материнка. Потом был универ. Много бессонных ночей провёл за классикой конца девяностых — вторыми Diablo и Fallout. А сколько раз комп спасал по учёбе! Друзья ржали, но всё равно удивлялись его живучести и производительности.

А потом родители купили мне ноутбук. Долго уговаривали меня выкинуть этот «трактор» на свалку и удивлялись тому, как рьяно я защищал его до последнего. Три года он простоял на чердаке как памятник игрострою и моим стальным нервам.

Пришло время. Этому динозавру всё-таки нашлось применение. Сегодня я подарил его человеку, который за 50 лет ни разу не пользовался компьютером, но действительно хочет учиться.

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

9672

Двенадцать? Так бы и сказали

3 августа 2012, 07:15

Решил попробовать свежую Microsoft Visual Studio 2012 RC. Фраза во время установки слегка меня подвесила:

На диске 1022 недостаточно места. Освободите C: МБ.

9671

Пляски с бубном под дудку начальства

3 августа 2012, 07:15

Есть у нас на предприятии лазерный принтер формата А3, верой и правдой служащий с конца девяностых. Сам принтер работает без особых глюков, расходники добывать пока удаётся. По нелепому стечению обстоятельств аппарату не хватало одной буквы в конце названия, чтобы иметь свой собственный Ethernet-порт, а поддержка сети ему жизненно необходима ввиду очень разношёрстного и склочного коллектива отдела, в котором он эксплуатируется. Вовремя нужный модуль расширения купить не успели, аппаратные принт-серверы тогда стоили дюже дорого. В результате аппарат оказался подключён к скромному Pentium-233, который в течение какого то времени исполнял роль общественной печатной машинки, а затем был вообще заброшен. Работал комп под управлением Win98, но так как полноценно его никто не использовал, в IT-отдел он попадал только во время эпидемий сетевых червей.

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

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

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

Я отыскал микродистрибутив, занимающий в минимальной конфигурации под 20 МБ, но при этом с полноценной поддержкой сети и возможностью прикрутить CUPS. Установленная система на диске держала только папку BOOT и два архива: в первом корневая файловая система, во втором опциональные модули и файлы настроек. Такая конфигурация позволяла монтировать жёсткий диск только на чтение, следовательно, при аварийном завершении работы ничего страшного не происходило.

На виртуальной машине всё отработало как по учебнику, но установка на реальную машину оказалась делом куда более интересным. Сначала я опробовал штатный способ установки. Созданный раздел оказался повреждён и не подлежал восстановлению, загрузчик не установился. Создал разделы вручную и подсунул их инсталлятору — результат был аналогичен предыдущей попытке. Оказалось, что на реальной древней машине инсталляционный скрипт криво создаёт разделы, а при установке загрузчика в MBR убивает даже те, что есть. На более современном компьютере с тем же винтом всё устанавливалось без единого косяка, из чего я сделал вывод: инсталляционный скрипт считает, что любая машина обязана понимать, что такое LBA32, а BIOS материнки искренне думает, что LBA28 (а может, и что подревнее) — до сих пор самый модный метод адресации.

Уменьшение размеров загрузочного раздела до 50 МБ ситуацию не облегчало. Возня с мануалами ни к чему не привела. Способ объяснить загрузчику метод адресации явно существовал, но за давностью лет упоминаний о нём было мало. В конце концов я нашёл другое решение: поставить на машину полноценный дистрибутив линукса, который точно работает на подобных материнках, подсадить к нему в конфигурацию загрузки файлы микродистрибутива, а потом удалить всё лишнее.

Инсталляционный скрипт полноценного дистрибутива подтвердил, что BIOS, несмотря на обновление до последней версии, дико крив, и для установки загрузчика будет использован какой то очень коварный метод. По завершении всех манипуляций я больше удивился не тому, что всё загрузилось, а тому, что двухгиговый винт начал определятся в BIOS (причём на любой машине) как 524-метровый, причём после загрузки системы оказывалось, что реальная ёмкость диска всё-таки 2 ГБ.

Обрадованный победой, закинул на место подготовленные конфиги и стал пытаться достучаться до CUPS по сети. Интерфейс оказался недоступен, в списке процессов соответствующего демона не наблюдалось, в логах ошибок ничего подозрительного не нашлось. Как только винт был переставлен обратно на более свежую машину, CUPS запустился. Оказалось, создатели этого чудо-дистрибутива затолкали в него самую распоследнюю версию CUPS, да ещё и откомпилированную под 686 архитектуру. Зачем в микродистрибутив пихать модуль, минимальные требования которого серьёзно круче всего остального хозяйства, для меня до сих пор загадка.

Разбираться, как собирать опциональные модули для этого микрочуда, было уже выше моих сил. В куче хлама отрыл AT-материнку под Pentium II и соответствующий процессор. Вся возня с загрузчиком оказалась напрасной: на эту мать всё встало без особых проблем.

Но это был не конец приключений. CUPS не имел встроенных драйверов на нужный принтер, а значит, нужно было искать подходящий PPD-файл. На сайте изготовителя принтера рекомендовалось взять его из виндовых драйверов PostScript. Файл быстро нашёлся, однако CUPS заявил о том, что не может его использовать по непонятным причинам. Правильным решением оказалось взять этот файл из драйверов под Mac OS.

Итогом всей этой возни стало вполне работающее решение, используемое уже несколько месяцев. Оплата моего потраченного рабочего времени обошлась куда дороже покупки готового принт-сервера, но начальству виднее.

9670

Когда кактус не справляется

3 августа 2012, 07:15

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

Комп я наладил и, улучив минутку, спросил у буха: «Чё это?» Выяснилось, что кассир таким образом предохранялась от компьютерной радиации.

9669

Ну, удивись!

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

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

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

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