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

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

4812

Скан с улыбкой

Потребовалось реализовать через нашу программу сканирование документов для их последующей отправки в архив. По требованиям заказчиков сделали одну большую кнопку «Сканировать».

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

4811

Показательная порка цифровых мародёров

Пожалуй, мало кто из относящих себя к IT не слышал о PHP. Лёгкость в освоении и способность прощать некритические ошибки сыграла с этим языком (или интерпретатором, как хотите) злую шутку: теперь все, кто смог написать «Hello World», могут гордо именовать себя Программистами, хотя и до кодеров им далеко. Вот и у нас в конторе есть такие экземпляры, обслуживающие корпоративный сайт-портал и несколько внутренних БД с веб-мордами. Итак, «вредные советы».

Локальная среда разработки Apache + MySQL + PHP для тестирования скриптов — излишество. Открываем файл прямо на FTP, редактируем, сохраняем. Если в код закралась ошибка, её будет видно. Всем и сразу. Подумаешь, несчастье: «HTTP 500» или «call to undefined function» посреди рабочего процесса у двадцати человек одновременно.

Базы данных и таблицы в них создаются в очень интересных комбинациях кодировок: MySQL запущен в Latin1, БД — в UTF-8, в которой таблица в CP1251, в которой поля в UTF-8 (как?!) хранят тексты опять же в CP1251. При этом взывающий к данным скрипт содержит ряд конструкций по конвертированию из одной кодировки в другую. Воркэраунд, блин.

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

Входная дверь, то бишь авторизация на корпоративном сайте-портале (который одним портом смотрит в интернет) — отдельная песня. Пользователь авторизуется на контроллере домена, при этом ни имя, ни пароль не проходят ни «очистку», ни, на худой конец, проверку на длину. Ну да, уязвимость, но ведь никто ж не догадается! Регулярные выражения? Вы сейчас с кем разговаривали?

Если вдруг вам понадобится логин авторизовавшегося пользователя перевести в человекопонятное ФИО, то запрашивайте у контроллера домена подробную информацию сразу обо всех пользователях, включая все атрибуты. Подумаешь, надо распарсить массив на мегабайт-другой, — сервер не обеднеет! То, что у пользователей меняются атрибуты примерно каждое никогда, а количество изменяется от силы раз в месяц, навело бы на мысль о кешировании готового массива, но тут ведь думать надо. Но есть же сервер с гигом памяти — вот он пусть и думает, у него мозгов больше.

Разбирая вышеописанный массив, можно не заботиться о том, что индексом служит переменная, которая может быть NULL. Был бы C или какой другой язык — «access violation» или «index out of bound» гарантирован, но PHP это прощает, хотя и генерирует ошибку типа E_NOTICE: мол, обратите внимание. Отключаем показ ошибок — делов-то!

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

4805

Во все дыры

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

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

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

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

4796

Сортировка шатдауном

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

Момент сдачи. Первый метод отрабатывает без проблем, приходит время запускать второй. Я начинаю мямлить, что, дескать, не полностью разобрался, и метод не совсем работает. Преподаватель отрезает: «Запускайте!»

Нажимаю Ctrl+F9. Во всём здании института гаснет свет, компьютер издаёт затухающий звук останавливающегося винчестера, а преподаватель ставит «отлично» со словами: «Ну вы и написали программу!»

4783

Верность идеалам поколения

Сегодня участвовал в олимпиаде по программированию. На входе встретили, проводили.

— Какой язык?

— С++.

— А у нас такого нет.

Предложили Бейсик и Паскаль — но они же инвалиды, в современном-то понимании...

Три часа я писал код в Блокноте. Застрелиться: компиляция в уме, старательно вспоминаем параметры функций, море фигурных скобок... Оп-ля: кусок кода, который должен работать. Подходили поинтересоваться многие:

— Так это ж С! А компилятора нету!

Ой, правда? А я в Блокноте собрался компилировать, ага. С трепетом жду результатов...

4770

Will replace with a very small script!

...жара разъела мозг и делать ничего не хочется...

Задача: набрать и распечатать более девяти тысяч (на самом деле, около сорока) грамот с одинаковым текстом, но разными Ф.И.О. Сидеть и копипастить как-то лениво. Ни Visual Basic, ни Access никто не знает.

Создается одна грамота в .docx, файл переименовывается в .zip и распаковывается в папку, папка заливается на сервак с линуксом.

Далее перловый скрипт подставляет фамилии из текстового файла в определённые места в .xml, на выходе готовый .xml со всеми фамилиями подсовывается вместо .xml в папку с начинкой распотрошенного .docx, пакуется зипом!, переименовывается в .docx!, печатается!

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

...жара разъела мозг и делать ничего не хочется...

4757

Переписка по боксу

Общение txt-файлами в Дропбоксе? Берите выше! Недавно всей академической группой мы открыли для себя этот чудесный сервис и сразу же создали общую папку для одногруппников — ну, лабы, курсовые, электронные варианты конспектов. Тут же (это, наверное, у всех пользователей Дропбокса случается) появился текстовый файл с чатиком, но душа будущего системного инженера требовала пива и оптимизации.

Открываем Дельфи, создаём на форме два текстовых поля на никнейм и текст сообщения, объект TMemo, который по таймеру с периодом в секунду обновляем из этого же текстового файла, и кнопочку «Отправить», которая пишет в конец файла новое сообщение с ником автора. Двадцать минут — и готов вполне себе рабочий чатик. Сбои случаются, лишь когда два человека одновременно отправляют сообщение, — но это уже проблемы не программы, а процедуры сохранения на сервер Дропбокса. Уведомления о новых сообщениях? А об этом сам Дропбокс заботится, ведь при пересохранении файла любым юзером у всех остальных всплывает сообщение. Теперь вроде бы удобнее; надо только следить за размером файла истории. Душа успокоилась. Изобретать свой велосипед с го и гейшами — это же так приятно!

4747

В большом городе герконом не щёлкают

1989 год, четыре ленинградских «Спектрума» (железные корпуса, герконовые клавиши), четыре советских цветных телевизора, магнитофон «Весна». Практически всегда — аншлаг. В разгар рубилова я зевнул, и кто–то из трудных сп#$%ил единственную кассету с играми. Оставив хозяйство на доверенных, я отправился в забег по конкурентам. Конкуренты кривились и морщились, но отслюнявили пару кассет чего поплоше методом тупой перезаписи: программы–копировщика не было ни у кого.

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

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

4715

Пробел в знаниях

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

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

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

4680

Вы чё, не русские?

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

— Ну сделайте быстрее, что вам стоит? — говорит клиент.

— Быстрее никак не получится, — сетует контрактор. — Надо обратить особое внимание на то-то и то-то.

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

— (спокойно) Нет, я не русский, я перуанец. Поэтому будем делать по правилам.