Monthly Archives: Август 2012

Alarm Clock

Представим простую ситуацию. Вы поставили на плиту что-нибудь вариться и, пока оно варится, включили музыку, решили почитать ленту Твиттера, написать пару строчек кода, etc. Проблема даёт о себе знать через обонятельные рецепторы. Конечно, часы перед глазами, но мозг (по крайней мере, мой) абсолютно отказывается отслеживать время.

В очередной раз столкнувшись с этой проблемой, я решил поступить как нормальный программист – сел и набросал простенькую программку-таймер. Заодно попробовал в работе Lazarus. Результат работы под названием AlarmClock здесь (exe для Win32 вместе с исходниками по лицензии ISC). Один из мелких недостатков Lazarus – большой размер получающихся exe, но, думаю, это не критично. Зато не требуется ничего устанавливать, и GUI выглядит как «родной» что в WinXP, что в Win7.

Итак, запустив эту программу, можно установить или требуемый интервал времени (например, 10 минут) или заданный момент на ближайшие сутки (в 24-часовом формате). Указать в нижнем текстовом поле причину тревоги и нажать кнопку «вниз» для интервала или «T» для момента времени – отсчёт пошёл. Теперь можно свернуть окно, чтобы не мешалось (оно спрячется в трее). Когда придёт заданное время, окно AlarmClock всплывёт и будет настойчиво демонстрировать себя, пока не будет нажата кнопка «0» (сброс) или «пауза». Также можно включить звуковое сопровождение (использует стандартный звук Windows в качестве «сирены»).

V.1.01. Bugfix: при смене дат (наступлении 00:00) счётчик сбивался. Fix: счётчик теперь не останавливается при изменении поля причины (однако тревога выключается).

V.1.1. Первоначально я не думал развивать проект, но раз уж выложил его на Bitbucket, то придётся попиливать по-маленьку :). Добавлено окно «О программе» со ссылкой на репозиторий и краткой справкой.

V.1.2. Поддержка параметров командной строки.

Раз, два, три…

В академической среде известен лозунг «publish or perish». Многим (в том числе, и мне) трудно заставлять себя писать. Вместо этого (а также преподавания, которое накладывает ответственность, необходимость разбираться в вещах, в которых порой не чувствуешь себя уверенно, и это сильно угнетает) я с удовольствием бы копался в каком-нибудь низкоуровневом коде, не имея иных обязательств.

(Самое забавное, что эта неуверенность иногда каким-то чудом может приводить к ложному впечатлению наличия каких-то «глубоких познаний» в тайнах «чего-то очень сложного». Печально.)

Блог воодушевляет быть более открытым, не гнаться за наукообразностью, за перфекционизмом (который, увы, порой так увлекает). Да, blogging is hard.

Не стоит гнаться за «репутацией». Чем её «больше» (как кажется человеку), тем страшнее её потерять, страшнее оступиться, сделать ошибку, а не ошибается, как известно, тот, кто ничего не делает. Это путь в никуда — предел роста репутации = полный паралич.

Голова, несмотря на все эти миллиарды нейронов, всё равно слишком маленькая. В конце концов, до тебя, по большому счёту, почти никому нет никакого дела.

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

Необходимо публиковать код (чем мне ещё предстоит заставить себя заняться!). Лозунг разработчика — «ship or die».

В студенческой среде встречается превратное представление о том, что собой представляет «профессионализм». На мой (идеалистический) взгляд, в первую очередь, профессионализм — это честность с самим собой и с теми, кто зависит от твоей работы. Это умение заставить себя взглянуть в будущее, принять взвешенное решение и действовать в соответствии с ним. Если ты объективно проанализировал свою подготовку и пришёл к выводу, что находишься на первой ступени компетентности в некотором вопросе, то, наверное, не стоит браться за эту работу.
Организованность, знания и умение поставить и эффективно выполнить задачи — лишь следствие. Ни опыт, ни знания, ни заработок сами по себе не являются мерилом профессионализма.

Напоследок

Маленькая забавная задачка

Дана строчка «123456789». Между любыми двумя цифрами можно поставить *, + или — (или ничего не ставить), требуется найти все варианты расстановки знаков, дающие при вычислении (с учётом приоритетов операций) полученного таким образом арифметического выражения 2002.

Задачка сравнительно легко решается на языках, имеющих встроенные средства вычисления выражений (например, Perl). Я написал решение  на C, представляющее каждую возможную формулу в виде 16-битного целого (8 возможных позиций для знаков, 4 варианта в каждой позиции) и перебирающее все 65536 вариантов. Академический интерес представляет вопрос, сколько кода понадобится, чтобы заставить решить эту задачку компилятор C++ (надо написать соответствующие шаблоны). Я пожалел своё время и не стал это выяснять :).