Блог заморожен
Замораживаю данный блог (dulanov.wordpress.com) и перехожу на движок Posterous, новые посты теперь будут появляться непосредственно на http://dulanov.name.
Шесть внутренних врагов человека
«Веды называют шесть внутренних врагов человека, которые порождают все внешние проблемы. Вот они: зависть, вожделение, гнев, жадность, безумие, иллюзия.
Как они связаны между собой? Веды говорят, что падение души из Абсолютной Реальности в этот материальный мир начинается с того, что душа начинает завидовать красоте и могуществу Бога. Когда зависть (враг №1) поселилась в сердце, душа уходит из Духовного мира и попадает в мир материальный. В Духовном мире основой бытия является любовь к Богу и служение Ему. Когда, оказавшись в материальном мире, душа лишается общества Бога, нереализованное чувство любви и стремление к прекрасному (к Богу) превращается в вожделение (враг №2). Принципиальное отличие вожделения от любви состоит в том, что любовь – это желание бескорыстно служить объекту своей любви, а вожделение – это желание корыстно наслаждаться самому и эксплуатировать все вокруг. Если вожделение не удовлетворяется, оно перерастает в гнев (враг №3), а если удовлетворяется, тогда оно порождает жадность (враг №4), так как хочется еще повторить удавшийся опыт. В обоих случаях жадность и гнев порождают безумие (враг №5), которое проявляется в потере разума и неспособности контролировать себя.
Последней фазой этих трансформаций является иллюзия (враг №6). Иллюзия состоит в том, что, дойдя до безумия, душа совершенно забывает о своей вечной природе и полностью отождествляет себя с временным физическим телом. Это ложное самоотождествление заставляет душу двигаться в противоположную своим интересам сторону. Это и есть иллюзия. Конечно, придирчивый критик скажет, что еще забыли про гордыню, тщеславие и т. д., но они являются составными частями зависти, вожделения и жадности.»
Василий Тушкин
Использование Apache Camel на примере аккаунта Twitter публикующего текущие курсы валют ЦБ РФ
Где-то под новый год сидя в офисе мы со @splix (Игорем Артамоновым) обнаружили дефицит реальных практических примеров использования Apache Camel. В общем догло ли, коротко ли, решили сделать пример по публикации курсов валют с сайта ЦБ РФ в Twitter и чтобы это все работало из коробки одной командой. Сегодня я рад представить вам базовый вариант этой задумки. Посмотреть результаты работы можно здесь.
Реализация сделана полностью на Groovy в виде пяти файлов, два из которых модульный тесты и еще один сборка Gradle. Шаги для запуска примера:
- Установить Sun JDK 1.6+.
- Скачать Gradle 0.9+.
- Установить систему контроля версий Git.
- Забрать пример с GitHub – ‘git clone git@github.com:dulanov/cbrru-agent.git’.
- Скопировать build.properties.template в build.properties и прописать параметры своего аккаунта Twitter.
- Запустить командой ‘gradle -q run’.
Код интеграции говорит сам за себя, спасибо лаконичности Apache Camel DSL:
from('quartz://timer?cron=13+01+15+?+*+MON-FRI')
.to('http://www.cbr.ru/scripts/XML_daily.asp')
.transform(body(CurrencyRates.class))
.to("log:${this.class.package.name}?level=INFO&multiline=true")
.process({twitter.updateStatus(it?.in.body as String)} as Processor)
Остальные детали по адресу http://github.com/dulanov/cbrru-agent.
Переопределение методов equals() и hashCode() в Groovy
Groovy реально позволяет избавиться от поносамногословия Java. Но вчера столкнулся с необходимостью переопределения всем хорошо известных методов equals() и hashCode(). Оказывается, Groovy не упрощает жизнь в этом вопросе. Но у меня не возникло ровно никакого желания писать такую простыню, использовать же попахивающую тухлецом библиотеку Jakarta Commons Lang тоже не было никакого желания.
Что же остается делать? Ну, можно использовать появившийся в версии Groovy 1.6 макрос @Immutable. Но невозможность переопределения конструктора и вообще достаточно сильные накладываемые ограничения на класс не позволили мне этого сделать.
Ок, пошел посмотрел как обстоят дела у наших соседей – языка Ruby, ведь не секрет что очень много в Groovy стырино именно оттуда, а Ruby в свое время скоммуниздил все что надо из Smalltalk. В итоге, как и ожидалось, у Ruby таких проблем в принципе нет и все ограничивается чем-то наподобии:
def ==(other) @suit == other.suit and @kind == other.kind end
Видимо карма такая у Java – все усложнять и там где уместна одна строчка, должно быть десять и непременно парочка XML-файлов конфигурации, чтобы не расслаблялись =)
В общем решил забить и на Java с ее гуру Джошуа Блохом и написать по аналогии как это делается в Ruby:
enum CurrencyCode {
USD('$'), EUR('€'), CNY('¥')
char symbol
CurrencyCode(symbol) {
this.symbol = symbol
}
}
class CurrencyRate implements Comparable<CurrencyRate> {
def code, value
CurrencyRate(aCode, aValue) {
(code, value) = [aCode, aValue]
}
int compareTo(CurrencyRate rate) {
this.code <=> rate.code ?: this.value <=> rate.value
}
int hashCode() {
31 * (code?.hashCode()?: 0) + (value?.hashCode()?: 0)
}
boolean equals(obj) {
obj in CurrencyRate && code == obj.code && value == obj.value
}
String toString() {
String.format "1%c = %.4f р.", code.symbol, value
}
}
Возможно, этот код нарушит какую-то из непреложных заповедей Джошуа, а может и несколько, зато я получил то, ради чего и начал использовать Groovy – гибкость и лаконичность кода!
Результат двухдневных извращений с SSHTools
Задача: из Java удаленно по SSH запустить приложений и забрать log-файл.
Два дня копался с SSHTools, задолбался, посмотрел JSch – ужаснулся. В итоге лень взяла вверх и тупо решил использовать готовые задачи из Apache Ant sshexec и scp с помощью AntBuilder из GDK (Groovy JDK). Смотрим, что получилось:
// SSHRunner.java
import groovy.util.AntBuilder;
import java.util.HashMap;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class SSHRunner {
private final static Log LOG = LogFactory.getLog(SSHRunner.class);
public final static int DEFAULT_SSH_PORT = 22;
private int port;
private String host, username, password;
private AntBuilder builder = new AntBuilder();
public SSHRunner(String host, String username, String password) {
this(host, DEFAULT_SSH_PORT, username, password);
}
public SSHRunner(String host, int port, String username, String password) {
if (StringUtils.isEmpty(host) || port < 1 || StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
throw new IllegalArgumentException("All parameters must be at least one character");
}
this.host = host;
this.port = port;
this.username = username;
this.password = password;
}
@SuppressWarnings("serial") public SSHRunner sshexec() {
builder.invokeMethod("sshexec", new HashMap() {{
put("host", host);
put("trust", "true");
put("port", Integer.toString(port));
put("username", username);
put("password", password);
put("command", "cscript c:\\test.vbs");
}});
return this;
}
@SuppressWarnings("serial") public SSHRunner scp(final String filepath) {
builder.invokeMethod("scp", new HashMap() {{
put("trust", "true");
put("port", Integer.toString(port));
put("remoteFile", String.format("%s:%s@%s:c:\\testfile.txt", username, password, host));
put("localTofile", filepath);
}});
return this;
}
public static void main(String[] args) {
new SSHRunner("127.0.0.1", "admin", "password").sshexec().scp("/home/dulanov/Desktop/test.txt");
}
}
iBatis enum type handler with Mockito
How to handler multiple-values String-based Enums in Java for Apache iBatis with Mockito unit test: EnumTypeHandlerImplTest, TypeHandlerCallback.
Книги по Semantic Web – что издать?
Виктор Штонда, генеральный директор издательства «Диалектика»:
На английском языке вышли две знаковые книги по теме Semantic Web.
Насколько они необходимы на русском языке? – зависит от Ваших мнений и
комментариев. В моем блоге обсуждаются две книги-кандидата на перевод
и издание на русском языке: «Semantic Web Programming» и «Semantic Web
For Dummies» («Семантический Веб для чайников»). Только Ваша активная
позиция в столь непростое время будет способствовать появлению новых и
нужных Вам книг.
![]() |
![]() |
![]() |
Также стоит отметить третью книгу по этой тематике, вышедшую в этом году: «Programming the Semantic Web».
Книги свежие и их толком мало кто ещё успел прочитать в оригинале, тем не менее, уже на уровне глав издательств появляется серьезная заинтересованность в освещении тематики семантического веба и реальная возможность поспособствовать выбору именно той книги, которая в большей степени была бы полезна российскому читателю.
В мае 2009 года Сеть явно стала умнее
«Судите сами. 12 мая Google объявила о новом подходе к поиску и новых возможностях для пользователей. 15 мая Стивен Вольфрам, отец широко известной в узких научно-технических кругах программы математических расчётов и визуализации Mathematica, запускает сервис «ответов» Wolfram|Alpha. А на следующей неделе, по слухам, компания Microsoft открывает новый поисковый сервис Kumo с элементами семантического поиска…» (прочитать полностью).
Web, часть третья
Не совсем разделяю такую точку зрения на Веб 3.0 (моя позиция), но статья интересная и достаточно всеобьемлющая. Перепубликую, чтобы она попала в ленту новостей. Источник – http://www.osp.ru/os/2009/03/8165094/.
В мире шоу-бизнеса успешность проекта часто предопределяет появление в будущем его продолжений. Если фильм имел популярность и принес большую прибыль, продюсеры задумаются о выпуске сиквела и триквела. К сожалению, часто продолжения, используя для привлечения зрителей выигрышное название первой части, значительно уступают ей по качеству. Подобная ситуация наблюдается и в мире ИТ. Вслед за World Wide Web появляется Web 2.0, а сейчас уже вовсю обсуждается Web 3.0, суля широкой публике семантическую революцию. Но что реально стоит за новой технологией?
Дмитрий Левшин
Всемирная Паутина была крупнейшим технологическим успехом, а сегодня Internet-сообщество готовится к выходу Web 3.0, хотя нумерация не совсем точно отражает процесс развития технологий – многие идеи Web 2.0 закладывались Тимом Бернерсом-Ли еще при разработке WWW. Web 3.0 часто ассоциируется с семантическим подходом, который, однако, исследуется уже более десяти лет. Каковы перспективы Web 3.0, произведет ли триквел обещанную его авторами революцию [1]?
Идея Semantic Web проста по сути, но тяжела в реализации – сложно научить программных агентов понимать Web-документы, которые для нынешних браузеров являются книгой на незнакомом языке с кем-то оставленными пометками на полях. Программа лишь ищет эти пометки, поскольку только их понимает и воспринимает как команды, а цель Semantic Web – понять текст. Такой «поумневший» агент сможет, общаясь при этом с другими агентами, автоматически решать многие задачи, с которыми сегодня невозможно справиться без человеческого участия.
Конечно, никто не требует от агентов понимания естественных языков – в этом случае перспективы Semantic Web были бы совсем туманными. Вместо этого отдельные слова в «книге» сопровождаются переводом на язык, понимаемый агентом, – Web-контент сопровождается дополнительной метаинформацией для агента. Важно, что с самого начала Semantic Web задумывался не как замена Всемирной Паутины, а как ее расширение.










