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

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

4896

Легенда о двойной уникальности

Пишу скрипт на PHP. Почему-то на сервере не работает array_unique() — не удаляет дубликаты из массива. Локально — да, на сервере — не до конца. Курю мануалы, форумы — не помогает. В каком-то безысходном порыве решаю вставить в код второй array_unique(). Чудо: дубликаты удалены! Смотрю на конструкцию:

$arr = array_unique($arr);

$arr = array_unique($arr);

...и добавляю комментарий:

// कोड में टिप्पणी — यह है कि उसने क्या कहा डिबगिंग के दौरान प्रोग्रामर

Ну, чтобы легенда не умирала.

4883

Кришна с нами

И вы удивляетесь, что индийский код работает? Не надо. Причина проста: они его благословляют.

void h(ne) {return ra/rn};

//-----------------------

//Pray all your gods to

//make this work and

//be careful with

//debugging

//Abdul Rahman Krishnaswami

//------------------------

Если Кришна с нами, то и успех будет всегда. Меняем бубны на чётки — и в бой!

4876

Пространственно-глюко-временной континуум

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

4867

Тык, кандидат эмпирических наук

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

Попросил один африканский друг моего одногруппника помочь написать программу на Паскале. Программа простая: что-то там нарисовать на экране. Рисуем контур, потом вызываем процедуру закрашивания. На вход процедуры подаются координаты точки, из которой начинается закрашивание; продолжается оно до границы другого цвета, так что точности особой не требуется. Тут африканец спрашивает, почему параметры такие и как их узнать. Одногруппник отвечает: «Методом тыка». Немного подумав, африканец задайт вопрос: «А Тык — это такой русский учёный?»

4865

Битвы за биты

Дело было в бородатом 97-м году. В школе на информатике у нас стояли древние даже по тем временам БК-10010. Решили меня как грамотного физматовца направить на олимпиаду по программированию. Так как времена были суровые, и игрушки мы не на дискетках приносили, а играли в то, что сами написали, навыки скорописи, 2D-графики в уме и анализа побитового сдвига были у меня развиты на ура.

Уже не помню суть задач, но на ныне неуважаемом Бейсике и ещё менее уважаемых машинных кодах (48 КБ оперативы всё-таки) я сделал комплексную оболочку с табличным выводом решений по всем трём задачам. Решение подразумевало и обработку идиотского ввода, и перехват ошибок. Преподы, понятное дело, были в шоке и изумлении, но первое место отдали парню, который притащился с сотым «пнём» и сваял всё на Вижл-бейсике.

Чувствую, что мои идеалы айтишников — людей, которые чётко знали, что такое отлаженный код, могли бороться за каждый бит памяти, не говоря уже о байтах, которые писали игры вроде «Elite» и перепрошивали «Вояджер» со сбитой камерой и антенной на дистанции в 15 световых минут и скоростью 1 бит в минуту, выжимая из железа и памяти всё возможное и невозможное, — канули в Лету. Что ж: хлопнем по пятьдесят, не чокаясь.

4828

Три пути к восемьдесят пятому уровню

Очень часто попадаются истории: «Аха-ха, я сделал так-то!», а через несколько страниц: «Муаха-ха, ты не шаришь, умные люди за тебя всё придумали. Проще сделать вот так». Есть подключить воображение, то все эти холивары можно представить в очень интересном виде.

Допустим, у админа есть задача установить некий сервер. Перенесёмся в мир фэнтези: объявлена награда за убийство дракона.

Первым откликается рыцарь: немного туповатый, но довольно хитрый малый, который предпочитает действовать силой, но если что, обращается к другим за помощью. После непродолжительных раздумий он отправляется в местный магазинчик, где ему продают меч «+1 к убийству драконов» c кратким описанием: «Если попасть этим мечом между 45-й по горизонтали и 78-й по вертикали чешуйками, то дракон умрёт». После нескольких попыток найти 45-ю и 78-ю чешуйку воин либо падает смертью храбрых, либо таки попадает. Ну, или покупает другой меч на +2, и история повторяется с самого начала.

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

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

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

Будем же добры и позволим остальным набивать шишки собственными лбами.

4821

Соседолокация

Не удаётся скачать программу с Ovi Store, говорите? А представьте, каково разработчикам!

Хоть я и не айтишник (учусь на строителя), но программированием под мобильные девайсы увлекаюсь. Пишу программу управления плеером под сенсорные «Нокии». Настало время очередного дебага, а у меня нет целевого устройства. Не беда: запускаем эмулятор, в нём плеер. Опа — при запуске воспроизведения плеер падает с ошибкой «Не поддерживается». Печально, но не беда: можно воспользоваться удалённым доступом к устройствам.

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

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», после уничтожения которых файл наконец перестал расти в размерах.

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