вторник, 10 ноября 2009 г.

JRuby и логи 2

Я уже писал, что для логирования в jruby я использую Logging. Сегодня обновил эту библиотеку до версии 1.2.2. И как оказалось ей для работы требуется еще одна дополнительная библиотека - little-plugger. Это уже третья дополнительная библиотека. Что-то многовато...

понедельник, 7 сентября 2009 г.

Докатились...

Вчера, спускаясь в подъезде по лестнице, мы с женой взглянули в окно и увидели несколько мальчишек 7-8 лет, которые стояли прямо перед подъездом и... курили. Когда мы вышли из подъезда, мальчишки бросились в рассыпную. Сигарета была одна на всех, но от этого не легче. Мне вот интересно, что их сподвигло на это? Желание быть взрослым?

среда, 26 августа 2009 г.

Как найти себя?

Очень понравилось высказывание Олега Сатова:
Вопросов об этом задается много — «Как найти себя? Как найти работу по душе? Как достичь успеха?» Ответ на все эти вопросы один — изучайте и следуйте за собственными интересами. Делайте то, что нравится ВАМ, даже если это идет вразрез с тем, чего от вас ожидают окружающие. Это единственный способ быть в миру с собой и при этом занять свое место в жизни, в том числе и социальной.
Полностью с ним согласен.

среда, 29 июля 2009 г.

Разработчики JRuby переезжают

Сегодня новостная лента пестрит сообщениями о том, что разработчики JRuby ушли из Sun в Engine Yard. В одном из сообщений есть предположение, что после покупки Sun'а Oracle'ом некоторым продуктам Sun грозит исчезновение, в том чимле и JRuby. Что ж, если это так, то надеюсь этот шаг позволит не исчезнуть JRuby.

пятница, 24 июля 2009 г.

JRuby - новая версия и новый сайт

Зашел я на сайт JRuby и увидел, что дизайн-то сменился. Надо сказать, что очень красиво получилось.

Кроме этого, увидел, что уже больше месяца назад вышла новая версия - 1.3.1. Что-то я стал пропускать события из мира JRuby. Несмотря на то, что в новой версии сайта появилась иконка RSS, самого RSS на сайте до сих пор нет :(

UPD
Начал копаться на сайте и нашел ссылку на блог JRuby Team Blog, который появился чуть раньше выхода JRuby 1.3.1. Подписался на RSS этого блога.

пятница, 17 июля 2009 г.

Валидаторы в JVCL. Часть 2

Начало в предыдущем посте.

Валидация с помощью JvValidators

У компонента JvValidators реализуем обработчик события OnValidateFailed. Обработчик предназначен для вывода сообщений об ошибке и может выглядеть так:
RichEdit1.Lines.Add(Format('%s',[BaseValidator.ErrorMessage]));
Естественно, вместо RichEdit можно взять любой другой компонент.

Валидация осуществляется с помощью следующего кода:
JvValidators1.Validate;
Валидация с помощью JvValidationSummary
Размещаем на форме компонент TJvValidationSummary и получаем JvValidationSummary1. У компонента JvValidators1 устанавливаем свойство ValidationSummary в значение JvValidationSummary1 и реализуем обработчик события OnChange. Обработчик предназначен для вывода сообщений об ошибке и может выглядеть так:
RichEdit1.Lines.Text :=
TJvValidationSummary(Sender).Summaries.Text;
Валидация осуществляется с помощью следующего кода:
JvValidationSummary1.Summaries.Clear;
JvValidators1.Validate;
Валидация с помощью JvErrorIndicator
Размещаем на форме компонент TJvErrorIndicator и получаем JvErrorIndicator1. У компонента JvValidators1 устанавливаем свойство ErrorIndicator в значение JvErrorIndicator1. Валидацию можно осуществить с помощью следующего кода:
JvErrorIndicator1.BeginUpdate;
try
JvErrorIndicator1.ClearErrors;
JvValidators1.Validate;
finally
JvErrorIndicator1.EndUpdate;
end;
Рядом с элементами управления, не прошедших валидацию, появится предупреждающая иконка:

За ее появление отвечает компонент JvErrorIndicator.

При необходимости сообщение об ошибке можно куда-нибудь вывести, но при большом количестве валидаторов удобно реализовать метод, который облегчит нам работу. Сигнатура метода следующая:
procedure ProviderErrorValidateFailed(Sender: TObject; BaseValidator: TJvBaseValidator; var Continue: Boolean);
Код метода может выглядеть например так:
JvErrorIndicator1.Error[BaseValidator.ControlToValidate]:= BaseValidator.ErrorMessage;
RichEdit1.Lines.Add(Format('%s', [BaseValidator.ErrorMessage]));
Надеюсь, чта это информация кому-нибудь пригодится :)

