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

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

9768

Ой, не сюда!

Снова курю чужой код и перетачиваю под свои нужды. Есть программа, она с импульса расходомера учитывает, сколько гектолитров сусла налилось в пивной танк. У товарищей, чей код пилю, расходомеров было шесть, а проблем — ноль.

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

Мораль: использовал — сбрось сразу, а не до и не когда-то потом!

9755

Нету той улицы, сломан тот дом

Недавно имел счастье созерцать в багтрекере задачу следующего содержания:

«Изначально все объекты, занесённые в каталог, имеют привязку к месту своего расположения — улице и дому на этой улице. Но есть один тип объектов, слишком крупных по размеру, поэтому так точно их не указать — это парки. Сейчас они записаны как имеющие улицу и не имеющие дома. Я хочу лишить их и улицы, так как подобрать какую-то одну общую улицу крайне сложно. Для этого надо…»

О, этот жестокий, жестокий мир…

9731

Старьё моё

Понадобилось недавно написать для студента небольшую программу на Паскале. Программа простейшая — переход в графический режим, построение графика функции, вывод таблицы значений. На Windows 7 x64 Паскаль, разумеется, не запустится, да и от версии х86 толку бы не было — там отсутствует возможность работы в графическом режиме.

Итак, попытка номер раз — FreePascal. Пишем привычный код для инициализации графического режима и ожидания нажатия любой клавиши. Оказалось, что это дело во FreePascal организовано более чем интересно: открывается отдельное окно для графики, но все сообщения от клавиатуры принимает другое окно, с консолью. Приложение по нажатии любой клавиши просто так не закрывается, только после ручного переключения на окно консоли. Гугление даёт решение проблемы: собрать программу с ключом APPTYPE: GUI, подключить WinCRT и вызвать ShowWindow. В общем и целом под Borland Pascal это гарантированно не соберётся, а необходима совместимость. Отпадает.

Попытка номер два. Для совместимости со старыми приложениями я использую виртуальную Windows XP. Вот и сейчас на виртуалке стоит новенькая «хрюша» со всеми обновлениями. Копирую весь пакет Turbo Pascal, который предусмотрительно имеется, запускаю bp.exe, открываю исходник, запускаю. Приложение закрывается: отвалился эмулятор ntvdm.exe. Я привык: как Windows XP ни ставь, где-нибудь в конце концов да вылезет глюк, но тем не менее. В ходе экспериментов выяснилось, что отваливается при любой попытке перейти в графический режим, а также просто на запуске turbo.exe. Переустанавливать виртуальную машину на тот момент не было ни времени, ни желания. Решил пойти другим путём.

Итак, попытка номер три. Хвалёный многими DOSBox. Много слышал о нём, но использовать не доводилось. Включаем, монтируем в качестве диска С: папку с Паскалем, запускаем bp.exe, открываем исходик и привычно нажимаем Ctrl+F9. Программа закрывается. Полностью. Путём курения манов устанавливаем, что в DOSBox это сочетание клавиш действительно поставлено на закрытие. Кому пришло в голову назначить для эмулятора такие простые сочетания, когда все они используются многими досовскими программами, неясно, но на то он и опенсорц. Ладно, убираем это сочетание из настроек DOSBox, запускаем — графика работает. Вносим изменения в исходник, чтобы доделать-таки эту несчастную задачу. Вносим… А они не вносятся, ибо Паскаль реагирует только на пробел и на клавиши со стрелками. Закрываем Паскаль, в консоли DOSBox — тот же глюк. Нажатия клавиш Backspace и Del вызывают появление на экране символов из набора DOS. Закрываем DOSBox, открываем, монтируем, запускаем — проблема исчезает, но появляется после следующего запуска написанной программы. В результате отладка идёт именно так: запускаем, выходим, закрываем эмулятор, открываем эмулятор, монтируем, запускаем, пишем…

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

9726

svn blame boss

Работал начальником программистов. Как-то техподдержка обнаружила баг в нашем продукте. Условия были весьма хитрые, но, надо отдать должное, передали достаточно информации, чтобы я смог воспроизвести баг на своей машине. Ошибка оказалась пустячной. Быстро исправил, проверил. Насторожило то, что это ядро, на котором построен не один десяток приложений. Значит, им грозит обновление ядра и внеочередной релиз.

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

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

