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

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

2431

Пока не пошатнутся истины

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

Читаю мануал к компилятору. Есть функция программной перезагрузки. Работает, только если у программы один поток, а у меня три — не подходит. Есть функция аппаратной перезагрузки. Нужно выделять ножку ввода-вывода на контроллере и цеплять её к линии сброса контроллера. Не пойдёт: схему менять уже нельзя, да и ног свободных уже нема. А потом вспомнил: у меня же используется встроенная в микроконтроллер защита от повисания (мало ли что) — если две секунды сторожевой счётчик не сбрасывается, то самоперезагрузка обеспечена.

Цикл while true do begin end в итоге решил всё дело. Уложился в 18 байт машинного кода вместе с обработкой команды.

2418

Длина питона в попугаях

Читаю самоучитель по Питону. Глава заканчивается так: «...поэтому Питон довольно удобно использовать как простой калькулятор».

Сразу вспоминается, как на втором курсе в общаге за неимением молотка гвозди бюстом Энгельса заколачивали.

2405

Pie chart (англ.) — салат-диаграмма

Сегодня засиделась под утро над SADT-моделированием системы дистанционного образования. Опа, уже пять! Пора баиньки. Перед сном заглядываю в холодильник и по инерции размышляю: «Надо будет завтра спроектировать салат с шампиньонами». Мысленно открываю BPWin, рисую диаграмму... Всё-таки ночью лучше спать!

2375

Минуточку, соображаю

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

Пошёл курить. Дошло. Поржал, глянул на часы — полчетвёртого. Погасил машину и ушёл спать.

2328

Два герца

Школа-интернат. Все давно играют в World of Warcraft. Сервер московский, так что играют чаще ночью. В общаге имеется воспитатель, который патрулирует комнаты и коридоры, и за игру в три ночи наказывает нещадно. Играют все лёжа на кроватях — так видно меньше. Однако это не летний лагерь, а всё-таки школа, и выполнение домашней работы по программингу происходит в той же обстановке, на кровати с чашкой кофе/банкой энергетика/бутылкой воды.

Итак, на часах 3:30. В комнате двое играют и один пишет код к завтрашнему уроку.

— Колян, ты где там бродишь? Танковать я, что ли, должен?

— Да не парься ты, тут я, щас запинаем как ребёнка.

— Серый, напомни, у нас в шестом номере через какую конструкцию процедуру делать?

— Через while... Не, ну ты посмотри, срывается, козёл! Саня, тебе долго ещё проги набивать? Нам твой хант позарез нужен.

— (под нос) Факинг Паскаль... Где я запятую пропустил? (шёпотом) Да щас зайду, убьём мы эту элитку и орду распинаем. Я вон вижу, у вас там пара орков бегает.

— Ладно, ждём тебя.

Звонит телефон:

— Элвис, не тупи, заходи в онлайн. Мы в ауте... Да-да, сделал я лит-ру, завтра спишешь. Заходи резче... Что?.. Какое ОБЖ? Какой конспект?.. Да сделаем, щас, добьём гада одного.

— Всё, добил прогу. Как часы работает! Я захожу. Ждите...

— А нам не только ОБЖ задавали...

Патруль не дремлет. Мастер-класс от общаги: закрыть ноут и притвориться спящим за полсекунды, пока открывается дверь комнаты. Школа, а за выполнение домашней наказывают — жестокие нравы!

2324

Истинный фейл

Кодеры под Новый год порадовали. Есть требования на дизайн некой функции, которые звучат примерно так: «The %function()% shall perform %action% when its %parameter% is true...» Автор документа опечатывается и пишет: «its %parameter% os true». Понятно, буковки „i“ и „о“ рядом. Доблестный вордовый спеллчекер не согласен с вариантом и заменяет на «its %parameter% or true».

Умница. Так лёгким движением электронов по кремнию условие превращается в чёрт знает что, оставаясь при этом вполне понимаемым. Верификаторы — люди непривередливые, на логичность им ругаться запрещено, не их ума дело, кода (якобы) не видят. Пишут пару тест-кейсов на покрытие этого условия, получают фейл и тут уже с чистой совестью открывают issue на requirement/code mismatch — всё по процедуре.

На носу католическое Рождество. Прекрасно понимая, что америкосовый интегратор скоро уйдёт на каникулы, индусский кодер торопится исправить баг, втыкает в требования, втыкает в код, видит там if(param) {}, говорит «угу, непорядок» и приводит код в соответствие с требованиями: if(param || TRUE) {}. Код по требованиям, фейлов нет, придраться не к чему.

2310

Иллюзия выбора

Учусь в универе и понемногу начинаю заниматься программированием микроконтроллеров. Дома лежит спаянная плата с программатором, на которых я и тренируюсь писать простенькие програмки на Си.

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

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

if (x == 0) cbi(PORTB, 1);

if (x == 1) cbi(PORTB, 1);

if (x == 2) cbi(PORTB, 1);

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

2299

Стыд && срам

Работаю web-программистом. Достался мне как-то проект на сопровождение, который представлял из себя форум phpBB 3 с двумя достаточно объёмными модулями. Сами модули были написаны предельно аккуратно, с использованием всех возможных стандартов и правил: XHTML, MVC, «верблюжья» нотация, адекватно названые переменные. Я искренне порадовался, что на PHP пишут не только быдлокодеры.

Однако факт крайне плотного взаимодействия с phpBB (в том числе использование его механизмов отображения представлений) накладывал некоторые ограничения на стандартизацию. Думаю, это и стало причиной появления следующих строчек, найденных мной в одном из представлений внутри тега :









2298

Переходящая красная константа

Сижу, ковыряюсь в «1C:Бухгалтерии 7.7». Бух попросил узнать, откуда прога подтягивает территориальные условия сотрудника для отчета в ПФР. Выяснилось:

1) Для печати выводится значение переменной ТУ.

2) Переменная ТУ берёт свое значение из списка ТекущийСписокСтажа.

3) ТекущийСписокСтажа подтягивает данные из таблицы СтажСотрудников.

4) СтажСотрудников заполняется функцией глСобратьДанныеДляСЗВ2002.

5) И, наконец, функция глСобратьДанныеДляСЗВ2002 присваивает ей значение константы. Обычной константы, единой для всей базы.

Неужели нельзя писать попроще?

2296

Я устал, я ухожу

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

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

Всего есть около тридцати кодов остановки конвейера. Некоторые из них зарезервированы, и программист контроллера клятвенно заверял меня, что эти коды никогда не будут вызваны. Я поверил ему на слово, и одному из кодов сопоставил строку, которая никогда бы не отобразилась.

Произошло невозможное — видимо, где-то что-то не учли, и ошибка всё же вылезла. Диспетчер с ошарашенными глазами наблюдал у себя на мониторе следующую причину остановки конвейера:

КОНТРОЛЛЕР УСТАЛ