Tuesday, July 15, 2014

OdessaJS 2014


5-6 липня я був запрошений на OdessaJS для того, щоб зробити доклад про побудову enterprise-level application використовуючи AngularJS. Сам доклад можно подивитися тут: http://slides.olostan.name/twinfield_neoui/twinfield_neoui.html#1

Сама конференція вразила мене своєю “молодіжностю” - було дуже багато молоді. Як серед відвідувачів, так і спікерів. Організатори - Артем Тритяк та Юлія Черняк зробили все, щоб з скучної по своїй суті девелоперскої коференції зробити драйвову веселу тусовку. Дуже багато спілкування було саме поза-доповідями. Люди кодили просто у коридорах.

Як відомо, будь яка конференція - це 50% доповіді, та 50% - це спілкування на афтерпаті. І тут організаторам вдалось зробити все на вищому рівні: афтерпаті після першого дня продовжувалась майже до початку наступного - до 7 ранку на березі моря.

Але і технічна частина була просто чудова: було все - від широкого кола фронт-енд фреймворків, до сурового node.js бекенда. Важко було вибрати на яку саме доповідь піти.

І завершили все “круглим столом” з доповідачами, на якому була можливіть поділитися life-hack’ами з тими, хто тільки починає свою кар’єру девелопера.

Я впевнен, що івент вдався! І наступний OdessaJS буде абсолютним must-visit івентом!

Tuesday, February 25, 2014

Easy Dart on Google Compute Engine (GCE)

TL;DR;

 One-line  download SDK and install command for current user would be:
curl -L "https://docs.google.com/uc?authuser=0&id=0B1i4NDqKFLYJM3NlYnRhLXFfXzQ&export=download" |sh

Long version:

Actually Dart could be run on Google Compute Engine instances as described on this article.  There you also can find other details on how to configure GCE instances.

