18 дек. 2007 г.

PasDoc, ROBODoc, DocBook. Документирование кода в Delphi

Некоторое время назад передо мной стоял выбор средства документирования исходных текстов на Dephi.

Документировать код во внешних файлах весьма трудоемкая задача. Вопрос синхронизации кода и документации весьма важен и потому средства типа MS Word, OpenOffice.org и даже Help & Manual не подходят однозначно.

Программисты Java имеют хорошую утилиту javadoc, позволяющую генерировать документацию прямо по вставленным в код комментариям особого формата. Существует такой аналог и для Delphi: pasdoc


ROBOdoc - еще одна подобная утилита, но этот вариант я отбросил сразу из-за неоправданно усложненного синтаксиса и слишком большей расхожести с javadoc. Да и общая ориентация утилиты несколько отталкивала. Немаловажным фактором являлось и то, что языком написания был C, а значит могли быть трудности с пониманием работы и исправлением ошибок.

Pasdoc – это OpenSource программное обеспечение распространяемое под GNU Public license. Тоесть вы можете делать с программой и кодом все, что угодно, кроме присвоения авторских прав ;-)

Долгое время pasdoc'у вменяли в вину то, что он не способен генерировать формат DocBook. Собственно DocBook не являться конечным форматом документации и в чистом виде не используется.
DocBooc - SGML или XML (проще говоря — популярный набор тегов), предназначенное для разметки документов, такое же, как HTML для разметки веб-документов. (C) Wikipedia
DocBook – интересен тем, что позволяет вести единый файл документации и получать документы или их части в различных форматах: html, pdf, WinHelp, CHM.
На самом деле, это неправда. Вернее, полуправда :-) Написание документации в этом формате занятие весьма утомительное без специальных средств предоставляющих сервис: форматирования исходного кода, проверки синтаксиса, проверки правописания и тому подобного.

«В чем сила, брат ...?» (С) Брат 2. ... «А сила она в XML...» (C) ХЗ
Сила DocBook'а в XSL схемах которые поддерживаться сообществом и являться инструкциями для процессоров преобразующих XML файл в другой тестовый файл.

Судите сами.
HTML: DocBook > XSL схема > процессор > HTML
WinHelp: DocBook > XSL схема > процессор > файлы проекта для MS HelpWorckshop> MS HelpWorckshop компилятор>HLP
PDF: DocBook > XSL схема > процессор > XSL-FO>Форматировщик (Apache FOP, XEP etc.)>PDF

Ключевым звеном являются набор схем, которые только подготавливают необходимые входные файлы. Тоесть, теоретически можно написать схему которая бы на выходе дала исходные коды приложения на Dephi и сразу же скомпилировать утилиту показывающую справку как приложение %-)

Почему я решил написать статью.
PasDoc объявил о поддержке формата SimpleXML!
Для «тех кто в танке», прошу прощения, поясню. На выходе утилита выдаст структурированный XML вашего кода. А теперь вернемся на пару строк вверх и в схему вместо DocBook поставим SimpleXML. Что получим ? Ну практически ничего, потому как DocBook XSLStylesheet ничего не знают о SimpleXML.
Поскольку я математик, то вспоминается:
Физику и математику ставится задача: написать алгоритм кипячения воды в чайнике на газовой плите.
Ответ одинаковый у обоих: Налить воду, зажечь огонь, поставить на него чайник и ждать.
Теперь усложним задачу: в чайнике уже есть вода.
Физик: зажечь огонь, поставить на него чайник и ждать.
Математик: вылить воду, задача сводиться к предыдущей.

Получаем: SimpleXML>XSL-SimpleXML2DocBook> Processor>DocBook –> а для DocBook задача у на уже решена.
Упреждая вопросы: почему не pasdoc > DocBook, отвечаю, что не DocBook это довольно мощная и развитая система и не всякому проекту подходит по масштабам. Потому гораздо эффективней иметь «сырой» XML и уже из него получать форматирование DocBook.

Существует и второй метод решения задачи. SimpleXML2>XSLMyStyleSheet>...
Создать собственные схемы преобразования. Может быть и трудоемко, но получим возможность конвертировать прямо в формат внутреннего Wiki например.
IMHO написать свои схемы проще чем изучить теги DocBook.

Для тех, кто все таки дочитал до этой строки скажу, что SimpleXML не доступен в версии 0.10.0 и необходимо взять сборку с SVN. SimpleXML еще не совсем доработан. Для простоты показа примеров выкладываю скомпилированную мною версию и включаю ее в архив.

Архив содержит пример преобразования извлеченного из pas файла xml в html. Используется java-based процессор Saxon и Apache Ant. Потому приодеться установить Java.
Можно поспорить в выборе процессора. Существует XSLProc, он чуть быстрее, но и слабее потому, что не поддерживает XSL 2.0

Почему я выбрал Saxon, потому, что он пока единственный, кто поддерживает XSL 2.0, хотя я могу и ошибаться. К тому же он прекрасно интегрируется c Ant, а почему я выбираю Ant читайте тут(ссылка на статью в блоге).

Призываю энтузиастов владеющих XSL присоединяться разработке схем для других форматов :-)

З.Ы. Фактически pasdoc может выбросить все форматы и оставить только xml %-) Тоесть оставить только функции извлечения данных из исходных текстов Delphi.
Задача трансформации в другие форматы у нас уже решена ... :-)

З.Ы. З.Ы Будучи на разработчиком Delphi CodeGear (Borland) я бы не изобретал системы справки, а просто внедрил pasdoc и генерировал бы справку на лету в отдельном окне прямо в IDE как это реализовано в Lazarus.

Ссылки:
Пример к статье

http://pasdoc.sipsolutions.net/
http://www.xs4all.nl/~rfsber/Robo/robodoc.html
http://docbook.sourceforge.net/
Автодокументация исходников посредством PasDoc

Copyright 2007 Roman V. Babenko http://romanvbabenko.blogspot.com, http://devrona.com

16 дек. 2007 г.

Delphi мертв, а я еще нет... XML медлит ...

Забрел давеча на http://SQL.ru
Захотелось освежить восприятие мира. Точнее понять, чем живет мир Delphi. Чем интересуется. О чем спрашивают, как отвечают.
Внимание привлек почти романтический пост: XML медлит ...

fashtura: XML медленно загружается, как исправить ...
softwarer: Попросить его поторопиться ...

RENaissance: дать пинка
...
eNose: загружается или парсится?
sqllex: Размер файла?
eNose: и куда вы его "загружаете"?
fashtura: Загружаю в Grid а размер 20 Мб
eNose: XML в Grid? напрямую или всё-таки как?
eNose: напрямую
Страдалецъ: Если вы его напрямую грузите, тогда пофик XML или MDB, это просто абстрактный файл. А вот если вы его обрабатываете именно как XML(парсите), то тады другое дело - скорость и 20-Мб XML понятия несовместные и в этом случае надо разбираться подробнее, что вы называете "медленно". Скока это? Насколько много вложенностей в XML?
fashtura: примерно 30 сек.
Страдалецъ: А тот-же файл, но открытый уже эксплорером сколько по времени занимает? Только дождитесь конца загрузки.
Ну а 30 сек, если вложенность скажем уровня 3, то это еще ничего.

Причем количество постов у каждого из учасников от 20 до 21000

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

Вот спросите себя, зачем нужен htpp://bash.org.ru, если на серьозных тематических форумах можна изыскать подобные перлы. Прочитайте пару десятков постов и отметьте для себя на сколько из них вы бы хотели ответить.

"Я так думаю ..." (С) Мимино. Умер не Delphi а радужная мечта о безоблачной и уважаемой професии программиста. Бизнес требует все больше и больше. А мы не останавливаемся для того чтобы прочесть пару тройку книг по: ООП, теории построения баз данных, MVC. И куда уж там шаблонам ропектирования.