четверг, 16 июля 2009 г.

Валидаторы в JVCL. Часть 1

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

Итак, на палитре компонентов в пункте «Jv Validators» имеем три компонента:
  • TJvValidators – фактически содержит список компонент типа TJvBaseValidator или их наследников;
  • TJvValidationSummary — является коллекцией для сообщений об ошибках при неудачной валидации;
  • TJvErrorIndicator — предоставляет пользовательский интерфейс для индикации ошибки в элементе управления.
Размещаем на форме компонент TJvValidators. Соответственно получаем JvValidators1. Далее на панели «Structure» на JvValidators1 нажимаем правой кнопкой и выбираем в появившемся меню пункт «JvValidators Items Editor...»:

В появившемся редакторе добавляем валидатор необходимого типа:

После этого уже можно работать с валидатором. Рассмотрим их подробнее. У валидаторов всех типов есть общие свойства:
  • ControlToValidate - элемент управления, с которым ассоциируется валидатор;
  • ErrorMessage - сообщение об ошибке;
  • PropertyToValidate - свойство элемента управления, подлежащее валидации;
  • Valid - результат валидации.
Required Field Validator используется для проверки наличия значения какого-либо свойства у элемента управления (например, у компонента TEdit можно проверить свойство Text, т.е. ввел пользователь что-нибудь или нет).

Regular Expression Validator используется для проверки соответствия значения какого-либо свойства элемента управления регулярному выражению (например, для вышеупомянутого TEdit можно проверить сответствует ли заданному регулярному выражению свойство Text, т.е. введенные пользователем данные). Регулярное выражение указывается в свойстве ValidationExpression.

Range Validator используется для проверки вхождения значения какого-либо свойства элемента управления в заданный диапазон. Минимальное и максимальное значения диапазона указывается в свойствах MinimumValue и MaximumValue. Кроме этого, у этих свойств имеется свойство Type, в котором указывается тип минимального и максимального значений диапазона. (Для компонента TUpDown можно проверить свойство Position.)

Custom Validator позволяет выполнить произвольную проверку какого-либо свойства элемента управления. Для этого необходимо реализовать обработчик события OnValidate. Сигнатура обработчика выглядит следующим образом:
procedure JvCustomValidator1Validate(Sender: TObject; ValueToValidate: Variant; var Valid: Boolean);
В параметре ValueToValidate содержится значение свойства элемента управления, указанное в свойстве PropertyToValidate валидатора. Все необходимые проверки необходимо производить с этим параметром, и в случае успешного результата параметру Valid необходимо присвоить значение True, в обратном случае — False.

Compare Validator позволяет сравнить значение какого-либо свойства элемента управления со значением, задаваемым с свойстве ValueToCompare валидатора. Также в свойстве Type можно указать тип этого значения. Свойство Operator позволяет задать оператор, при помощи которого будет производиться сравнение (менее чем, менне или равно и т.д.).

Controls Compare Validator позволяет сравнивать значения какого-либо свойства двух элементов управления (видимо одинакового типа). Свойство элементов управления для сравнения задается в свойстве валидатора PropertyToValidate, свойство Operator аналогично описанному в предыдущем пункте. Второй элемент управления задается в свойстве валидатора CompareToControl.

Продолжение в следующем посте.

четверг, 11 июня 2009 г.

Netbeans 6.7 RC2 на русском языке?

Сегодня скачал и установил недавно вышедший Netbeans 6.7 RC2. Не ожидая никакого подвоха запустил и... был удивлен, когда на splash-screen'е увидел мелькающие сообщения на русском языке. Через несколько мгновений появился сам Netbeans, и я увидел, что меню тоже на русском языке, но неполностью. Как-то неприятна такая мешанина русского и английского языка... Да и непривычно на русском. И что самое интересное, я не нашел как это отключить.

UPD
В релизе все опять на английском. Сразу стало привычнее :)

пятница, 8 мая 2009 г.

Ну вот и все...

Ну вот и все - британская компания Micro Focus покупает Borland. Я рад, что CodeGear была продана раньше и Delphi продолжит развиваться.

Но все же в последнее время я занят изучением Java. Несмотря на то, что Java мне кажется сложнее чем Delphi, нравится мне больше именно Java.

пятница, 13 марта 2009 г.

Аловак

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

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

пятница, 6 марта 2009 г.

Женщина

Лучше, чем Эдуардас Межелайтис, сказать о женщине наверно нельзя.

Женщина.

