Sunday, November 24, 2013

Child process balancer for Node.JS: Building block of Message Driven Architecture

This article is devoted to "child-balancer" - project that I've published recently to GitHub.

The Idea

Idea of this project raised when I'd a small task that required a serious CPU-heavy calculations. Server, on which this script should run had 16 Xeon CPUs, so there were some space to use.

Sunday, April 10, 2011

Very simple EventBus/PubSub implementation (Java)

While investigating and learning usage of CQRS parrtern I've found that there is no any simple event bus implementation for Java (exept this one, but it do not had sources).

So I've used idea of "Java Programming Tip: Building Your Own Event Bus" blog post, and made my own implementation.

It allows very-very simple and not optimized way of publishing/subscribing on events with consentation on simplicity.

Friday, March 25, 2011

Math coombinator: 5-3-4/1/2=0

(Post is in english, because I've decided to make russian blog posts at specialized it-oriented web community - http://olostan.habrahabr.ru/blog/, so translations of these posts would be posted there)
(Пост на английском потому что я решил русско-язычные посты вести в блоге сообщества http://olostan.habrahabr.ru/blog/. Перевод этого поста будет доступен позже по этой ссылке)

Not so long ago I've noticed one funny post on bash.org.ru (free translation):
xxx: There is numbers 1 3 4 and 6. Task is to get 24 using addition, substruction and multiplication. Numbers could be used only once.
yyy: Listen, can you send me when I will be at office - I got something else to do at home
...and I start thinking about efficient algorithm for solving this problem!

To simplify little bit I've decided to forbid using grouping parentheses. So problem could be stated in such way:

There is a set of numbers A1...An, and target number X. Task is no find such combination of this numbers (order could be changed), that Ax1 (op1) Ax2 (op2) ... (opn-1) An = X. (op1..n-1 - are one of operations "+","-","*","/")

I decided to use C++ to practice with this language. Mostly same solution could be made on any language.

Ok, lets start.

First analysis shows that this problem could be solved with finding vertex in the graph with predefined characteristics. So we can reduce this problem to problem of finding path from some (any) initial vertex to target vertex.

Graph could be set in such way:
  • Vertex are some permutation of initial numbers and some set of operations.
  • Two vertexes are connected if there is one swap op numbers and one operation changed.

So from any vertex we can get connected vertexes in such way: swap all possible pairs of numbers and for all swapped numbers change one operation.

For example: we have initial numbers 1,2,3. So from vertex (1+2+3) we can get vertexes: (2+1+3),(1*2+3), (3*2+1) etc.

After initial implementation of this algorithm I got results what I've expected. Example output could be:
result:2-1*3-4+5=0 (tested 29828)
Nice, but I do not like 29k of tested solutions... "Can we do better"? I think yes. Lets remember "A* search algorithm". May be we can use that idea and sort solutions based on how closer we are to target?

There was a tiny change: replace 'queue' with 'priority_queue' and add cost function that will compare two solutions based on how close we are. So each time we get some solution to test we get solution that is more closer to target result.

So after this change I got:
result:4/1+3-5-2=0 (tested 4)
Much better! So with only such small optimization I've lowered length of searching to 4 iterations! Here is a table comparing results of 'queue' and 'priority_queue':

priority_queuequeue
result:4/1+3-5-2=0 (tested 4)result:2-1*3-4+5=0 (tested 29828)
result:1+2-3-4+5=1 (tested 3)result:1-2+3+4-5=1 (tested 251)
result:3/1*4-5*2=2 (tested 109)result:3-2-1*4+5=2 (tested 29601)
result:1-2+3-4+5=3 (tested 3)result:1-2+3-4+5=3 (tested 248)
result:1*2+4-5+3=4 (tested 3)result:1-2*3+4+5=4 (tested 246)
result:1+2+3-5+4=5 (tested 2)result:2+1+3+4-5=5 (tested 11)
result:1+5+3*2*4=30 (tested 3)result:2*4*3+1+5=30 (tested 558)
result:1+5/2*3*4=31 (tested 4)result:3*5/2*4+1=31 (tested 59961)
result:5*2*4-1-3=36 (tested 181)result:4*2*5-1-3=36 (tested 1006943)
result:1*2*4*5-3=37 (tested 160)result:2*1*5*4-3=37 (tested 1004303)

So as result I can say that there is a point try to find more efficient way of solving problem.

Source code of solution (very dirty and may be contains some implementation bugs, but my task was not to write a 'clean code' example, but write a solution) is stored on GitHub Gist.

Monday, November 8, 2010

Ubunted

В общем, уже как почти месяц как я перешел на Ubuntu. Перед этим хоть и знал и изредко пользовался альтернативными ОС (сервер, который обслуживает look.org.ua на FreeBSD, который я сам "поднимал" и "конфижил"), но как домашнюю все никак не решался установить. Да и специфика работы (в основном разработка на .NET) на это сильно влияла.

И вот с выпуском Ubuntu версии 10.10 решился.

Что понравилось

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

  • Софт. Поиск, установка софта проcто очарователен. При чем как и "Центр приложений", так и "Менеджер пакетов". Особо отмечу то, насколько "вливается" установка приложений, которых нет в списке - достаточно с сайта загрузить пакет, как будет автоматически зарегистрирован источник, и софт будет атоматически обновляться.

  • Эстетичность. Многие судят Ubuntu за то, что она копирует макось. Возможно. Но это, блин, красиво. Все на своих местах. Я сначала попробовал другие темы, но вернулся на "дефолтовую" - просто и со вкусом. Хотя немного серовато. Но всякие compiz-эффекты просто радуют глаз и расслабляют (например Win+E, Win-W).

  • Скорость. По сравнению с Windows7 просто поражает то, как ведет себя система сразу после загрузки (которая происходит просто магически быстро - даже заставка с точечками не успевает толком помигать) - а именно отзывчивость системы. Загрузилась - работай. В Windows после загрузки при запуске броузера или другой софта идут какие-то подгрузки винта и т.д. На самом деле мне иногда это было тяжело понять - ведь, к примеру, броузер "весит" метров.. ну еще 20 библиотеки незагруженные. При современных винтах 40мб грузится примерно секунду. Видимо Windows на фоне еще делает много операций.

Что НЕ понравилось


  • "по умолчанию" система ввода плохо дружила с моей мышкой (A4Tech X7) при переключении раскладки. Чинится установкой новой версии xinput (спасибо инфраструктуре PPA это делается в 2 клика). Подсказали на "хабре".
  • то, как встроен чат в систему. Идея отличная, но я не сразу понял что при закрытии "Списка собеседников" я выхожу из онлайна. При этом стандартный клиент, который идет с системой не умеет прятаться в трей. (см. комментарии. может что поменяли)

  • треевые "popup-ы", которые размываются при наведении мышкой - ну привык я когда идет popup о том, что новое сообщение быстро кликать на попапе чтоб открыть его. Тут эти popup-ы чисто информативные.

  • в целом имхо "трей" сейчас остается самым слабым местом - наборы иконок там сильно выбиваются из общей целосности интерфейса. Все-таки система треевых иконок (которые в notification area) в Windows7 имхо более продуманна - можно некоторые прятать и показывать по необходимости.

  • Шрифты. Да, стандартные красивые, но я все-таки привык к обычным, виндовым. По этому быстро доставил себе пакет дополнительных шрифтов.



Из "нестандартных" установил Chrome, Skype, Dropbox, VMWare и ощущение от системы просто отличные.

Не хватает только iTunes (для более простой работы с iPad) нет.

Monday, August 23, 2010

Beta-browsers tests: IE9, Chrome, FF4, Opera

Запустил новый Pshychelic на FF4 Beta3 (DirectDraw enabled) - результат практически 1 в 1 с IE:



К сожалению, в других броузерах поддержки апаратного ускорения пока нет.

За одно прогнал свои броузеры на HTML5test.com (June 8, 2010 - version 1.0):


BrowserResult
Chrome 7.0.500.1 canary build (+webgl)232
Chrome 6.0.472.41 beta217
Firefox 4 beta 3190
Opera 10.61159
IE9 (1.9.7916.6000)96


Жаль IE9 плетется в конце не смотря на то, что судя по блогам разработчики ИЕ9 обещают сильную поддержку HTML5...

UPD: Чисто для статистики приведу результат санспайдера на моей машине:



BrowserResult
Chrome 7.0.500.1 canary build (+webgl)275.4ms +/- 0.6%
Chrome 6.0.472.41 beta283.9ms +/- 1.6%
Firefox 4 beta 3558.1ms +/- 5.6%
Opera 10.61281.0ms +/- 0.8%
IE9 (1.9.7916.6000)390.2ms +/- 0.4%


Думаю пора делать новую версию санспайдера - ибо некоторые тесты по 1-2мс, что не дает нормальной точности.

Wednesday, August 11, 2010

Chrome: Stable ahead of Beta?


Сегодня забавный апдейт стабильного хрома до 5.0.375.126. Забавен он тем, что бета-канал имеет версию 5.0.375.125

Гугл как обычно с выкрутасами - неужели они боятся релизить бета-версии больше чем стабильные? Может потому-что на бетах больше народу? :)

Tuesday, June 29, 2010

C#: Invoke method from null-valued variable?

Как-то не задумывался, что конструкции по типу:

A a = null;
a.SomeMethod();


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

Как?

Методы-расширения:

public class A { }
public static class AExt {
public static void SomeMethod(this A a) {
Console.WriteLine("Invoked with "+(a==null?"null":a.ToString()));
}
}


Это конечно хорошо, но имхо это нарушает "читабельность" - лучше явно проверять и обрабатывать null-значения, чем прятать обработку в методы расширения.

Но факт остается факт - у переменной со значением null можно вызвать метод :) Можно спрашивать на собеседованиях чтоб оценить реакцию :)