Вот и имеем теперь тонны неефективного кода, вовлеченного в бизнеспроцесс. И плохое умирающее средство разработки, да еще и тормозные серверы БД.

А может просто руки выпрямить ? Или с лозунгом Delphi - отстой, C# - нам поможет ломонуться писать еще лет пять, авось новое, что-то придумают и мы туда же отправим нынешние техноогии и средства разработки...

14 дек. 2007 г.

Линки. ООП и патерны

Несколько ссылок по ООП и шаблонам проектирования. Предпочтительно в Delphi.
Практика применения паттернов проектирования

Использование паттерна “Команда”

Статьи старые но занимаетельные. Жалко, что как всегда примеры урезанные.
Ну жалко, что ли написать сприложение которое бы не оставляло вопросов по используванию техники? Если уже по базам данных, то как минимум: список, диалог редатирования, выборка из справочника. Иначе просто нет целосности картины.

Следующая ссылки бессовестно уперта из поста

Объектно-ориентированное программирование в действии, Т. Бадд

11 дек. 2007 г.

Кадеты. Теорема: Мир конЕчен.

«Болота иногда издают странные звуки...»(С) А. Конан Дойль
У меня складывается впечатление, что мир все таки не бесконечен и имеют место повторы. Вчерашняя серия кадетов: выпускной экзамен, парень романтичный и желающий писать выпускное сочинение в стихотворной форме... События 13летней давности экранизированы только сегодня ... а ведь я действительно писал на экзамене стих на военную тему и у меня все получилось. А поскольку авторских прав у меня не спрашивали, значит еще где-то мир сделал петлю. Теорема почти доказана, но не радует: ледниковый период, у числа PI появиться период, Наполеон, фашизм-коммунизм, Екатерина II ...

Джоел Спольски, Сет Годин и компания ... Really ?

Получилось довольно эмоционально...
Существует ряд книг которых бы я никогда не купил. Не потому что они мне не интересны, а просто потому, что прочитав их один раз я бы никогда не взял их в руки повторно. Обычно книги перечитывают потому, что они содержат интересную справочную информацию или же эффект от их прочтение способен эволюционировать в процессе взросления читателя.

Но существуют книги-пустышки, подобные газете – один раз прочитал и можно смело выбросить. Они написаны либо на заказ, либо просто для заработка денег, либо просто для накопления печатно-издательской массы у автора . Попросту говоря, дешевая беллетристика. Один раз прочитал, или даже начав читать ты уже знаешь концовку. Причем такая тенденция наблюдается не только в среде печатного слова, но и в кинематографе. Спросите себя, сколько раз вы готовы пересматривать «Иронию судьбы», «Москва слезам не верит», «Асса», «Игла» и сколько раз вы снимите с полки диск с «Гарри Поттером» или «Кодом ДаВинчи».
Почему-то мне кажется, что так называемое «продолжение» «Иронии...» постигнет участь двух последних кинопроизведений... Хотя там и задействованы глубокоуважаемые и горячо любимые актеры: Хабенский, Мягков ... Удивляет то, что я пересматривал «Дозоры», но уж больно эффектно фильм снят – сплошной клип, да и актерский состав довольно весом...
«Но, в прочем песня не о нем...»
А песТня собственно говоря о книгах-пустышках для программистов. Потому как волею судеб я, хочу надеяться, являюсь не самым худшим экземпляром этого замечательного и сравнительно молодого народа.

Как водиться каждого народа должны быть вожди. Вождями становятся по разным причинам боевые заслуги, опыт или... же остаточный принцип. Как это остаточный? Да у нашего народа такое бывает. Это когда из твоего племени сбежали или гордо удалились все кому не нравился нынешний вождь, а ты почему-то задержался. Поздравляю. Теперь тЫ вождь! Хотя не исключено, что и до этого им был тоже тЫ... пора набирать новое племя. А как же воевать то надо... с кем-то, за кого-то, за что-то... а... неважно. Питаться надо.
А как же править и принимать умные решения? Опыта маловато. Да и молод ешшо. Где бы знаний по-быстрому набраться? Ответ - из книг. Ответ, то он правильный в принципе, да только книги толстые у заумные, пока прочтешь висок седым станет. Нам что-нить побыстрей да покороче и чтобы еххххх... аж дух захватывало...

Да пожалуйста. Могу посоветовать аж два для вождей-скороспелок: (Сет Годин) Getting Real или же Джоел Спольски(читайте все что попадется).
Первого характеризуют как успешного и плодовитого маркетолога второй написал шуточный тест «12 шагов к лучшему коду».
Я не иронизирую по поводу «шуточного» теста можете убедиться сами тут http://russian.joelonsoftware.com/Articles/TheJoelTest.html

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

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

Сет Годин – успешный маркетолог, мастер компьютерных наук и философии.
Книга Getting Real http://gettingreal.37signals.com/GR_rus.php уже девятая в его портфолио.
Написана в типично американском стиле: методично-многократное повторение одного и того же материала, много пересказов о том как у кого-то, что-то однажды хорошо вышло. Если выбросить «свидетельские показания» и повторения то получиться вполне безобидная брошюра: как заработать на гербалайфе.
Книга затрагивает все аспекты разработки: даже код и спецификации. В общем то я не сомневаюсь в талантах Сета Година как маркетолога, но вот код и спецификации, и его советы вызывают как минимум сомнение.
В общем перед тем как читать книгу или брошюру не мешало бы изучить биографию автора и сравнить ее адекватность раскрываемой в книге теме.
Забавный случал со мной наблюдал на одной из лекций в компании по продаже пищевых добавок(грешен, но не каюсь ибо опыт бесценен).

Слушатель: скажите пожалуйста, тестировался ли ваш продукт применительно к рациону питания населения Украины. Не секрет что русскому-хороше, то немцу смерть.
... слушателя вывели из зала ...

Де исключаю, что подобная реакция может последовать и на мое вольнодумство, тем более, что в круге друзей, я нашел целое общество читателей Get Real :-) Но покажите мне человека разбогатевшего на гербалайфе...
Бойтесь землян дары, приносящих! (Фредерик Браун) Это хороший рассказ :-)

Delphi. Автоматизация сборки проектов.

Что мы имеем на борту IDE Delphi из подобных средств? Практически ничего. Make – годиться разве, что для автоматизации компиляции проекта и ресурсных файлов. Ни о какой масштабируемости и расширяемости речь не идет. Немного разбавляют краски bat и cmd файлы и запуск внешних утилит командной строки. Скудность возможностей интерпретатора Windows по сравнению с Linux Bash, CSH тоже оставляет причины загрустить. Да и сам подход не решает основной проблемы, описанной выше: не дает ответа о выполнении поставленной задачи. Анализ логов работы скриптов в расчет не брать, потому как это лишняя работа, не позволяющая быть основанием для продолжение выполнения зависимых задач.

На http://sourceforge.net был основан проект названный WANT. Разработанный на Delphi клон Ant заточенный под сборку проектов Borland Delphi IDE. На http://DelphiPlus.org даже есть статья по использованию WANT и я сам пытался составить документацию, но ввиду незаконченности проекта оставил попытки.
Непонятна цель проекта WANT. Написать аналог Jakarta Ant отвязанного от Java и привязанного к платформе Windows? Построить ошибки уже написанного и оттестированного продукта? Думаю в этом основная причина отсутствия интереса общественности к развитию этого проекта. Хотя кстати сказать сам Ant уже имеет продвинутого конкурента в виде Maven.
В процессе работы над документацией WANT, мой коллега(Привет, Коля ;-)) просил меня о том: стоит ли использовать WANT или лучше оригинальный Ant. В тот момент я не придал значения такой альтернативе, так как для настоящего «дельфера» для меня Java было чем-то, что было «непригодным для настольных приложений и жутко сложно-тормозным». Но время шло, Java становилась ближе и доступней, а такого средства как Ant в Delphi так и не появилось ....

