28 октября 2012 г.

Object oriented Lazy GTK Cat

Загрузил в репозиторий LazyCat на GitHub последние изменения, являющиеся результатом почти месяца работы. Суть изменений заключается в том, что Lazy GTK Cat (текущий и пока единственный GUI для LazyCat) переведён на объектно-ориентированную модель.

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

Поскольку решаемая мной задача (GUI и некоторая высокоуровневая логика) хорошо поддаётся на разбиение на ясно определённые объекты, перевод на объектно-ориентированную модель позволил упростить код, сделать его ясным и удобным для понимания. А значит, дальнейшее добавление необходимых возможностей в GUI будет проще.

Я изучаю Scheme и GNU Guile по ходу работы над проектом и по мере решения возникающих проблем. И в этот раз много времени ушло на чтение документации и эксперименты с GNU Guile -- чтобы понять, как же реализовать объекты в языке. Сначала попробовал создавать объекты с помощью closures -- механизм, который "из коробки" присутствует в Scheme.

Вариант с closures оказался простым и достаточно удобным. Но я на этом не остановился и решил попробовать сделать то же самое с использованием Guile Object Oriented Programming System (GOOPS) -- модуля, который приносит объектно-ориентированность в язык. После того, как переписал готовые объекты с использованием GOOPS, я продолжил разделение того большого куска кода, которым являлся Lazy GTK Cat, на небольшие и относительно простые объекты. Стало ясно, что GOOPS является более мощным и удобным механизмом для создания объектов в языке.

Работу методов для некоторых объектов я проверил по отдельности, через написание скриптов на GNU Guile (одна из возможностей этого интерпретатора -- использование вместо shell-интерпретатора для написания скриптов на Scheme, которые можно выполнить прямо из консоли). После тестирования нужно было собрать всё воедино и заставить работать. Далее -- тестирование Lazy GTK Cat и дописывание оставшихся частей основного класса приложения. Всё это было сделано за несколько дней.

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

Я по-прежнему ищу разработчиков для проекта. Важна не только помощь, но и интересен опыт совместной работы над проектом через GitHub. Если вам интересен проект -- go ahead, буду рад помощи.

- Артём

14 октября 2012 г.

cowsay for Android

Сегодня к своему удивлению обнаружил в репозитории F-Droid порт Unix-утилиты cowsay для Android. Разумеется, я тут же установил такую полезную утилиту на свой коммуникатор:

cowsay -- это консольная утилита, которая выводит сообщение (передаваемое ей, как аргумент), как высказывание одного из персонажей (по-умолчанию -- коровы).

Кроме коровы доступно множество других персонажей, так же можно менять отображение сообщения и некоторые параметры персонажа. Рекомендую вам установить эту утилиту в вашем дистрибутиве GNU/Linux (если вы ещё не сделали этого) и поэкспериментировать с ней.

Как и большинство утилит Unix, cowsay может быть использована в конвейере команд. Кроме того, существует вариант утилиты cowthink, который отличается тем, что выводит сообщение в "облаке мыслей":

$ cat hello.c | cowthink -W 80 -n
 _______________________________________________ 
( #include <stdio.h>                            )
( #include <string.h>                           )
( #define S "Hello, World\n"                    )
( main(){exit(printf(S) == strlen(S) ? 0 : 1);} )
 ----------------------------------------------- 
        o   ^__^
         o  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||