Истории с тегом: программизмы

Всего историй: 897

5285

Аргумент с потолка

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

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

for i:=0 to n do

if i<>0 do ...

Да, начать с единицы цикл, видимо, религия не позволила.

function f1(x: real) /* Первая производная функции */

function f2() /* Вторая производная функции */

Гениально! Второй производной аргумент, оказывается, не нужен. Оказалось, он берётся из глобальной производной, объявленной где-то наверху. Хорошо, не из массива с элементами [1, 2, 3, ...] — хотя это я тоже когда-то встречал.

while(iterations < 1000)

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

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

5264

Скайнет шлёт привет

Работаю программистом в НИИ. Разрабатываем сложную распределённую систему для спецнужд. Проект лежит на SVN-сервере, всё по уму. Коллега апдейтит транк, чекает обратно, начинает собирать проект. Через какое-то время:

— Ребята, мне кажется, мы написали что-то стоящее!

Подходим посмотреть. В консоли красуется ошибка сборки: «Не могу собрать, так как исходный код был изменён в будущем».

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

5232

Чтоб админ не заскучал

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

Каждый банк лепит свой клиент в меру собственного недоразумения. Одному нужен локальный мейл-сервер. Второй требует, чтобы в Internet Explorer в качестве прокси стоял локальный порт, на котором банк-клиент слушает. Третьему — открытый локально 110-й порт. Четвёртый написан на древней версии .NET и с другими работать отказывается. Об уровне техподдержки этих систем и говорить стыдно.

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

5230

Полегче с травкой

Пишем программу. Естественный отбор. Ползают хищники, травоядные, травка вырастает периодически. Хищники для размножения должны съесть немного травоядных, травоядные — немного травки. Размножиться — отложить яйцо, которое породит трёх существ твоего вида. Травка — от бога. Всё живет, развивается, естественный баланс между количеством травоядных и хищников поддерживается, количество травы влияет на размер популяции, преподаватель доволен, студенты горды.

Сдача проекта. Результаты живут и развиваются на большом экране за спиной докладчика. Размер поля и количество травы выбраны так, чтобы было и интересно, и без тормозов. Писалось на «жабе», так что тормозить начинало быстро, особенно на выданном ноуте с Вистой. Короче, поле получилось небольшое, и естественные флуктуации размера популяции стали сравнимы с самим размером. Хищники побеждают; после лакомства последним представителем травоядных они, конечно же, вскоре благополучно дохнут с голода.

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

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

5187

Пусть будет при мне

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

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

— А зачем мне этот лишний геморрой? Я лучше в документации напишу, что региональному администратору клиента при инсталляции ПО нужно перенаправить поток с локалхоста на требуемый сервер.

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

5147

Сгодился бы и Бейсик

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

А мануал был по Яве. Не пойму, за что её так ненавидят программисты?

5142

Кьюти-пути

Профессиональная деформация личности? Элементарно, Ватсон!

Заметил, что IT happens и «Башорг» я читаю с каменным выражением лица, лишь изредка улыбаясь, зато над документацией по библиотеке Qt смеюсь не переставая. Что самое печальное — я не знаю, что в ней такого смешного!

5126

Re: Требую запасной PgDn

Админ сайта, который я поддерживаю, решил сделать рассылку новогодних поздравлений всем пользователям. CMS сайта самописная.

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

Я поглядел код, разобрался, добавил одну строчку:

$Data['message'] = nl2br($Data['message']);

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

Так и есть: в спешке я добавил эту строчку в цикл по пользователям. Желаю, чтобы в 2011 году в жизни каждого человека было меньше пробелов!

5119

Пусть будет

Копался в скриптах игры «DCS: Ка-50 Чёрная Акула», чтобы настроить вывод картинки на два монитора, и напоролся на такой отрывок в скрипте ночного видения:

dcl_2d s0 ;diffuse map

dcl_2d s1 ;noise mask

dcl_2d s2 ;main mask

dcl_2d s3 ;mask (HZ nahua nuzhna)

Так у нас всё и делается.

5083

И ещё немножечко шьёт

Явление первое. Я и клиент.

— Сделаете репорт к веб-шопу в формате CSV?

— Сделаю.

Явление второе. Я и секретарша клиента.

— У меня для вас две новости: хорошая и плохая. Хорошая: ваш репорт работает. Плохая: все заказы изменили статус.

Как же ж так, что ж такое?.. Ведь писал только репорт, в нём ни одного запроса на изменение, исключительно выборка. Ещё раз проверяю свой скрипт. Опрашиваю секретаршу на предмет манипуляций с БД другими сотрудниками. В итоге вспоминаю: для лучшего понимания процедуры я запустил другой репорт в формате XML, написанный моим предшественником. Оказывается, этот репорт заодно меняет статус заказов...

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