Delphi. Автоматизация сборки проектов Apache Jakarta Ant

Что такое Ant ?
Это написанное на Java средство автоматизации сборки программных проектов, подобное известной утилите «make», но избавленное ее недостатков и ограничений. Поскольку Ant написан на чистом Java, то отсюда вытекаят явная выгода его кросплатформности, тоесть независимости от операционной системы. Как большинство программы написанных на Java под эгидой Apache Foundation – Jakarta Ant является OpenSource ПО, следовательно вам не придется как минимум платить за лицензию, а как максимум вы имеете в распоряжении исходный код.

Возможности

  • Работа с файлами и каталогами(копирование, перемещение, удаление);
  • Работа с архивами(zip/bzip2);
  • Запуск внешних приложений;
  • Интеграция с системами контроля версий CVS, Subversion, SouceSafe, Perforce;
  • Чтение из файла и подстановки переменных;
  • Работа по HTTP и FTP протоколам;
  • Показ заставки в процессе выполнения цели(декоративная функция);
  • Поддержка мультиязычности в сообщениях интерфейса;
  • Масштабируемость, возможность создания собственных заданий;
  • Интерфейс командной строки и гибкая система файлов настроек;
  • Кросплатформенность;
  • Система логирования;
  • Работа с электронной почтой;
  • Возможность вызова заданий находящихся во внешних ant-файлах;
  • Связывание отдельных задач в цепочки зависимостей и получения однозначного ответа о выполнении;


Идеология:
Существует файл проекта в котором с помощью xml описаны цели [target]. Цели состоят из задач [task]. Результат выполнения цели зависит от результата выполнения задач из которых состоит цель. Цели могут объединяться в более крупные цели с помощью зависимостей [depends]. Результат таких составных целей зависит от выполнения всех составляющих цепочки. [Properties] определяют глобальные переменные проекта, такие как название, номер релиза, текущий каталог и т.д. Существуют еще условия [condition], но их использование не обязательно.

Поясню зачем я это излагаю.
«Написанный НА Java» - не эквивалентно «написанный ДЛЯ Java», верней «ТОЛЬКО для Java».
Теоретически мы можем использовать его для автоматизации практически любого процесса в системе.
Логика работы Ant такова, что на выходе мы 100% получить ответ: «Таки, ДА, достигли мы намеченной цели, или, таки, НЕТ».

Ревизия средств сборки проектов встроенных в Delphi.

Технические требования и установка
Sun JDK – установку рассказывать не буду их полно в интернете да и на сайте довольно доходчиво написано. Правда на английском, но если вы хотите программировать, то должны хотя-бы читать, иначе ваш удел строгать бухгалтерию в 1С.

Скачать дистрибутив с сайта и скопировать в каталог: d:\usr\local\ant
В файле autoexec.bat

SET JAVA_HOME=d:\usr\java\jdk1.6.0_03
SET JRE_HOME=d:\usr\java\jdk1.6.0_03\jre
SET PATH=%PATH%;%JAVA_HOME%\bin;d:\usr\local\ant\bin
SET CLASSPATH=%CLASSPATH%;d:\usr\local\ant\lib

тоесть поместить путь к каталогу ant\bin в переменную PATH и указать Java где ей искать библиотеки Ant В переменной CLASSPATH

Перегрузив систему набираем в консоли:
D:\>ant
Buildfile: build.xml does not exist!
Build failed

Все хорошо!!! Ant говорит, что не нашел build-файла, но все таки работает и значит мы все сделали правильно.

Следующий этап создание тестового проекта
Для написания файла проекта нам понадобиться текстовый редактор.
Внимание!!! Если вы планируете писать комментарии на русском языке, то вам понадобиться редактор с поддержкой Unicode. Подойдет например Notepad2, который имеет также встроенную поддержку раскраски xml синтаксиса. Для проектов повышенной степени сложности могу рекомендовать редактор Ant скриптов Eclipse IDE. Редактор поддерживает не только раскраску, но и проверку синтаксиса, дополнение кода, подсказки, средства запуска, так как Ant является штатным средством сборки проектов Eclipse.

Создадим тестовый проект и дадим ему очень «оригинальное» название HelloWorld.dpr.
Поставим себе за цель автоматизировать следующие рутинные операции:
формирование рабочего каталога проекта(configure);
компиляция проекта(compile);
создание билда проекта с автоинкрементальным счетчиком версии и внесением изменений в документацию(build);
очистка проекта от временных файлов(clean);
очистка каталога от необязательных каталогов и файлов(проще говоря, остаются только каталог исходных текстов, потому как бинарные данные и документация генерируются из них и не являются обязательной частью проекта)(purge);
архивация только исходных текстов программы с предварительной очисткой(distr.src);
подготовка архива билда программы, включая исходные тексты(distr.all);
диагностика скрипта с выдачей переменных окружения и текущих настоек(diagnostics);

Выбросил текст проекта. Некогда колдовать над вставкой тегов. Читайте в Архиве.

В общем-то на этом и все, как ни странно. Полный скрипт с подробными комментариями и проектом можно посмотреть в архиве. Целью данной статьи не являться обучение работы с Apache Jakarta Ant. Я хочу лишь обратить внимание аудитории на мощное, хорошо себя зарекомендовавшее и, что немаловажно, свободное средство с открытым кодом, способное существенно облегчить вам жизнь и труд.
При этом возможности не ограничиваются только функциями сборки проекта. Работа по протоколам FTP, HTTP может стать основой автоматической системы обновления, или инструментальным средством репликации. Возможно применение как корпоративного средства развертывания приложения, проще говоря, инсталятора и системы обновления внутри компании. Настраиваемой системы архивации. Выполнение SQL скриптов через JDBC также может существенно пригодится для разработки сервисных утилит обслуживания БД.
В общем не спешите разрабатывать велосипед, возможно он уже есть и давно ездит и нужно только подогнать его под ваш рост и вес ... цель же не разработать ... а просто доехать в пункт назначения.

Проект к статье:
helloworld_win32-build-11.zip


P.S. Архив не спрашивайте - утерян вместе с хостингом.

3 дек. 2007 г.

UIB+FastReport+Firebird

UIB2 для FastReport 3.x
Интеграция хорошего отчетера с хорошими компонентами доступа с хорошей базе данных.
Особенностью являеться поддержка мастер/детальных отчетов с помощью FBDataSet Алекса Лагунова, так как оригинальный датсет UIB не поддерживает такой функции.
Проверялось на UIB-2.1, FastReport-3.25, Firebird-1.5 Delphi-7
Вполене вероятно будет работать на FR4.

2 дек. 2007 г.

Firebird. Зоопарк доменов.

Хочется обратить внимание аудитории на использование доменов и их размерностей при написании баз данных под управлением СУРБД Firebird. Я думаю это в равной степени применимо и к другим серверам баз данных имеющим поддержку доменов.
Рассматривая DDL хранилищ разработанных другими девелоперами, мне всегда интересно сколько доменов использовано в БД и с какой целью. На основе этих наблюдений сложилось несколько моделей разработки, но ни одна из них не представляется мне концептуально законченной или же осознанно использованной.

Рассмотрим несколько стратегий принимающих участие в эволюции «зоопарка доменов»:
- каждое поле отдается под управление домена;
- создаться несколько подвидов доменов одного типа с различной размерностью(VAR64, VAR3, VAR255);
- домены создаться по типу поля, в который входит частично его название или супертип (TDESCRIPTION, D_NAME, DMONEY);
- только часть полей имеет домен часть;
использование доменов беспорядочно и хаотично, существуют поля у которых домен не указан;
- в доменах используются всевозможные экзотические типа : (NUMERIC, SMALLINT, CHAR);

