27 окт. 2008 г.

Ruby+GUI. Гуевый Ruby

Причин для написания этой статьи две:

* "А! Ruby. Это, что-то для WEB ?"
* "Мы начинаем новый проект для Desktop. Подскажите какой инструментарий выбрать, чтобы было быстро и недорого"

Коммерческих вариантов много: MS VisualStudio, Delphi, С+Builder. Еще больше некоммеческих: Eclipse+SWT, NetBeans +SWT, Lasarus + LCL.

Сейчас я хочу представить связку:

wxFormBuilder + NetBeans for Ruby + wxWidgets + Ruby

В приципе можно было-бы ее сократить до wxWidgets + Ruby, но любителям "визуального" программирования боюсь не понравиться отсутствие
возможности кинуть кнопку на форму, а отсутсвие редактора с автодополнением кода огорчит еще некоторую часть аудитории.

* Ruby - Кросплатформный интерпритируемый язык программирования со строгой динамической типизацией.

* wxWidgets - это кросплатформный инструментарий для создания графического интерфейса. Хотя она содержит и другие полезные свойства кроме
визуальных елементов управления, сейчас нас будут интересовать только формы, кнопки и меню.

* wxRuby - обертка библиотеки wxWidgets для работы с Ruby

* wxFormBuilder - кросплатформный визуальный редактор форм с возможностью генерации С++ кода или XML ресурсов в вормате XRC.

* NetBeans for Ruby - кросплатформная интегрированная среда для разработки на Ruby и Ruby on Rails от Sun Miscrosystems.

Ну вот пожалуй все основные компоненты описаны.

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

Для NetBeans необходим Java Runtime Environment. Его можно ускачать и установить с сайта фирмы Sun.

Я не буду останавливаться на установке всех компонентов. Описание этих процесов можно найти в Интернете для любой платформы, так что не будем повторяться.

Открываем любой тектовый редактор и создаем файл hello.rbw

1 require 'rubygems'
2 require 'wx'
3
4 include Wx
5
6 class MyApp < Wx::App
7
8 def on_init
9 Wx::Frame.new( nil, -1, "Hello world!!!").show
10 end
11
12 end
13
14 MyApp.new.main_loop


Запускаем

ruby hello.rbw



В гем пакете wxRuby есть достаточно много примеров для работы, потому этого вполне хватит, чтобы проилюстрировать работу Ruby + wxWidgets.

Для визуального дизайна форм можно использовать wxFormBuilder он способен создавать xml ресурсы, а wxXMLResources способен создавать по этим ресурсам экземпляры форми и диалогов. Хочу отметить, что ресурсный файл может содержать описание нескольких форм и диалогов. Пример можно посмотреть в папке samples/xrc гема wxruby.





Вы можете использовать NetBeans для как редактор кода.

http://rubyforge.org/ и http://github.com/ - два самых больших репозитария библиотек, плагинов и примеров для работы с различными технологиями начиная от COM, OLE и реестра Windows до сетевых библиотек и работы с графикой. Возможна также работа с раздичными базами данных как напрямую, так и с помощью ORM.

ANVIL - MVC фрейворк для построения GUI. Находиться в зачаточном состоянии но уже написано первое приложение HAMR - текстовый редактор.

Вобщем не вижу проблем, чтобы Ruby внес достойный вклад в разработку Desktop приложений :-)

Delphi. Helpers

Я давно не писал о Delphi. Сейчас появилась интересная тема по поводу изменений в языке.
Helpers - структуры для расширения функционала уже существующих классов без применения наследования.
В реализации helpers есть как свои положительные стороны так и недостатки.

type
ClassHelper = class helper [(ancestor list)] for type-id
end;

Когда это может понадобиться ?
Добавить возможность получения итераторов в классах коллекций где они не реализованны и последующее их использоавние в конструкции

for item in collection do
...
end

Пример можно посмотреть тут.

Изменение сигнатур вызовов функций без применения наследования.

Например добавить разного рода сортировки списков и коллекций.

Изменить способ обхода набора данных возвращаемого TDataSet.
Распространенной ошибкой являеться зацикливание из-за того, что в теле цикла программист забывает поставить вызов DataSet.Next.
Например:
ьно
while DataSet.HasNext do
begin
...
end

чтобы HasNext выполнял не только проверку на наличие следующей записи в датасете, но и передвигал текущую запись. Такое поведение упростит работу с TDataSet.

Вобщем вариантов масса.

Но есть и своя бочка дегтя в этой ложке меда.

Helper дает возможность работать только с методами, но не позволяет содержать в себе определение данных.

Технология хелперов представляет собой так называемое Mix(подмешивание), которое широко используется в таких языках как Ruby и ему подобные.

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

Например датасет который построен на таблице с классической древовидной структурой: ID, PARENT_ID, NAME при подмешивании получал бы функционал дотуп к корневому узлу, итераторы обхода всего дерева, обхода только детей. Вобщем тот функционал который сейчас реализуется сейчас в TTreeView(View) несмотря на то, что функции поставщика данных должны быть определены в модели.

В принципе и сейчас можно реализовать такой функицонал, но вот как реализовать функции настройки?
Например если поле ID называется REC_ID. Где-то надо хранить эту информацию, а хелперы не позволяют создавать поля.

Резюме: очередная подпорка пирамиде вертикального наследования VCL, к тому же не рекомендуемая для основого программирования самим производителем.

5 окт. 2008 г.

Переход с SVN на GIT

Если вы все такие решились перейти с Subversion на Git, то для этих целей подойдет специально написанная утилита Git-SVN.

Не обязательно переносить весь репозитарий тем более, что ваши колеги все еще не готовы или по каким либо причинам не хотят использоавть Git.

На первых порах можно работать с Subversion репозитарием через посредничество git-svn.

Импортирование репозитария




git-svn clone --s [url] --user-name=[svn-user]


url - может быть как веткой или тэгом так и всем репозитарием.

Опция --s задаст стандартные ветки внутри
git-репозитария(trunk,tags,branches).

Внесение изменений



Теперь вы можете забыть о том, что ваш основной репозитарий находиться под управлением Subversion и спокойно работать прирываясь только на синхронизацию с основным репозитарием и отправляя свои изменения.

Получение изменений



Для того чтобы получить измеениния внесенные вашими колегами необходимо выполнить команду rebase


git-svn rebase


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

Прячем изменения



Временно спрятать изменения позволит команда stash




git stash save


она запишет текущие неподтвержденные изменения в список

после того как будет обновлена рабочая копия изменения надо вернуть


git stash pop


такая команда вытолкнет самое верхнее сохраненное изменение и удалит его из списка

подробней о списке stash можно узнать из справки


git help stash


Отправка изменений на сервер




git-svn dcommit


Ну вот и все. Недостатком такого метода являеться сравнительная медлительность при отправке изменений.