bash.im ithappens.me zadolba.li

Индийский код

12412

Сто первая ненормальная

На IT happens было: «Преподавательница реляционных баз данных, при мне объяснявшая студенту, что таблица, распечатанная им непосредственно из Access, ну никоим образом не находится в первой нормальной форме».

Не буду спорить, насколько плоха преподавательница. Но разве таблица из СУБД может быть не в 1NF? Оказывается, может. И я это видел в живом проекте.

Большая американская сеть магазинов одежды. В магазинах есть отделы (три наименования). Любитель нормализации сделал бы список отделов и таблицу-связку. Пофигист обошёлся бы тремя полями: has_kids, has_plus, has_shoes. Эти сделали набор отделов строчкой: «Kids, Plus, Shoes».

12049

Яркие краски в унылой консольке

Сижу на проекте коллеги. Вот несколько правил, которыми он руководствовался.

Если используете AJAX, никогда не забывайте формировать весь HTML и все биндинги на стороне сервера. Зачем передавать данные, если можно передать HTML?

Чтобы удобнее, например, реализовать галерею, сразу сформируйте HTML с инлайновыми джаваскриптовыми функциями goNext(), goBack(), closeGallery(). Куда же положить эти функции? Конечно ж, в глобал скоуп. «А что вообще можно класть в глобал скоуп?» — спросите вы. Конечно, всё. Всё, всё, всё и ещё раз всё. Зачем загружать себя модулями, низкой связанностью? Это всё брехня бюрократов и неталантливых сыщиков. Вообще все функции и переменные положим в один файл, чтобы «удобно» там было потом найти что-то. И вообще, классно ведь — один файл вместо тысячи, правда?

Для повышения крутости в инлайн-JS в HTML можно добавить несколькострочный код, что-нибудь из jQuery тоже пойдёт. Например, по DOM’у шариться через инлайн-JS — просто сказка!

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

Насчёт красных строчек: это же классно! Зачем делать мир чёрно-белым? Красные сообщения в консоли — это же прелесть, это красиво и разнообразно. Они никак не свидетельствуют о том, что что-то может идти не так. Они, как цветы на полянке в лесу, лишь украшают унылую консольку.

И напоследок: зачем использовать объекты JS? Всё же прекрасно хранится в дивах. HTML — это ж XML, так что вполне сойдёт для хранения данных. Просто ставишь display: none — и делов-то!

12043

Индуса среди бюргеров не спрятать

Понадобилось нам как-то раз поддерживать немецкий сайт по продаже недвижимости на TYPO3. Модули много кто там писал до нас. Позднее заказчик перенёс сайт на другой хостинг, и в админке перестал работать импорт новых позиций.

Импорт работал так. Заказчик специальной прогой формировал XML-файл с инфой для импорта в базу и папки с картинками, всё автоматически паковалось в ZIP и заливалось на сайт в папку import. В админке надо было открыть страницу со списком файлов в каталоге import и нажать одноимённую кнопку.

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

Модуль работал так. Открывалось FTP-соединение с этим же сервером, FTP-функциями PHP скрипт залезал в каталог import (в соседнюю папку), распаковывал архив и парой запросов заливал в базу. Повторюсь: скрипт работал с соседней папкой через FTP. Логин и пасс были напрямую прописаны в коде, в функции соединения.

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

Утром я не могу зайти по FTP и в хост-панель сайта. Днём в сети появляется человек заказчика и рассказывает следующую историю.

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

11996

Яйцо в утке, утка в зайце, заяц в шоке

Вроде бы совершенно ординарная задача: ноут, в который воткнуты SSD от компании, делавшей когда-то самые хорошие CD-ROM’ы, и хард на 500 гигов. Надо обновить прошивку на SSD. Иду на сайт за обновлением прошивки. Оно предлагается исключительно в виде ISO-образа для записи на CD. Блин, какой сейчас век?

Конечно же, привода в ноуте нет и не было — ноут новый, хороший и тонкий. Беру флешку. Образ вроде линуксовый, втыкаю его туда посредством YUMI. Не грузится.

После десяти минут бесплодных попыток скормить загрузчику разные параметры плюю на всё и нахожу в запасах USB-сидюк. Грузится, InitDisk… Висим. Наглухо.

Пробую поиграть в BIOS с AHCI/Legacy. Всё равно висим.

Пробую потыкать сидюк по разным USB-портам. В качестве награды получаю уже не просто вис на «InitDisk», а «InitDisk. Invalid Opcode at %много цифр%».

Думаю уже разобрать ноут и вытащить SSD, но вспоминаю, как делал это однажды. Много-много нежных защёлок, которые так легко ломаются…

В интернетах — молчанье. Сталкивались, но не победили.

Плюю на всё. Лезу в образ сидюка и разбираю его. Фанфары, барабанная дробь! В образе — загрузчик ISOLINUX, обкорнанный в ноль. Его задача — сэмулировать флоппи-дисковод через RAM-диск (!), развернуть на него образ дискеты в FAT12 (!!) и загрузить FreeDOS (!!!), который сидит в этом образе… Странно, и чегой-то InitDisk с ума сходил?

Вытаскиваю образ дискеты из образа сидюка. Разбираю его на файлы, копирую autoexec/config, прошивальщик и прошивку на первый попавшийся загрузочный флешак с FreeDOS. Убираю из autoexec’а пару лишних теперь строк. Две минуты… И SSD с новой прошивкой.