Ка видно из этих тезисов можно выделить три основных характеристики управления доменами: именование, размерность, обязательность.
Отсутствие систематичность именования доменов может быть следствием разности подходов разработчиков, сопровождавших систему. В некоторых случаях разработчик просто не придает значения читабельности своего кода, так как работает над ним исключительно сам.

Что касаться размерности, то основной причиной для использования являться попытка «оптимизировать» хранение данных и «сэкономить» расход памяти. Такой подход может и был оправдан во времена когда компьютеры были большими, а объемы памяти маленькими. Но в нынешней реальности все изменилось с точностью до наоборот и нет особого смысла задумываться какого размера должно быть поле. В равной степени это относиться и к типу хранимых данных.

Контроль за корректностью размера вводимых данных, на мой взгляд, так же не является аргументом. Пример: МФО банка 6 цифр. Гораздо гибче является механизм следящих триггеров, нежели правка клиентского приложения в случае увеличения размера поля. Проще поменять триггер прозрачно для всех учасников процесса, чем изменить свойство Size у полей DataSet, созданных в режиме дизайна.

Сформируем основные правила:
- доменов минимально-досточное количество и ввод новых нежелателен, без крайней необходимости;
- каждое поле должно определиться с помощью домена;
домены именуются по правилам принятым в системе;
- для доменов отводятся типы имеющие максимальную емкость в своем диапазоне,
остальные типы не используются;
- строка длинной больше 255 символов – это текстовый BLOB;
- по возможности исключить неопределенность типа NULL в значении полей и задать значение «по-умолчанию»;
- контроль за корректностью данных производиться с помощью триггеров;

Домены именуются по правилу:
{T}{LOGICAL_DATATYPE}, где T префикс, обозначающий «тип»(ассоциация с нотацией классов Dephi), а LOGICAL_DATATYPE – название типа данных Firebird или логическое название типа данных.

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

/* <Домены> */

/**
Первичны ключ
*/
CREATE DOMAIN TPRIMARY AS
BIGINT
NOT NULL;

/**
Внешний ключ
*/
CREATE DOMAIN TFOREIGN AS
BIGINT
DEFAULT 0
NOT NULL;

/**
Целое число
*/
CREATE DOMAIN TINTEGER AS
BIGINT
DEFAULT 0
NOT NULL;

/**
Логическое значение
*/
CREATE DOMAIN TBOOLEAN AS
INTEGER
DEFAULT 0
NOT NULL
CHECK (VALUE BETWEEN 0 AND 1);

/**
Число с плавающей запятой
*/
CREATE DOMAIN TFLOAT AS
DOUBLE PRECISION
DEFAULT 0
NOT NULL;

/**
Дата
*/
CREATE DOMAIN TDATE AS
DATE;

/**
Время
*/
CREATE DOMAIN TTIME AS
TIME;

/**
Дата/Время
*/
CREATE DOMAIN TDATETIME AS
TIMESTAMP;

/**
Строки
*/
CREATE DOMAIN TSTRING AS
VARCHAR(255)
DEFAULT ''
NOT NULL;

/**
Большие текстовые и бинарные данные
*/

CREATE DOMAIN TBINARY AS
BLOB SUB_TYPE -1;

CREATE DOMAIN TTEXT AS
BLOB SUB_TYPE -2;

/* */

Поскольку Firebird не поддерживает логических полей то домен TBOOLEAN вводиться в случае использования библиотек, которые имитируют данный тип с помощью собственных типов полей набора данных(FIBPlus).

В некоторых случаях набор может быть расширен доменом для определения специфических типов данных.
Например GUID, TGRAPHIC или TXML. Суть этих доменов состоит в особенно способа обработки их на клиенте такими библиотеками как, например, Devrace FIBPlus. Технология локальных фильтров позволяет преобразовывать данные при записи/чтении. В этом случае BLOB SUB_TYPE должен быть отрицательным, так как положительные значение зарезервированы под системные нужды самой СУРБД.

Несколько замечание по поводу политики значений «по-умолчанию». Логика работы с NULL значениями довольно непроста. Порядок сравнения, сортировки, оптимизации и хранения и т .д. Причем она различается на разных серверах баз данных. Поэтому, чтобы отбросить добрую долю неопределенности и проблем с переносом между СУРБД и оптимизацией производительности, необходимо просто избавиться от NULL значений. Поэтому каждый
домен по возможности предопределяется как NOT NULL и задается DEFAULT значение.

Поля, основанные на доменах TDATE, TTIME, а также TDATETIME при необходимости
требуют инициализации в триггере: CURRENT_DATE, CURRENT_TIME и CURRENT_TIMESTAMP соответственно.

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

Если строковые значения не помещаются в размерность домена TSTRING, то в этом
случае делается поле на домене TTEXT (BLOB).

Итак: TPRIMARY, TFOREIGN, TINTEGER, TSTRING, TBOOLEAN, TDATE, TTIME, TDATETIME, TTEXT, TBINARY.

Вот и весь джентльменский набор доменов.

15 окт. 2007 г.

Google Talk & Miranda

Все чаще мои знакомые с головой уходят в GTalk.

Аргументация простая:
- быстро;
- удобно;
- не требует установки клиентов, достаточно только браузера;
- история чата храниться на сервере и доступна из любой точки где есть интернет;

ИМХО последнее может бить и минусом если интернета НЕТ!

... но многие остаються на ICQ и даже на других еще более экзотичных месагерах. И что же мне делать ? Ставить клиент каждого и целый день жонглировать окошками ?

Выход есть! "Швейцарски перочинный нож" в среде месенжеров на Windows - Miranda-IM.

Тут рассказывается как настроить Miranda-IM для работы с Google Talk по протоколу Jabber. Никаких специальных плагинов для GTalk для этого не требуется.

* Username: Your Google Talk username (without any @ symbol or domain information)
* Password: Your password
* Login Server: gmail.com

* If you're signing in with a Google Account that's not linked to any Google email service, enter gmail.com
* Google Mail accounts should enter googlemail.com
* Google Apps users, please visit the Apps Help Center for instructions.

* Use SSL: Yes
* Manually specify connection host: Yes
* Host: talk.google.com
* Port: 5223
* Keep connection alive: Yes


10 окт. 2007 г.

Учимся на примерах

http://www.tutorialized.com/
Довольно "светленький" сайт у туториалами самых разных напралений. От 2D/3D графики и WebDevelopment до бизнес приложений и операционных систем.

Очень приятный дизайн хоть и перегруженный банерами.

Энциклопедия склеротика или как сбросить вес

Вы где нибудь видели программиста, который бы писал только на одном языке? Вы можете подсчитать сколько весит его словарный запас в бумажном эквиваленте? Я сам это сделать затрудняюсь, но думаю что очень даже немало.
Лично я не собираюсь таскать за собой этот груз знаний и бумаги. Потому воздайте должную хвалу людям, которые безвозд... безвоздмезднд ... тьфу ... короче нахаляву проделали для вас труд и создали поисковый портал по спецификациям и функциям различных языков программирования и технологий. Got API
Данный сервис позволяет не только искать информацию по интересующей вас функциональности, но так же предоставляет возможность позаимствовать свою функциональность в виде виджетов.
Поисковую форму по Java 1.5 вы можете испытать в действии прямо тут.

Картины Идеального Мироустройства

При идеальном мироустройстве спать ночью запрещается. Если человека застали за тем, что он спит ночью, его немедленно сажают в Концлагерь.
В Концлагере каждое утро этот человек должен приходить ровно в семь часов утра на работу и восемь часов подряд вращать Ручку. Ручка торчит из стены, с обратной стороны гайка. Если человек опаздывает на работу хотя бы на одну секунду или плохо вращает Ручку, то его тогда из Концлагеря прогоняют на все четыре стороны и назад даже не просись. Если же он вращает Ручку хорошо, то его переводят на повышение, где нужно вращать уже две Ручки в разные стороны и с разной скоростью. ...
(C) Дмитрий Горчев


