bash.im ithappens.me zadolba.li

Программизмы

173

Меню, постой, не уходи!

Вот вы говорите, циклы забыли закрыть, и монстры убитые поползли за вами. А с нами такой случай был. Работали над русской компьютерной игрой, навроде Аллодов. Занимались компьютерным интеллектом на тот момент.

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

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

172

Исправление

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

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

И только позже (до сих пор не знаю как) выяснилось, что "пропал интернет" - это означает, что у клиента не открывалась страничка их сайта. Поскольку я при копировании затерла файл движка.

Пришлось изображать кота из второй части Шрека.

170

Победа или смерть!

Смотрю исходник лабораторной работы по математическим моделям, сделанной одним из студентов. Обнаруживаю такие комментарии:

{Дальше идет особая магия!}
procedure fbHalfCountClick(Sender: TObject); //Считать методом половинного деления
procedure fbSerialCountClick(Sender: TObject); //Считать методом последовательных приближений
procedure fbNewtonCountClick(Sender: TObject); //Считать меня коммунистом

169

С точностью до миллиметра!

Только что закончил правку javascript-файла. Делал это "по-быстренькому", то есть прямо на сервере. Правил редактором mcedit (он умеет работать с файлами по ftp). Часа через 3 добился нужного результата. Пора возвращать файл на историческую родину, то есть на локальную машину.

Жму F5 в mc (в одной панели - локальный каталог, в другой - ftp). Вылезает вопрос "Заменить файл ${FILENAME} размером 3096 на файл размером 3096?". Это что же такое? Правил, правил и где результат? Даты, правда, отличаются, и все-таки стало как-то неуютно. Стал проверять, выяснилось, что действительно, после нескольких часов правки, многочисленных убавлений и добавлений размер файла стал таким же, как до ее начала с точностью до байта.

157

Распознавание образов

Велик и могуч Русский Язык!

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

Но ведь у нас как всегда все иначе, у нас есть падежи, склонения, спряжения, окончания, рода, а поэтому простое слово "трансклюкатор" может иметь множество форм, включая "трансклюкаторное оборудование".

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

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

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

Осталось только слов побольше туда набить. Посадил ЭТО на сервер, читать книги из библиотеки Мошкова. Пусть набирается ума-разума.

Чувствую, следующим шагом научу его пользоваться Гуглом...

156

Порождение изначального хаоса

Занимался я пару лет назад поддержкой одной CMS, написанной на PHP в течении лет 4-5 несколькими сменявшими один другого программистами.

CMS платная, исходники сначала никому не давали. А потом в один прекрасный момент гендиректор почему-то стал относиться к раздаче исходников совершенно спокойно. "С энкодером проблемы? Высылай как есть, ничего страшного". На мой вопрос о том, что случилось, ответом было имя одного файла и предложение заглянуть.

Посмотрел. Файл по сути является ядром CMS - принимает данные от пользователя из админской части, хитро распихивает их по куче XML-файлов и просто текстовых файлов, что-то кладет в реляционную базу, предварительно проверив права доступа и так далее. Взгляд останавливается на 4х строках:

// TODO: фигня какая-то написана
$respondent = $respondent;
global $preLoadExternals;
$preLoadExternals = .....;

Комментарий имеет логический смысл. Первая строка - чтоб точно запомнил, да. Вторая - оно и так исполнялось только в global scope. Третья - строка длиной в пару килобайт с несколькими закрывающимися скобками в конце, после чего $preLoadExternals далее в скрипте нигде не используется.

И такой фигни на три тысячи строк

Да, действительно. Стоит ли бояться, что исходники попадут в чужие руки, если сами разобраться не можем.

148

Брутальный оскал декора

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

Написал, и не удержался, чтобы не встроить туда "пасхальное яйцо". К сожалению, вызывалось оно не очень сложным образом - [Ctrl]+[клик-куда-то].

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

Так в тираж и запустили.

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

Сказали клиенту, что уже продали. Мол, один экземпляр был. Расстроился, бедняга.

139

Некруглое число

Разговор со знакомым:
- Тебе говорит о чем-нибудь число 32 767?
- Ну конечно )
- А нашим программистам нет.
- ?
- У них на заводе линия останавливается. Они говорят, что номер заказа доходит до определённого числа и больше не работает. Ну я им говорю, посмотрите, может число какое-нибудь круглое... Да нет, говорят, 32 767.

Ну да, действительно, некруглое!

138

Последняя ошибка

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

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

На следующее утро я еле успеваю дойти до кофейного автомата, как на меня бежит сам генеральный с бешеными глазами навыкате, и по ходу бега орёт благим матом что-то типа "Да я вас, всех ***, *** так, что вы у меня в *** улетите, что вы наделали, ***!!!".

На вопрос, что же случилось, хватает за руку и тащит к компьютеру. Открывает давеча отредактированный напарником проект, открытый и официально анонсированный в сети и тычет пальцем, а там... там логин и пароль администратора домена (а это - доступ к 13 локальным серверам и 10 удалённым в регионах, доступ ко всем админкам интранета - щёлкнуло у меня в мозгу), в коде ошибки framework`a. В двух других им редактированным проектах такая-же фигня.

Оказалось, что этому герою ничего лучше не пришло в голову, как включить в web.config строчку <identity impersonate="true" userName="****\***" password="*******" />, для того чтобы писать в файлы на сервере, и при этом он умудрился сделать ошибку в написании домена, что и вызвало ошибку. Вывод ошибок он, конечно же, не закрыл.

Возвращения напарника из отпуска мы все ждали с нетерпением.

Люди - если ваша программа компилируется, это не значит что она работает!