Нет, я ни на что не жалуюсь. Скажите мне только: чем руководствовался человек, собирая эту «кощееву смерть»?

11872

Адекватный друг и абсолютный глюк

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

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

Была у нас Очень Специфическая Прога для Очень Специфических Расчётов Очень Специфической Фигни. Редко о таких программах пишут в радужных тонах, но эта поделка с дистрибом в три гига и требованиями к свободному пространству в 27 гигов была абсолютным глюком, не иначе.

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

Но и после успешной установки радоваться было ещё рано. Программа реально запускалась с пятого-седьмого раза, и это в лучшем случае. Во время работы тупила, вываливала кучу эрроров и отваливалась раз в 15–20 минут. Добрую треть настроек приходилось вручную прописывать в реестре, INI-, XML-файлах и ещё хрен весть где. Программа их просто не запоминала.

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

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

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

Что потом случилось с Васей, я не в курсе, равно как и не знаю, были ли ещё жертвы. Но одно я запомнил точно: слава небесам, Вася не знал, где живут разрабы, и слава им же, он не вспомнил о моём существовании (я сидел за соседним компом).

11867

Сын женщины и юрлица

Собрал в свободное время небольшую коллекцию приколов со своей работы.

Задание — добавить пункт: «Нужна ли вам рассылка?». Три варианта ответов: «да», «нет», «совсем не нужна». Оказалось, различие между последними двумя в дополнительных типах уведомлений.

* * *

— Почему база висит? SELECT … FROM … Чей это запрос может быть?

— Это, наверно, Лена.

— Я её прибью! Вернее, процесс её прибью.

* * *

Приняли нового человека. Ну вот как так можно написать:

$month_id = array(1, 2, 3, … 12);
$month_name = array('Январь', 'Февраль', …);

Да-да, потом идёт foreach($month_id as $n) и обращение к $month_name[$n-1].

* * *

В середине выполнения программы:

$_POST = array(…);

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

* * *

> SELECT DISTINCT gender FROM clients;
Found rows: 150

В том числе «8912», «Зао"Урал», «хозяйка», «юр.лицо».

* * *

Номер недели в году. Этого я вообще не ожидал:

> SELECT DISTINCT publish_week FROM table;
Found rows: 88

11734

Йух-23, моё альтер-эго

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

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

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

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

Нажимаю «Оформить заказ». Вижу список мест, итоговую сумму, но теперь нигде не написаны ни дата, ни время, ни название концерта. Перекрестившись, указываю свои контакты и нажимаю «Подтвердить».

Итак, у меня есть корзина с билетами и открывшееся окошко «Личный кабинет — изменение данных» с заполненными полями контактов, заполненным полем логина «as;iUh23» и пустыми полями для пароля. Меняю логин на Ivanoff, задаю пароль, подтверждаю пароль и… попадаю в свой личный кабинет с пустой корзиной. Телепатическим образом понимаю, что корзина кабинета Ivanoff пуста, потому что он ничего не заказывал. А заказывал билеты тот самый as;iUh23, но я не знаю его пароля.

Лезу в почту. Вижу два письма о создании двух кабинетов: as;iUh23, а потом Ivanoff. С паролями. Радостно пытаюсь зайти в личный кабинет as;iUh23, указывая присланный пароль. Неудача. Комментарий: «Пользователь as;iUh23 указал e-mail, который уже используется другим пользователем».

Закрываю страничку интернет-кассы, открываю IT happens.

11725

Семеро на одного

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

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

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

Программа планируется мультиклиентская, и к одному и тому же файлу базы данных может одновременно подключаться любое количество клиентов. Зову тимлида, демонстрирую, объясняю, что, как и почему.

Спустя ещё два месяца наконец-то сделали отдельный поток загрузки данных и отдельный — под интерфейс. В конце попросил у тимлида карту потоков. Оказалось, её нет. Смотрю на дату — да нет, конец 2013-го, не ошибся. А он до сих строит однопоточные приложения…

11582

Индия течёт в наших венах

Нужно было немного обновить свою мультизагрузочную флешку. Заодно решил отказаться от GRUB ещё первой версии и перейти на вторую. На форуме мне посоветовали программу multisystem, сделанную как раз под Ubuntu. Ладно, раз советуют — надо проверить.

Захожу на сайт. Английской версии нет; сайт, судя по языку и физическому расположению сервера (домен в зоне .info), французский. Ладно, найти слово «installation» не проблема даже во французском языке. Прочитал, подключил репозиторий, установил для начала на нетбуке. Программа запускается, но мою флешку в упор не видит. Я ещё работаю, на компе нужна винда, перегрузиться не могу — хотя работы немного, но надо быть на связи.

Вспоминаю, что у меня в VirtualBox тоже есть Ubuntu. Загружаюсь, ставлю дополнения гостевой ОС, пробрасываю флешку напрямую. Работает. Понимая, что такой способ — извращение, решаю попробовать после работы всё же непосредственно на компе.

Дожидаюсь конца работы, пробую. А фиг-то: система флешку видит, но программа её не признает. Флешка обычная, Transcend, точно рабочая, да и операционка её определила. Ладно, VirtualBox здесь… Из приличных слов остаются только предлоги.

Результат: пока я пишу это, наблюдаю, как копируются файлы на флешку, а в голове рождается краткая характеристика автора программы:

По родителям француз,
А по факту я — индус,
И уже который год
Я пишу индусский код.