Да что там говорить читайте сами на http://gorchev.lib.ru/ . Картина называется "Блядь". no comments

6 окт. 2007 г.

Убираем панель навигации в blogger

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

Получается панель нужна, но не всем и не всегда. Отсюда вывод: панель должна включаться опционально.
Методика достижения поставленной цели следующая:
- создаем новый HTML/JavaScript блок;
- помещаем в него стиль для панели, который выключает у нее видимость и размер;
- JavaScript для включение/выключения панели навигации;
- делаем ссылку и прописываем событие onClick в котором запускается скрипт;

<style type="text/css">
#navbar {visibilityhiddendisplaynone;} 
</style>

<
script type="text/javascript">
       function toggleElementVisibilityById(elementId) {
        var 
element=document.getElementById(elementId);
        
if (element) {
           with
(element) {
             if 
(style.visibility != 'visible'{
               
style.visibility = 'visible';
               style.display = 
'block';
             
} else {
               
style.visibility = 'hidden';
               style.display = 
'none';
             
}
           }
        }
    }
</script>
<
href="#" onclick="toggleElementVisibilityById('navbar'); 
return false;"
>Панель навигации</a>


Итак в настройках макета создаем новый блок и вставлемя даннй код. Причем код будет действовать не только в это блоке. В этом можно убедиться например щелкнув тут.

Колобки жгут нипадетцки


Изначально блог открывался для чисто технических тем. Так же он будет использоватся и в будущем.
Но после того как я посетил сайт колобков решил завести категорию <Бирюльки>. Туда я буду собирать всякие интересности и вкусности.
Подумываю создать категории <Музыка> и <Книги>. Слишком часто начали задавать вопрос о моих музыкальных и литературных вкусах. Я думаю места хвати для тем всяикх и разных.
Сайт авторских смайлов
http://www.kolobok.us

5 окт. 2007 г.

Жирный бибизъян

Creasemonkey - расширение для браузера Mozilla Firefox позволяющее менять внешний вид и вносить дополнительную функциональность в код web-страниц.

Домашняя страница
Каталог скриптов
Документация+быстрый старт

Дизайн блога

Уже одно то, что человек по тем или иным причинам заводит себе блог, говорит о его желании выделиться в толпе слоняющихся по просторам сети серферов. Итак серфер превращается в блогера. Обычно, заводя блог и отвечая на вопрос "выбрать дизайн", берется первый попавшийся шаблон из стандартных. Но после не скольких постов возникает желание также выделиться в толпе блогеров. Как поступает обычный человек когда желает привнести новизну в свое жилище ? Правильный ответ - меняет дизайн и двигает мебель. Одним осенним вечерои желание, что-то изменить в жизни пришло и Вашему покорному слуге. И начал я с блога ...

Итак знакомтесь: новый дизан блога "аля огнелис" + сворачивание длинных постов "под cut"

Для начала подборка ресурсов. Другими словами "советы бывалых" и склад стройматериалов.

Сайты по тюнингу блогов:
http://hackosphere.blogspot.com/
http://blogger-hacked.blogspot.com

Шаблоны:
www.geckoandfly.com
www.blogcrowds.com
www.freeblogspottemplates.blogspot.com
www.facesofyve.com
www.psyc.horm.org
www.finalsense.com
www.bloggertemplates.org
www.pannasmontata-templates.net
www.blogger-templates.blogspot.com
www.blogskins.com
www.templatepanic.com
www.notlarvenotalar.blogspot.com

www.erisfree.com
www.freeskins.blogspot.com

Blog Templates
Blogger Template List
Classic Templates
Free Templates
Blogger templates
Gecko&Fly
Blogger Templates By Caz
Faces of Yve
Notlar ve Notalar
TemplatePanic
Final Sense
Free Blogger Template

Более конкретные фичи я думаю продолжить описывать отдельными постами.

21 сент. 2007 г.

Java.swt.jface. Таблицы, Списки, Деревья

При переходе от программирования баз данных в Delphi возникло естественное желание сделать тоже самое в Eclipse. Возник вопрос вывода набора данных из базы на екран. Основным набором средств для построения пользовательского интерфейса для RCP в Eclipse является библиотека SWT и дополняющий ее фреймворк JFace.
Навыки работы с основными компонентами(кнопки, текст, группы) были получены на основе статей на ibm.ru. А вот списк и таблицы с ходу как-то не дались. Машинальное повторение снипетов и примеров давало желаемый результат, но вот понимание никак не приходило.
Легче всего будет понять идею тем, кто работал с компонентом VirtualTreeView. В этом компоненте было мало визуальщины, но зато гибкость и примеры выложенные на сайте просто завораживали. Смело могу сказать, что после стандартной реализаци дерева в Delphi, это клмпонент стал откровением. Возможно он заслуживает отдельного поста.
Итак основная идея слежующая.
Список характеризуетсся входным потоком данных и двумя объектами, реализующими интерфейсы ILabelProvider и IStructureContentProvider. первый из них отвечает за управление потоком данных, второй за декорирование(сопоставление текста, картинок и и.д.).

Список получает входной поток данных, например List или ArrayList, ContentProvider преобразует его в массив и по одному скармливает в LabelProvider, который и определяет какой текст будет отражен и с каким изображением.

Можно конечно навеситься на слушатель получание данных, но такой вариант нельзя использовать повторно в отличии от провайдеров.

Особняком стоит работа с виртуальными таблицами. Тоесть когда данные запрашиваються провайдером по мере прокрутки таблицы.

Как получить в таблицу данные из БД? Да легко. Хоть бы так как описано в посте про iBATIS. Как вариант Hibernate.

Пакет с иходными текстами будет выложен в ближайшее время

20 сент. 2007 г.

Java. iBATIS

iBATIS – ORM фреймворк от Apache Faundation. Все функции мапирования объектных свойств на SQL предложения, соединения с базой данных и управления транзакциями берет на себя iBATIS.

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

Существенно упрощается так же перенос приложения между серверами БД, так как практически вся специфика работы с SQL вынесена из основного кода в xml и properties файлы и не повлечет его перекомпиляции.


В общем случае для демонстрации работы понадобятся несколько файлов:

sqlMap-config.xml – ключевой файл конфигурации, в нем подключаються текстовые ресурсы, конфигурационные файлы доменов(объектов), общие настройки соединения.

Person.xml – конфигурационный файл для домена Person, содержит SQL предложения и правила их мапирования на свойства домена.

database.properties – параметры соединения с базой данных(Apache Derby)

AplicationSqlConfig.java – основная точка входа для работы с интерфейсом com.ibatis.sqlmap.client.SqlMapClient, сконфигурированным файлом sqlMap-config.xml

Person.java – класс-домен с поименованными свойствами get/set для инкапсуляции логики работы с объектами, на него будут мапироваться данные из базы данных, указанные в файле Person.xml.

Application.java – класс, содержащий функцию main() и служащий точкой запуска приложения.

Файл создания базы данных

CONNECT 'jdbc:derby:./persons;create=true';

CREATE SCHEMA DEP;

CREATE TABLE DEP.PERSON (
ID BIGINT GENERATED ALWAYS AS IDENTITY,
FIRST_NAME VARCHAR(255),
LAST_NAME VARCHAR(255)
);
EXIT;

Настройка и работа Apache Derby уже рассматривалась в предыдущих постах.

Результаты работы приложения будут примерно такими

З.Ы. Данный пример можно оформить в виде приложения используя для написания пользовательского интерфейса JSP/JSF и развернув на Apache TomCat. Или же чтобы не мелочится то сразу на сервера приложений Apache Geronimo.

Таблицу можно отобразить элементарно замапив список получаемый методом sqlMapClient.getObjectList() тегом JSP . Минимальными будут также затраты на редактирование, потому как JSF мапит поля ввода на свойства объекта и далее остается только вызвать соответствующие методы sqlMapClient insert/update

Операционная система: Linux XUbuntu 7.04
Среда разработки: Eclipse Europa(WTP, DTP)

Для работы с eclipse существует плагин AbatorForEclise облегчающий генерацию примитивов iBATIS.

Файл проекта: com.devrona.ibatis.tutorial.jar


18 сент. 2007 г.

На “Волю” с чистой совестью

http://volia.com
Этот киевский провайдер предоставляет довольно качественный интернет.
Но что делать если модем один, а рабочих станций в доме две и больше?
А что если хочется пользоваться интернетом не только в рабочей комнате , но и на кухне?
ADSL-модем фиксирует MAC адрес сетевой карты. При переключении с одного компьютера на другой приходится каждый раз перегружать модем, чтобы он «забыл» этот самый адрес. А учитывая то, что операционные системы рабочих станций могут кардинально различаться(Windows, *nix) и способ восстановления подключения довольно специфичен для каждой из систем, можно смело делать вывод, что проблема «таки имеет место быть».
Выходом может быть получение услуг по WiFi. Но по скольку получать их просто нечем(устройства WiFi на рабочих станциях отсутствуют) и «прикинув» их примерную стоимость, от такого решения пришлось отказаться. К тому же это решит проблемы раздачи коннекта и маршрутизатор все равно понадобится.
Рецепт следующий. Берем немного денег и покупаем маршрутизатор. Я себе выбрал Edimax BR−6104K.
Причин несколько: рекомендации друзей(привет, Слава :-) ! ), встроенный DHCP, firewall, NAT, удобный WEB интерфейс. По секрету скажу, что внутри там живет Линукс и желающим поковыряется «внутрях», как говорится «милости прошу». Не хочу пересказывать всех достоинств и недостатков, тем более, что это давно уже сделано на iXBT.
Меня как довольно разборчивого потребителя сервиса подкупило конечно же и обслуживание на фирме «Агатис» - поставщике данного девайса. После короткого общения с ICQ- консультантом, выяснения подробностей и технических деталей, было принято решения воспользоваться услугой курьерской доставки. Учитывая городские расстояния, потраченное время и нервы такой вариант весьма выгоден. Итак через 3 часа коробка с прибором уже была меня в руках.
А дальше все просто. Кабель от модема вставляться в гнездо WAN маршрутизатора. На задней панели находиться четыре разъема для подключения рабочих станций. Именно туда и вставляться пачкоды. соединяющие маршрутизатор и сетевые карты всех желающих «выйти на Волю».
Вот и все. У меня все заработало без дополнительных настроек.
З.Ы. Если вы все таки планируете в будущем обзавестись WiFi принимающими устройствами, то покупайте сразу BR-6216