9715

Бетон на языке RGB

Есть два типа программистов. Первые сначала читают, потом программируют. Вторые сразу рвутся программировать, а читают только тогда, когда у них ничего не получается, и то не всё и не до конца. Решения, которые предлагают программисты второго типа, иногда просто изумительны!

Есть бетонная плита метр на метр, покрашенная краской. Задача: определить цвет, в который она покрашена. Что делает программист второго типа? Он берёт плиту и тащит её в лабораторию. Там он устанавливает напротив неё очень яркую лампу и три фоторезистора. Фоторезисторы он закрывает светофильтрами красного, зелёного и синего цветов. Включает лампу и регистрирует показания, снятые с фоторезистров. Дальше он бежит в библиотеку, берёт каталог со всеми возможными цветами и начинает искать среди них тот, компоненты которого наиболее точно соответствуют его данным. Его абсолютно не интересует, что его метод занимает половину дня, что он работает, только если плита имеет яркий цвет и не грязная, что в каталоге может и не быть искомого цвета… Но самое главное, он не знает, что цвет можно определить мгновенно, просто посмотрев на плиту.

Работать с такими программистами мне доводится довольно часто. На днях один такой программист два часа писал функцию перемешивания массива. Не знал он, что в PHP есть такая штука, как shuffle. И самое главное — не хотел знать! Другой быстренько набросал на JS функцию, которая перебирает все элементы массива и на каждом делает только одно действие: увеличивает значение переменной на единицу… Верно, ему нужно было узнать размер массива.

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

9708

cat, head и tail

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

Во сне решил применить полученные знания на практике и обработать хвостовой рекурсией кота. Успешно отсоединив прикреплённые резьбой голову и хвост, глубоко задумался над оставшейся частью. Отделённая голова взирала на меня с явным неодобрением. Внезапно появился ещё один кот, над которым я проделал ту же операцию. Теперь голов было две, и обе выражали негодование. Решив начать всё с начала, вернул на место голову моего кота, но случайно привинтил ему хвост от чужого. Хвост сперва заколосился трубой, а потом отвалился. «Exception! — подумал я. — Сопоставление с образцом закончилось ошибкой: чужой хвост другого цвета!..» И проснулся.

9697

Апдейт апдейчен и не апдейтится

Очередное обновление пакета программ для расчёта расходов на железнодорожные поставки СТМ. К тому, что под Windows 8 обновлялку этого пакета надо запускать только вручную и только от имени администратора, хотя есть соответствующая служба, которая вроде бы должна работать, но не работает, мы привыкли. Но сложно привыкнуть к постоянно возникающим в процессе обновления ошибкам. Сегодня оно выдало:

Ошибка при обновлении версии 1.66 на версию 1.67. Файл обновления предназначен для версии 1.66, установлена версия 1.67.

Причём установлена версия 1.67 в ходе обновления.

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

9678

Антить-колотить

Лекция по информатике. Преподаватель рассказывает про оператор UNTIL. С задней парты голос:

— Антил, антю и буду антить!

9658

А стулья потом

История о сайте с трубой напомнила мне о таджике, который работал у друга. Разговоры были такие:

— Тут вот надо поставить котёл.

— Без проблем, деньги давай предоплатой, насяльника!

Поставили котёл.

— А теперь надо трубы ввести.

— Тут, насяльника, низзя ввести, стены мешать будут.

— Что делать?

— Котёл надо снимать, стену заделывать, котёл ставить туда. Или будет некрасиво, и кирдык трубам в мороз.

— Делайте!

— Без проблем, деньги давай предоплатой, насяльника!

Расплатились.

— Окно ставь сюда!

— Без проблем, деньги давай предоплатой, насяльника!

Поставил.

— Что-то низко… Повыше надо.

— Без проблем, деньги давай предоплатой, насяльника!

В очередной раз:

— А ты не видел или не знал, что ли?!

— Видел, знал, насяльника. Ты говоришь и платишь — я делаю.

9621

От брейкпойнта до брейкпойнта

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