bash.im ithappens.me zadolba.li

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

5779

КО-инициализация

Много раз слышал об индийском коде типа a = a. Смеялся, пока самому не пришлось в яваскрипте написать:

document.domain = document.domain;

Без этого дочернее окно никак не хотело видеть window.opener ни в одном браузере. Может, индусы так пишут не от хорошей жизни?

5765

0xFFFF по-майянски

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

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

Я не удивился, что HTML-код страницы содержал пару закомментированных SQL-запросов.

Я не удивился, что в дате доставки можно было указать 31 июня.

Но вот выбор года был очарователен в своей бесстыдности. Два радиобаттона: «2011» и «2012». Похоже, автор надеялся, что к 2013 году или ишак сдохнет, или султан помрёт.

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

5757

Кроссплатформенный геморрой

Довелось мне купить Zii EGG. Всё в девайсе было хорошо, да только старая прошивка мне не нравилась.

Казалось бы, что может быть проще? Сходил на официальный сайт, скачал программу (благо и виндовые, и линуксовые версии есть) и запустил. Ха! Начнём с того, что последняя свежая версия пахнет гнилью — 04.08.2010. А та, что за 23.10.2010 — это так, старьё, которое, видимо, в качестве дани истории решили приложить.

Литр кофе выпит — разобрался. Скачал всё. Пошёл второй литр. Линуксовая версия сразу отказалась ставиться — нужна какая-то библиотека. Оказалось, что пакет плохо написан, и моя верная Убунту не даст дураку чудить. Не беда: ковыряемся, ищем ошибку, исправляем, ставим. Они не понимают «д», «да», «y» как подтверждение лицензии, даже «yes» не подходит — им только «Yes» подавай. Ладно, вроде осилил, но хренушки: девайс всё так же не виден.

Пробуем «оконную» версию. Просит бибилиотеку. Точнее, не просит — просто вылетает, а что просит, это я уже потом из манов узнал. Хорошо, идём на сайт, качаем библиотеку. Библиотека — только для линукса, который, если верить манам, в этой библиотеке вообще не нуждается. Сдаюсь, думаю.

Третий литр кофе налит в чашечки и греется в ожидании расправы. Библиотека поставлена, программа-апдейтер от «окон» замочена в Wine — и понеслась! Софтина запустилась, девайс нашла, предложила обновить, скачала файлы и вылетела с ошибкой: «У вас подключено более одного Android-девайса».

Тут-то я и сдался. Буду ждать новых версий и расскажу о том, что накурят индусы.

5706

В глубоком табе

Знаете, коллеги, я убедился, что университет с мировым именем — не гарантия, что вас не научат индийскому программированию.

Сдаю в бумажном виде госы.

— И где же у вас здесь протокол SMTP?
— Вот это всё — реализация. Вот список команд, вот список кодов ответов…
— Так, где создаётся сокет?

Тыкаю пальцем: server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

— Та-а-ак! Но у вас же здесь TCP!
— Правильно. SMTP — протокол слоя приложения. А при создании сокета указывается транспортный.
— А как тогда отличить, что ваша программа работает про протоколу SMTP? Где это написано?
— По структуре заголовка пакета — никак. По порту разве что.

Показываю на строчку: addr.sin_port = htons(IPPORT_SMTP);

— О! Так вот эта константа. Но она должна быть в протоколе.
— Нет, она должна быть здесь. Даже по имени константы видно, что в протокол она не лезет. Давайте покажу на практике, попробуем подставить эту константу туда и запустить — получим INVALID_SOCKET.
— Так! Что ты тут со мной споришь? В книге было написано, что должен быть IPPORT_SMTP, и прилагались рабочие примеры!
— Покажите, пожалуйста.
— Нету, книга в библиотеке.
— Тогда давайте сейчас покажу на практике, — поворачиваюсь к ближайшей машине, — что моя программа работает. Заодно попробуем туда подставить этот IPPORT…
— Так, иди переделывай.

Позже дома проверил — действительно, сокет не создаётся, если подставить туда любую константу портов. Повторная попытка доказать это провалилась. Пришлось в глубоком табе писать: #define IPPROTO_SMTP IPPROTO_TCP.

5664

Как икс на душу положит

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

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

Program Example;
var a, b, c, x, d: integer;
y: real;
begin
Randomize;

После этого слова проверять не стал — cразу двойку влепил. Cтрашно за будущее IT.

5592

Гифка на гиг

Понадобился как-то автоматический распознаватель текста для перевода DjVu в DOC. Погуглил, нашёл бесплатный конвертер. Запускаю. Программа поскрипела и отрапортовала о готовности. Открываю документ и делаю большие глаза: этот хитросделанный «распознаватель» скопировал в файл страницы DjVu в виде изображений, а распознавать текст и не подумал. Страниц оказалось почему-то всего пять штук. Минуты три я любовался на это творение, потом закрыл документ — и едва не свалился со стула. Cозданный файл весил более 500 МБ. Как можно было заставить программу придать одному монохромному изображению вес под 100 МБ — загадка для меня до сих пор.

Хочется передать автору этого чудо-конвертера пламенный привет и поинтересоваться: чего ж всего пять страниц обрабатывается? Как было бы круто заиметь себе, скажем, мануал по ассемблеру гигабайтов эдак на десять! Я не пожалел бы дискового пространства, чтобы увидеть глаза тех, кому покажут такой мануал. А программа эта у меня так и лежит в отдельной папочке в качестве яркого образца программерской криворукости.

5498

Цифра в боксе, плюс в уме

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

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

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

Ой! Пользователь нажал кнопку! Так, счётчик у нас ноль, смотрим нулевой символ… Ага, единичка. Ничего делать не буду, но счётчик плюсану. Ай! Опять кнопку нажали. Ладно, надо свои ватты отрабатывать. Счётчик — единица, и под номером один у нас… ага, плюсик. Мы его из текстбокса убираем. Вай, что это — опять событие Change! Я же и то не закончил! Ладно, справлюсь, у меня оперативки много. Что, опять проверять текстбокс? Ладно. Счётчик — единица. Что? Да нету здесь символа с таким номером! Идите вы все…

5495

Простите мой индийский

Был посажен писать программку на ABAP/4. Как программист я себя не позиционировал. С языком знаком был на уровне «прочитал пару чужих кодов». Опрос коллег показал: подобного ничего не делали. Вариант обточить чужое не катил.

Полтора месяца глупых вопросов, чтения, медитаций — и что-то готово. Рядом с заголовком я оставил комментарий:

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

В том же месяце я занялся йогой. Это как-то связано?

5460

Не знаю пароль, но вижу ориентир

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

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

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

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

a := Canvas.Pixels[n-10,k-10];
if TColor(a) = clRed then begin otvet := … end else otvet := …

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

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