17 сент. 2007 г.

Java. TomCat

TomCat – программа-контейнер сервлетов, написанная на языке Java и реализующая спецификацию сервлетов и спецификацию JavaServer Pages (JSP), которые являются стандартами для разработки веб-приложений на языке Java.

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

Разрабатывается фондом Apache Software Foundation под лицензией Apache License и является программой с открытым исходным кодом.

Tomcat используется в качестве Servlet-контейнера в сервере приложений JBoss.

Установка

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

# Берем файлы дистрибутива и деплореера
# Деплоер понадобиться для развертывания приложений

download http://tomcat.apache.org/
apache-tomcat-6.0.14.tar.gz
apache-tomcat-6.0.14-deployer.tar.gz

# Распаковываем содержимое обеих архивов в созданный каталог
# Например: /usr/local/tomcat

В принципе установка на этом завершена.

Конфигурация

# Файл /usr/local/tomcat/conf.tomcat-users.xml

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

Запуск

$ /usr/local/tomcat/bin/startup.sh

Проверка

# В строке браузера набираем

http://localhost:8080

Если на экране видим страницу с изображением рыжего кота и перышка Apache Software Faundation, то значит все получилось. Удачи!


16 сент. 2007 г.

Java. Hello world!!!

Для начала необходимо настроить Java. Заходим на сайт компании Sun и скачиваем пакет для установки JDK. В принципе для запуска программ достаточно было бы и JRE. Но поскольку мы собираемся заниматься разработкой, то JDK будет предпочтительней. В состав JDK входят ряд полезных утилит, которые понадобятся нам в будущем.
Создаем каталог для установки, даем бинарному файлу исталятора права на запуск, запускаем и настраиваем переменные окружения.
download jdk-1_5_0_12-linux-i586.bin
$sudo mkdir /usr/local/java
Установка
$ sudo chmod u+x ./jdk-1_5_0_12-linux-i586.bin
$ ./jdk-1_5_0_12-linux-i586.bin
Конфигурация
файл: $HOME/.profile
# Домашняя директория JDK
export JAVA_HOME="/usr/local/java/jdk1.5.0_12"
# Домашняя директория JRE
export JRE_HOME="$JAVA_HOME/jre"
# Путь системного поиска файлов
export PATH="$PATH:$JAVA_HOME/bin"
# Путь для поиска классов Java
export CLASSPATH="$CLASSPATH:$JAVA_HOME/lib"
Перегружаем X-Windows, для того, чтобы переменные вступили в силу.
Ctrl+Alt+Backspase
Проверяем
$man javac
Если на экране мы видим текст справки, то значит мы все сделали правильно.

HelloWorld
# Создаем файл для будящей программы HelloWorld
$touch ./HelloWorld.java
# Пишем нижеследующий текст
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
# Компилируем написанную программу
$javac ./HelloWorld.java
# Запускаем
$java HelloWorld
# Получаем результат на экране
Hello world!
Поздравляю! Первый шаг в сторону мира Java сделан.

7 сент. 2007 г.

Ржунимагу. Проза жизни.

[Elena] Алексей, ваша программа опять не работает! Достало уже! Я буду жаловаться.
[polecat] Добрый день, в чём выражается проблема?
[Elena] Не парьте мозги, программа не работает! Исправьте! У меня работа стоит!
[polecat] Для того чтобы исправить программу, для начала мне нужно узнать, что вы понимаете под проблемой.
[Elena] У меня уже очередь в 10 человек!
[polecat] Это проблема?
[Elena] Проблема!
[polecat] Это проблема моей программы?
[Elena] Какая разница? Вы будете исправлять программу?
[polecat] Буду, но вы можете хотя бы пару раз ответить на поставленные вопросы?
[Elena] Я вам оракул, что ли на вопросы отвечать? Я в вашей программе ничего не понимаю.
[polecat] Скажите только, что именно работает не так.
[Elena] Ну вы же писали программу!
[polecat] БЛЯТЬ, УБЕЙ СЕБЯ!
[Elena] ???
[polecat] УБЕЙ СЕБЯ, СЦУКО!
[Elena] Попрошу не хамить!
[polecat] СЛУШАЙ МЕНЯ, СЦУКО, ОБЩАТЬСЯ БУДУ ТОЛЬКО С ВАШИМ ДИРЕКТОРОМ, А ТЫ ИДИ НА ХУЙ, И ПУСТЬ ТЕБЯ ТАМ ЕБУТ МЕДВЕДИ!!!
[Elena] Алексей, это Андрей Сергеевич! Программу только что проверил - всё работает. С твой путевки валяемся падсталом, похоже Лену туда и отправим, снабдив вазелином. ;)

1:00:18: времени час ночи (C) ХЗ

5 сент. 2007 г.

Склерозник по Java/WEB. Wikipedia

Tomcat (в старых версиях — Catalina) — программа-контейнер сервлетов, написанная на языке Java и реализующая спецификацию сервлетов и спецификацию JavaServer Pages (JSP), которые являются стандартами для разработки веб-приложений на языке Java.

EJB(Enterprise JavaBeans) (также часто употребляется в виде аббревиатуры EJB) — спецификация технологии написания и поддержки серверных компонент, содержащих бизнес-логику. Является частью J2EE.