But the problem is that you need to recompile Dart, as SDK provided on Dart downloads page does not run on instances provided by GCE at this moment (Debian 7 and CentOS 6). If you will try, you'll get this response:
/dart: /lib64/libc.so.6: version `GLIBC_2.15' not found (required by ./dart)
/dart: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./dart)
But when you want to have your instance up and running quick, probably you don't want to spend instance's resources on recompile as it will cost you additional money.

Wednesday, February 12, 2014

Go CMS for Google Apps Engine

Tl;dr


Background

Not so long ago I've starting digging into Go language and found it very attractive for server-side development. The reasons are:

  1. It is fast ("near C performance")
  2. It is garbage collected
  3. Syntax is though little bit strange (comparable to Dart), but still quite easy to learn
  4. Easy to start
Also Go is supported by Google Apps Engine.

Speaking about performance, I should mention cost. If you're in "cloud", then you should think about "cost per request" - how much resources were used to serve request. So if application is faster, it should be cheaper in case if you're using real "cloud" platform, such as GAE that can automatically scale your application.

Also because Go in compiled language, instance startup is much faster then Java/Python.   


The Idea

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 можно вызвать метод :) Можно спрашивать на собеседованиях чтоб оценить реакцию :)

Wednesday, June 2, 2010

Ищем соратника

Сегодня разместил вакансию на developers.org.ua. Интересно, без дополнительных вложений будут ли обращаться?

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

В общем, ждем новых друзей в нашу дружную команду :)

Tuesday, April 27, 2010

GWT UiBinder - Separation of Concepts

Решил сделать репост очень интересной статейки о том, как шаг за шагом перейти от обычного HTML (или swing-like) к UiBinder-у.

Отличный материал для идеи, которая недавно пробегала - вместо скучных обычных докладов, провести что-то вроде группового мастер-класа. И как раз пошаговая разработка UI с UiBinder'ом думаю будет довольно интересной.

Saturday, April 24, 2010

C# 4.0: Небольшие малозаметные, но важные изменения

C# 4.0 вышел вместе с MSVS 2010 еще 12ого апреля. Уже довольно много статей о новых фичах вышло - о динамических типах и DLR, о параметрах и т.д. Но довольно много мелких изменений, который довольно слабо освещены, и о которых не стоит забывать.

Решил перечислить их с небольшими комментариями:


  • Во многие типы наконец-то добавили TryParse (TimeSpan, Enum, Guid).
  • Чуть проще работа со строками: Join'нить и Contact'ить можно все что IEnumerable, добавили String.IsNullOrWhiteSpace
  • Идея Enum'ов как флаги продолжила свою жизнь в виде Enum.HasFlag
  • Наконец-то не надо изобретать велосипед при копировании с одного потока в другой - System.IO.Stream.CopyTo
  • Теперь не надо писать конструкции типа:

    private MyType field;
    public Field { get { return field ?? (field = new MyType()); } }
    Вместо этого можно воспользоваться System.Lazy
  • Добавили System.Tuple<...> - вот этого часто не хватало. Определять свои классы лень только для того, чтоб вернуть два-три значения, а out-параметры не очень красивы.


Это в принципе именно полезные, но мало-заметные изменения. Полный список можно прочитать в этой статейке.

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


Friday, April 23, 2010

Chrome: Desktop Notifications

Случайно наткнулся на ссылочку про нотификации в webkit/chrome.

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

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

Sunday, April 18, 2010

Google Chrome: enable html5 geolocation

Недавно натолкнулся на тест поддержки HTML5.
Удивило, что в хроме показало "Geolocation 0/5", хотя я точно читал что в хроме добавили поддержку геолокации.

После небольшого гугления оказалось все просто - достаточно добавить параметр " --enable-geolocation"

После этого имеем сразу 142/160 (5.0.342.9 beta, Windows7, x64)



Интересно, какие еще флажки есть для большей поддержки html5?

Saturday, January 16, 2010

GTUG Ukraine

Нашел "братьев по разуму" - клуб любителей продуктов Google.

Оказывается последнее время Google развернул довольно активное участвие в продвижении своих продуктов используя довольно старый способ - user groups.

В Украине это Kyiv GTUG Center и Kyiv GTUG Center.

В чем их координальное отличие я так и не понял, судя по всему какая-то игра амбиций.

Если будет интересно, сделаю доклад про Google Web Toolkit.

Thursday, December 10, 2009

Google Public DNS

Гугл потехоньку захватывает все больше и больше. Теперь вот и DNS. Это, возможно, и удобно, и быстро, но заставляет все-таки задуматся всякими параноидальными мыслями :)

Что дальше?

GWT 2.0 is out

Свершилось! Google таки зарелизили. По ссылке коротое видео с основными изменениями.

Самые яркие и ожидаемые:


  • Дебаг в любом броузере (в т.ч. на удаленных компах с другими ОС)

  • Декларативный UI (используется концепция MVP)

  • “сплит поинты”, позволяющие разделить код на куски, которые будут до-загружатся по мере необходимости. Обещают что компилятор сам разбеертся в какой последовательности и какие “куски” загружать. Звучит слишком круто чтоб быть правдой :)

  • “пачки ресурсов”. Раньше можно было автоматизировать упаковку картинок в один запрос к серверу. Теперь можно “упаковывать” и текст, и даже CSS-стили, которые будут автоматически собиратся, оптимизироватся и отдаватся по мере необходимости.

Ссылка на шоукейс.



Что-ж… ура, товарищи )

Sunday, October 11, 2009

Повышение продуктивности: средство само-контроля

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

И чтоб поставить все точки над “i” решил именно для себя поставить какую-то систему контроля какое приложение активно.

Быстрое гугление вывело на утилиту, на 80% выполняющую необходимые функции: ManicTime

Чем она удобна:

  1. Минималистический интерфейс, в то же время вполне eye-candy.
  2. Бесплатна
  3. Отслеживает не только сколько времени было проведено в той или иной программе, а и на каких сайтах (по доменам)
  4. Есть автоматическое отслеживание бездействия (отошел от компа)
  5. Возможность помечать “тагами” некоторые участки времени (“работаю”, “отдыхаю”) с различными отчетами по тагам.

Скриншотик с офф сайта:

В целом это одна из таких прог, которую, как мне кажется, необходимо иметь каждому, кто работает на дому.

Минус пока вижу в том, что недостаточно возможностей по просмотру результатов за неделю, месяц и автоматической расстановки “тегов”. Но выглядит очень привлекательно и потенциально.

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

ПС. Я никаким образом не связан с создателями программы.

Wednesday, September 16, 2009

Отдых: Ради этого стоит работать

Вернулся с отдыха в Анталии. “Честные” 5*. Понял, что стоит таки год работать чтоб так отдохнуть – отличное питание, отличное море, минимум кричащих детей и пьяных компаний (не хочу явно “пиарить” отель, хотя он стоит того. Кому интересно – пишите в комментарии)

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

По приезде гугл-ридер радостно сообщил о “1000+” непрочитанных.

Снова таки начали приходить о выборе – что лучше: продолжать фрилансить (пару более или менее постоянных клиентов есть), или все-таки вернутся на “регулярную” работу…  С одной стороны “свобода” фриланса, с другой – работа в коллективе, обмен опытом. Навеяно "Подготовка к собеседованию на должность программиста".

ПС. Никогда не понимал как люди могут работать без хорошего отдыха :)