Ты в помыслах моих такая:
Под деревом зеленолистым, нагая, одним прикрытая листком античных статуй, как рыба белая, стройна, ты, словно дерево ветвями, держишь в чудесных, длинных, узких пальцах плод яблони, как небольшое солнце, округлый золотой моток, как будто предлагая свить из него нить бытия. О счастье - создавать, творить! Сначала крохотно оно, как маковое, хрупкое зерно, но тоже круглое, как яблоко. А яблоко, как мир, округлено. И из мельчайшего зерна нить начинает вить себя и создавать собой моток, шар в яблоко величиной растет и вырастает в мир, как этот, у тебя в руке, из нитей созданный клубок, огромный, словно шар земной.
Так - на холсте Дюрера - ты
Стоишь земная, грешная, простая,
И в помыслах моих такая.

Ты в помыслах моих такая:
Небесная голубизна светла, ясна. В прозрачности глубоких красок неизъяснимой чистоты, с глазами голубых мечтаний остановилась ты, подняв дитя, чтобы оно могло взглянуть на уходящий к роще путь в лучащемся тумане. А на лице твоем Покой и Благодать - две спутницы твои и каждой женщины, которая готова страдать и ждать, когда дитя ей, первой ей, произнесет свое вот-вот родившееся слово. Как не гордится ей, одной из матерей, начальным зернышком огромной жизни, которому она дала родиться - как каждая на свете мать, что миру дарит детство, пренебрегая мукою своей. Так солнце дарит миру на рассвете свой первый луч, младенца нового земного дня. И тот, кто может взвесить на руке песчинку, незаметную в песке, способен ощутить весь вес планеты. Так и мать, свое дитя подъемля, всю Землю держит. И только потому ее святой позволено назвать.
Так, в красках Рафаэля возникая,
Равно держа и землю и зерно,
Ты в помыслах моих такая.

Ты в помыслах моих такая:
Из приоткрытых губ ко мне скользит твоя усмешка золотая, как будто из раздвинувшихся туч протягивает теплый луч пробившееся солнце, отогревая сердце мне, игрушечной подобное Земле, и на его согретом лонце оживают, вырастая, забытые в благих заботах зерна. И непокорно из губ твоих скользит улыбка золотая, как ласточка из тихого гнезда, укрывшегося крышей. Она летит, раскинув крылья, на расправу с мошкарой, распугивая мелких мыслей рой.
Так, словно Мона Лиза, ты
Над слабостями нашими смеешься,
И в помыслах моих такая ты.

Ты в помыслах моих такая:
За сизою тончайшей кисеей тумана утром рано перед собой я новую увидел Афродиту. Недвижна и бела, она недавно мраморной была, но вот богиню сняли с пьедестала, и в комнате прозрачно-голубой она живою женщиною стала. О вечной неподвижности забыв, стал мрамор телом нежно-белым, пахнущим весенней утренней сиренью. Задумчивое, светлое лицо, цветок полураскрытых губ, дыханием наполненная грудь, откинутые крылья рук и тела сине-ледниковый снег - мне хочется сравнить с озерной белой птицей под названьем Лебедь, надевшей на себя береговой туман, - нездешней, неземной и вечно нам необходимой во имя красоты.
Так, на картинах Ренуара ты,
Земной и неземною возникая,
Являешь нам прекрасного черты.

И ты
Действительно такая,
И наяву такая ж, как во сне.
Одна и та же в разном.
Что ни день - другая.
Вся - красота, вся - разум.
Высокая, неземная,
Грешница, святая.

И ты -
Только такая -
Необходима мне.

четверг, 29 января 2009 г.

Struct внутри класса

В прошлом посте я упомянул о Struct. Использовать эту конструкцию достаточно просто:
TestRecord = Struct.new("TestRecord", :test1, :test2)
record = TestRecord.new()
И далее record используется как экземпляр класса TestRecord.

Но вот захотелось мне использовать Struct внутри класса. Для этого пришлось явно указать, что TestRecord это также класс:
class Test
class TestRecord < Struct.new("TestRecord", :test1, :test2); end

attr_reader :record

def initialize
@record = TestRecord.new()
end
end
Дело в том, что с помощью Struct.new мы создаем структурный шаблон, который на самом деле является классом, который создается внутри класса Struct.

понедельник, 19 января 2009 г.

Кое-что о ruby

На Хабре открылся блог для начинающих изучать какой-либо язык программирования "Стартап "Программист". Начинался этот блог со статей про ruby, но сейчас уже есть статьи про C# и Java. Несмотря на то, что там содержится информация для начинающих, в очередной статье про ruby открыл для себя кое-что новое.

Я думал, что сделать метод в классе приватным можно только одним способом, а именно расположить его после ключевого слова private. Однако, есть еще один способ. Можно передать список методов, которые необходимо сделать приватными, в качестве параметров для private. Передавать необходимо в виде символов (Symbol).
О символах, кстати, недавно была статья на Хабре (точнее о различиях строк и символов).

Также узнал что такое Struct. Судя по примерам - достаточно удобная конструкция, надо будет попробовать.