JSP(Java Server Pages) — технология, позволяющая веб-разработчикам динамически генерировать HTML, XML и другие веб-страницы. Является составной частью единой технологии создания бизнес-приложений J2EE. Технология позволяет внедрять Java-код, а также EL (expression language) в статичное содержимое страницы. Также могут использоваться библиотеки JSP тегов для внедрения их в JSP-cтраницы. Страницы компилируются JSP-компилятором в сервлеты, представляющие собой Java-классы, которые выполняются на сервере. Сервлеты также могут быть написаны разработчиком, не используя JSP-страницы. Эти технологии могут дополнять друг друга.

JSF(Java Server Faces) включает:
Набор API для представления компонент пользовательского интерфейса (UI) и управления их состоянием, обработкой событий и валидацией вводимой информации, определения навигации, а также поддержку интернационализации (i18n) и доступности (accessibility).
Специальная библиотека JSP тегов для выражения интерфейса JSF на JSP странице.
Разработанная быть гибкой, технология JavaServer Faces усиливает существующие, стандартные концепции пользовательского интерфейса (UI) и концепции Web-уровня без привязки разработчика к конкретному языку разметки, протоколу или клиентскому устройству.

JSTL(JavaServer Pages Standard Tag Library) — в переводе с английского «стандартная библиотека тегов JSP». Она расширяет спецификацию JSP, добавляя библиотеку JSP тегов для общих нужд, таких как разбор XML данных, условная обработка, создание циклов и поддержка интернационализации. JSTL — конечный результат JSR 52, разработанного в рамках JCP(Процесса Java сообщества).

8 мая 2006 был выпущен релиз JSTL 1.2

JSTL является альтернативой такому виду встроенной в JSP логики, как скриплеты, то есть прямые вставки Java кода. Использование стандартизованного множества тегов предпочтительнее, поскольку получаемый код легче поддерживать и проще отделять бизнес-логику от логики отображения.

JBoss — J2EE сервер приложений с открытым исходным кодом.
JBoss разработан одноимённой компанией и на сегодняшний день фактически является самым популярным и мощным решением с открытым исходным кодом в данной области. Как и многие открытые программы, разрабатываемые коммерческими организациями, JBoss относится к классу условно-бесплатных продуктов, то есть его можно свободно загрузить и использовать, однако поддержка и консультации осуществляются за деньги. Условная бесплатность и достаточно хорошая реализация принципов J2EE делает JBoss конкурентом для аналогичных коммерческих программных решений других компаний, таких как WebSphere или WebLogic.
В качестве веб-сервера JBoss использует Tomcat.

AJAX (от англ. Asynchronous JavaScript and XML — «асинхронный JavaScript и XML») — это подход к построению интерактивных пользовательских интерфейсов веб-приложений. При использовании AJAX веб-страница не перезагружается полностью в ответ на каждое действие пользователя. Вместо этого с веб-сервера догружаются только нужные пользователю данные. AJAX — один из компонентов концепции DHTML.

ORM(Object-relational mapping), (русск. Объектно-реляционная проекция) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных».

19 авг. 2007 г.

Лезем в паутину. XUbuntu - настройка интернета

Данная статья является следствием того, что мне все таки удалось выйти на Xubuntu в интернет.

Это первая статья которую я пишу уже в OpenOffice 2.2.0 for Linux и публиковать ее буду в Firefox 2.0 for Linux. Как говориться OpenOffice он как велосипед: один раз научился и уже неважно на какой оси ты катаешься Win, Mac или *nix. Тоже самое относиться и Firefox.

Так вот выйти в мировую паутину получилось совсем не сложно. Вернее даже на удивление просто.


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


Правим

/etc/network/interfaces

...

auto lo

iface lo inet loopback

auto eth0

iface eth0 inet dhcp




Перегружаемся

sudo reboot

Мне правда еще пришлось перегрузить модем.

Для теста пинг по названию хоста

ping -c 5 mail.ru

PING mail.ru (194.67.57.26) 56(84) bytes of data.

64 bytes from mail.ru (194.67.57.26): icmp_seq=1 ttl=117 time=100 ms

64 bytes from mail.ru (194.67.57.26): icmp_seq=2 ttl=117 time=100 ms

64 bytes from mail.ru (194.67.57.26): icmp_seq=3 ttl=117 time=95.8 ms

64 bytes from mail.ru (194.67.57.26): icmp_seq=4 ttl=117 time=103 ms

64 bytes from mail.ru (194.67.57.26): icmp_seq=5 ttl=117 time=101 ms

--- mail.ru ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4011ms

rtt min/avg/max/mdev = 95.842/100.572/103.671/2.626 ms


Пинг по IP

ping -c 5 <вставить IP http://ya.ru>

...


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

$ sudo /etc/init.d/networking restart

В случае если бы не прошел первый тест, а второй прошел возможно пришлось бы решать проблемы с DNS. Но в моем случае все завилось с пол пинка.

Спасибо SlavaD за помощь и проявленное терпение, а так же недюжинные телепатические способности ;-)


З.Ы. (мысли вслух) ... тутошний интернет то заметно быстрее виндового ...

Восстанавливаем загрузчик GRUB

Предыстория следующая. Были установлены две системы Windows XP и Xubuntu 7.4. После некоторого времени понадобилось переустановить Windows. Поле этого пропала возможность загружать обе системы с помощью загрузчика GRUB. Windows имеет препротивную привычку затирать MBR при инсталляции где и помещался до этого GRUB.

После некоторых попыток самостоятельно решить данную проблему присутствующими в сети и присоветованными способами было выявлено, что существует известная проблема с выполнением команды chroot над корневым разделом Linux, который монтируется Live-CD автоматически при загрузке. Точнее все время не хватало прав на выполнение этой команды даже с правами root. После некоторого потраченного времени на «гугление» был выработан следующий алгоритм.

От стандартного он отличается только тем, что корневой раздел Linux монтируется самостоятельно.

Итак:

  • Загрузиться с Live-CD
  • Перейти в консоль Ctrl+Alt+F1
  • Смотрим информацию о разделах и получаем корневой раздел Linux - /dev/hdaX, где X - номер корневого раздеа (у меня - /dev/hda3)
sudo fdisk -l /dev/hda
Диск /dev/hda: 40.0 Гб, 40007761920 байт
255 головок, 63 секторів/доріжку, 4864 циліндрів
Одиниці виміру = циліндри з 16065 * 512 = 8225280 байт

Пристрій Завант Початок Кінець Блоків Ід Система
/dev/hda1 * 1 1141 9165051 7 HPFS/NTFS
/dev/hda2 1142 3386 18032962+ 5 Extended
/dev/hda3 3387 4864 11872035 83 Linux
/dev/hda5 1142 2358 9775521 7 HPFS/NTFS
/dev/hda6 2359 3314 7679038+ 7 HPFS/NTFS
/dev/hda7 3315 3386 578308+ 82 Linux swap / Solaris
  • Создать каталог /media/a

sudo mkdir /media/a

  • Смонтировать /dev/hdaX в /media/a

sudo mount /dev/hdaX /media/a

  • Смонтировать /dev/ в /media/a/dev/

sudo mount --bind /dev/ /mdeia/a/dev/

  • Переключить корневой раздел на смонтированный /media/a

sudo chroot /media/a

  • Выполнить update-grub
  • Выполнить grub-install /dev/hda
  • Выполнить sync (сброс буфера файловой системы)
  • Выполнить reboot

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

Спасибо Google за предоставленную информацию.

18 июн. 2007 г.

Средства автоматического форматирования

Надо сказать, что основным моим средством разработки является Borland Delphi for Win32.

