Блог заморожен

Замораживаю данный блог (dulanov.wordpress.com) и перехожу на движок Posterous, новые посты теперь будут появляться непосредственно на http://dulanov.name. C ноября 2012 года начинаю готовиться к концу света и полностью завязываю с писательством, баста телепузики ^_^. Письма и пожелания отправляйте до востребования Себастьяну Перейре, торговцу черным деревом.

Реклама
Рубрики:personal

Шесть внутренних врагов человека

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

Как они связаны между собой? Веды говорят, что падение души из Абсолютной Реальности в этот материальный мир начинается с того, что душа начинает завидовать красоте и могуществу Бога. Когда зависть (враг №1) поселилась в сердце, душа уходит из Духовного мира и попадает в мир материальный. В Духовном мире основой бытия является любовь к Богу и служение Ему. Когда, оказавшись в материальном мире, душа лишается общества Бога, нереализованное чувство любви и стремление к прекрасному (к Богу) превращается в вожделение (враг №2). Принципиальное отличие вожделения от любви состоит в том, что любовь — это желание бескорыстно служить объекту своей любви, а вожделение — это желание корыстно наслаждаться самому и эксплуатировать все вокруг. Если вожделение не удовлетворяется, оно перерастает в гнев (враг №3), а если удовлетворяется, тогда оно порождает жадность (враг №4), так как хочется еще повторить удавшийся опыт. В обоих случаях жадность и гнев порождают безумие (враг №5), которое проявляется в потере разума и неспособности контролировать себя.

Последней фазой этих трансформаций является иллюзия (враг №6). Иллюзия состоит в том, что, дойдя до безумия, душа совершенно забывает о своей вечной природе и полностью отождествляет себя с временным физическим телом. Это ложное самоотождествление заставляет душу двигаться в противоположную своим интересам сторону. Это и есть иллюзия. Конечно, придирчивый критик скажет, что еще забыли про гордыню, тщеславие и т. д., но они являются составными частями зависти, вожделения и жадности.»

Василий Тушкин

Рубрики:opinion

Моделирование социальных сетей

Губанов Д.А., Новиков Д.А., Чхартишвили А.Г. «Социальные сети: модели информационного влияния, управления и противоборства», 2010 — 228 стр. (скачать в PDF-формате, зеркало).

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

Тег «Далее»

Рубрики:opinion Метки: , , ,

Использование Apache Camel на примере аккаунта Twitter публикующего текущие курсы валют ЦБ РФ

Апрель 21, 2010 1 комментарий

Где-то под новый год сидя в офисе мы со @splix (Игорем Артамоновым) обнаружили дефицит реальных практических примеров использования Apache Camel. В общем догло ли, коротко ли, решили сделать пример по публикации курсов валют с сайта ЦБ РФ в Twitter и чтобы это все работало из коробки одной командой. Сегодня я рад представить вам базовый вариант этой задумки. Посмотреть результаты работы можно здесь.

Реализация сделана полностью на Groovy в виде пяти файлов, два из которых модульный тесты и еще один сборка Gradle. Шаги для запуска примера:

  1. Установить Sun JDK 1.6+.
  2. Скачать Gradle 0.9+.
  3. Установить систему контроля версий Git.
  4. Забрать пример с GitHub — ‘git clone git@github.com:dulanov/cbrru-agent.git’.
  5. Скопировать build.properties.template в build.properties и прописать параметры своего аккаунта Twitter.
  6. Запустить командой ‘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.

Рубрики:programming, webofdata_ru Метки: , , ,

Переопределение методов equals() и hashCode() в Groovy

Апрель 21, 2010 1 комментарий

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 — гибкость и лаконичность кода!

Рубрики:programming Метки: , ,

Результат двухдневных извращений с SSHTools

Август 20, 2009 1 комментарий

Задача: из 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");
 }
}
Рубрики:programming Метки: , , , , ,

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.

Рубрики:programming