Мое первое знакомство со средствами автоматического форматирования кода состоялось в среде Eclipse поддерживаемой компанией IBM. Используя метод погружения в изучении новой среды разработки и привыкая к несколько отличной аннотации Object Pascal и Java в справочнике по Eclipse нашел упоминание о возможности автоматического форматирования. С этого момента дело пошло несколько проще. Хотя среда весьма на высоком уровне поддерживает уровень шаблонов иногда в совсем уже патовых ситуациях при сложных конструкциях помогало магическое сочетание клавиш Ctrl+Alt+F и все становилось на свои места.

Естественно, что ко всему хорошему привыкаешь очень быстро. Это очень прискорбно но среда Borland Delphi вплоть до версии BDS 4.0(Delphi 2006) не обладает встроенными средствами форматирования кода. Поддержка шаблонов языковых конструкций не в счет.

Основными фаворитами после недолгого поиска среди свободно распространяемых продуктов стали GExpert CodeFormatter и JEDI JCF. Первый находился в экспериментальной стадии и заметно проигрывал второму в количестве настроек. Хотя вполне мог бы удовлетворить потребности менее притязательного пользователя нежели я.

JCF заслуживает более пристального внимания.

Надо сразу отметить, что JCF работает только при условии установленной библиотеки JEDI



Jedy code format by Ralf Steinhaeusser

http://jedicodeformat.sourceforge.net/

Форматирование кода

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

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

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

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

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

Есть две большие разницы между оценкой учителя, к которой ученик относится заведомо предвзято и оценкой «однопесочника», который отказывается разбирать ваши каракули.

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

Читабельность кода зависит от документирования, а документирование от читабельности. Решением согласования такой неоднозначности являться самодокументируемость кода. Тоесть код становиться единственным источником документации. Кроме случаев автоматического построение отчетов и диаграмм сторонними средствами на основе программного кода. Например: диаграмма классов, метрики, файлы справки в различных форматах.

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

Ситуация первая:

единый стиль кодирования не соблюдается и документация на код отсутствует

Действия программиста:

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

Ситуация вторая:

единый стиль кодирования соблюдается всеми, документация на код отсутствует

Действия программиста.

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

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

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

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

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

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


Польза стандартов

Однажды отец подарил мне гармошку на которой до этого играл человек у которого осколком оторвало два пальца на правой руке. Аккорды были перестроены под оставшиеся три. Эта гармошка так и осталась лежать на чердаке, вещь красивая, но совершенно бесполезная, так как у меня с руками было все в порядке и желание приспосабливаться и привыкать к неудобному мне инструменту быстро пропало. Это я к тому, что пока вы пользуетесь “заточенными” под себя вещами, это ваше личное дело, но когда эти вещи попадают во внешний мир, то могут быть выброшены на свалку из за своей нестандартности. Ситуация может быть прямо противоположной, если вы достаточно нестандартный и сильный человек, чтобы доказать преимущества своего подхода.

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

15 июн. 2007 г.

Король умер, да здравствует король!!!

Вот к сожалению накрылся мой платный хостинг. Не то, чтобы очень сильно по карману бил, а просто весьма неудобно покупать вебмани или заводить себе карточки интернет денег. Все время забывал проплатить. Ну в общем это уже в прошлом. Админы позволили скачать архив и на том им огромное спасибо. Вот тут я и открыл для себя гугль(спасибо Николаю Войнову :-) Привет, Коля!). Как оказалось все, что нужно для нормального блога у гугля уже есть. Небольшой проблемой оказалось место для хранения прикрепленных файлов, относящихся к статьям, но и в этом случае у гугля нашлось решение.


Заходим на http://code.google.com/ дальше в меню Project Hosting и создаем себе новый проект Create a new project


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


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

Первым жителем нового проекта стал небольшой гайд по Apache Derby. Продолжение следует.

В общем добро пожаловать! Я к вам и буду у вас жить.


Пособия для "чайников"

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

Жаль не было с собой телефона, чтобы сфотографировать.

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

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


Возникают два философских вопроса.


Почему есть книги подобного рода, а так же «Delphi за 24 дня», «Java для «чайников»?

Почему нету книг «Фортепиано для чайников» или «Скрипка за 24 часа»?


Заплачу 10$ тому, кто укажет мне книжку «Написание технических заданий за 36 часов»

22 февр. 2007 г.

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

Работодатель думает, что программисты на периферии дешевые,
а столичные зажрались и дерут втридорога. Вооружившись модной нынче идеей
аутсорсинга, отдают свои ключевые проекты на сторону.
В одной из крупных компаний, с которой мне довелось сотрудничать, именно так и произошло.
Вместо того, чтобы мотивировать собственных сотрудников дополнительным заработком,
было принято решение отдать часть проекта в этот самый аутсорсинг. Быстро нашлись желающие.
Некоторые, узнав цену сразу отказывались, но на каждый товар есть свой покупатель.
Нашлись желающие заработать и такие деньги.
В результате программа на пару форм и десяток таблиц получилась эдаким корявым «квадзимордиком»,
сопровождение которого легло на, и без того загруженные, плечи штатных разработчиков.
То, что творили сие чудо люди далекие от программирования, было видно невооруженным глазом.
Дело, значит, было на Delphi и базе бесплатной, но добротной.

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

А еще добры молодцы-разработчики недоглядели и написали кросс-платформенный клиент для этой
базы, задействовав для этого модули с приставками Q после чего к этому клиенту навеки прилепился
некрасивый паровоз в виде 4-метрового qtintf70.dll. Этот .dll он стал вынужден таскать за собой, потому
как ему резко «плохело» если того рядом не оказывалось.

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

Грамота у родителей клиента вообще хромала. Нет, она была хорошей, но хромала. Потому и писали
как могли, путая большие буквы с малыми, иногда строки уходили в бесконечность, за пределы экрана, иногда процедура своими корнями пробивала рабочий стол программера, а то и в подвал забредала.
В общем, слово «рефакторинг» было либо совсем им не ведомо или считалось страшным ругательством.

Кинулись пользователи импорт данных творить. Десять минут ждут, двадцать ждут. Устали. Ушли курить нервно да чаи гонять. Уж и чашки помыли, клиент все висит, да сервер «колбасит» неистово. Тут гром грянул, сверкнула молния тряхнуло компьютер от самого монитора до системника. Это добрый молодец электрик проводку чинил. Перегрузился бедный комп. Глянули бедные пользователи в базу, а там мусору – видимо-невидимо. Это часть данных перекочевала в базу да там и осталась.
А не делали бы господа разработчики «комит» после каждой записи, не трудили бы сервер – глядишь, оно бы и дело скорее делалось, и сказка скорее сказывалась. Да и мусор бы на базе при всяких форсмажорах не оседал.

Погоревали добры молодцы, штатные программеры. Ну да горю слезами не поможешь. Вооружились острыми ножничками, повязочки одели, чтобы духу дикого мяса не чуять и начали кромсать бедного клиента.
Где кровь дурную пустили, взрезав опухоль толстых битмапок перекроив на джипеги.
Где деструкторов дописали, чтобы клиенту аппетит поумерить. Пообрезали модульки с приставкой Q и
ампутировали злосчастный qtintf70.dll .

Клиент конечно красавцем не стал, но заметно похудел и окреп. Уже не спотыкался на ровном месте.
Да и база постройнела, сбросила вес и перестала страдать отдышкой. Кишечки конечно у нее перепутанными остались, ну да тут уже ничего не поделаешь, они ведь с клиентом, как сиамские близнецы, тронешь одного – и второму больно делается.

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

Вот такая невеселая история буржуйского семени «аутсорсинг» взращенного и мутировавшего
на родной земле в сорняк не полотый...

А моралей этой сказке несколько. «Дешева рыбка, та погана юшка». От дешевизны страдает качество.
Умельцы с периферии дешево не возьмут, а неумехи хорошо не сделают. А те, что в столицу перебрались
оттого и недешевы, что дело свое знают.

Copyright Roman V. Babenko aka romb, 2007