воскресенье, 18 декабря 2011 г.

Как радио Шансон меня достало и что из этого получилось

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

Я вежливо попросил убрать шансон, таксист переключил на другую волну. Мне от этого не стало легче, потому что то что я услышал по радио было не намного лучше шансона, новости гламура :) Но не все так плохо, нашел в интернете чудесный ресурс, жаль что в такси про него не знают.

Итак, решил разобраться как создавать интернет-радио. Выяснил что для Linux уже есть готовый солюшен, называется icecast2. Установил на свой Ubuntu сервер пакет icecast2, но этого оказалось не достаточно. Надо поставить еще один пакет, называется ices2. Ices2 служит источником данных для icecast2. Icecast2 может транслировать звук из разных источников, например, изаудио-файлов на диске, также можно подключить микрофон к компьютеру, тогда icecast2 будет передавать звук из микрофона.

Создаем конфиг файл /etc/ices.xml из шаблона /usr/share/doc/ices2/examples/ices-playlist.xml. Теперь нужно указать где лежит папка с файлами в формате ogg которые будут проигрываться на нашем радио. Добавляем в /etc/ices.xml элемент:


...
<input>
<module>playlist</module>
<param name="type">basic</param>
<param name="file">/var/music/playlist.txt</param>
<param name="random">1</param>
<param name="restart-after-reread">0</param>
<param name="once">0</param>
</input>
...



Теперь ices2 будет отдавать на сервер iceсast2 файлы которые перечислены в текстовом файле /var/music/playlist.txt. Теперь возникает вопрос: а кто же будет заполнять это файл ? Я решил что будет папка в которой я буду выкладывать аудио файлы, /var/music. Теперь надо написать скрипт который генерит плейлист из содержимого папки /var/music:


/usr/local/bin/update-playlist.sh
#!/bin/bash
find /var/music -name '*ogg' > /var/music/playlist.txt
chmod g+r -R /var/music



Дальше нужно сделать чтобы ices2 стартовал как сервис Unix. Пишем скрипт


/etc/init.d/ices
#!/bin/bash

PIDFILE=/var/run/ices/ices.pid

case "$1" in
start)
echo "Starting ices"
start-stop-daemon -b -c icecast2 -m -p $PIDFILE --exec /usr/bin/ices2 -S /etc/ices.xml
;;
stop)
echo "Stopping ices"
start-stop-daemon -p $PIDFILE -K
;;
*)
echo "Usage: /etc/init.d/ices {start|stop}"
exit 1
;;
esac

exit 0


Генерим плейлист:

generate-playlist.sh



Теперь включаем сервис ices2:


sudo update-rc.d ices defaults
sudo service ices start



Все, можно слушать радио.

Пока я возился с радио, сделал удивительное открытие: оказалось что формат MP3 не лучший выбор для хранения музыки, формат OGG намного лучше передает звук, особенно на высоких частотах. Ices2 не поддерживает MP3, зато поддерживает OGG, и слава богу. Я сравнил как звучит MP3 и OGG на одинаковом битрейте 192 Кb/s, оказалось что OGG намного ближе к оригиналу.
Есть плейер который умеет играть OGG стрим, называется ffmp3, его можно легко встроить в блог.

В заключение публикую редкое видео - как работает радио шансон, взгляд изнутри :)

четверг, 8 декабря 2011 г.

Плаваем не напрягаясь


Недавно я обнаружил что можно плавать не напрягаясь как угодно долго. Эта техника называется total immersion, смотрим видео. Делаем только один удар ногой на один гребок рукой, и большую часть времени тело просто скользит по воде.


четверг, 10 ноября 2011 г.

Gnome 3, Unity - катастрофа на десктопе

Прошел почти месяц как я обновил свой Убунту до версии 11.10. То что творится у меня на десктопе это катастрофа. Я много лет использовал Gnome 2, не было никаких проблем. Теперь Canonical навязывает мне уродливые и глючные Gnome 3 и Unity. Я не понимаю зачем вообще нужен Gnome 3, лучше бы девелоперы применили энергию в мирных целях. Твердо решил снести Ubuntu и попробовать Mint.

суббота, 29 октября 2011 г.

JavaScript MVC: идея Ruby on Rails живет и побеждает

В последнее время пришлось работать с языком JavaScript. За 10 лет я не писал на JavaScript, но в последний год пришлось его изучить и даже полюбить. Первым делом прочитал книгу "JavaScript, the good parts". Автор утверждает что JavaScript самый распространенный и самый малоизученный язык программирования, наверное это так. Потом прочитал книгу "jQuery in Action", и вдруг пришло понимание что на JavaScript действительно можно писать легко и красиво, и все же были сомнения как поддерживать JavaScript код если нету тестов. Я думал что единственный способ тестирования это Selenium, но оказалось что все интереснее. На прошлой неделе я нашел JavaScript MVC и понял что это то что надо. JavaScript MVC очень похож на Ruby on Rails, Grails и Django, только он написан на JavaScript. Контроллер в отличие от RoR находится не на веб сервере а на клиенте и реализован на JavaScript, view тоже. Сервером может быть все что угодно, лишь бы оно поддерживало json и REST. А самое приятное это возможность писать фунциональные тесты которые выполняются в браузере или движке javascript, например rhino. Итак, можно быстро писать на JavaScript код который покрывается тестами и легко поддерживается.

пятница, 3 июня 2011 г.

Моя презентация на Ciklum Software Architecture Practice Leaders Group

Выкладываю мое первое публичное выступление на тему Distributed Version Control.

Часть 1


Часть 2

вторник, 17 мая 2011 г.

Angelic Upstarts - Solidarity

Удивительно красивая музыка и слова.

вторник, 3 мая 2011 г.

DCVS is becoming mainstream

For the last two years I have been observing how popularity of distributed version control systems is increasing. Now is the time to admit that distributed version control systems are not exotic animals anymore, and more and more people realize advantages of DCVS. In a recent year when interviewing job seekers for Java developer's position I noticed growing number of candidates who tell that they use a DCVS at work. When I was looking for a job I've been interviewed several times, and I always asked my interviewers which VCS they use. Big companies use a kind of centralized version control, but many small and mid-sized companies have switched or are switching to a DCVS.

суббота, 30 апреля 2011 г.

Ubuntu 11.04 - неприятно удивлен

Вчера обновил Ubuntu до версии 11.04 и сразу же пожалел об этом. Вместо Gnome теперь будет Unity. Unity выглядит ужасно, к тому же еще и глючит не по детски. Спасением стала возможность выбрать "Ubuntu Classic" сессию, то есть Gnome.
Я считаю что Canonical сделала большую ошибку. Возможно прийдется менять дистрибутив Linux на другой, а этого не хотелось бы делать.

воскресенье, 3 апреля 2011 г.

My 6 tips for designing Java-based solutions

Database choice

The common mistake is to use MySQL in areas where PostgreSQL is a better choice. I mean enterprise applications with hundreds of tables and complicated normalized database structure used by intra-net users. I think it happens because MySQL is easier to set up and administrate, and more people familiar with it. While using MySQL is the right choice for high-load apps with denormalized database structure, and for projects with simple database structure, MySQL's query planner is not as good as PostgreSQL at the moment of writing this article. In addition, PostgreSQL has much stronger support for stored procedures, it implements wider set of ANSI SQL standard than MySQL. Nowadays almost every enterprise-application needs GIS functionality, and Postgresql has GIS support. Another advantage of PostgreSQL is that its date/time types include timezone information, and that will save you a lot of time by avoiding conversions from one timezone to another if you have users who operate in different timezones, for example, schedule service. I am not saying that it is impossible to use MySQL in this area, it is certainly possible, but the cost of development would be higher. If you need to import large bulks of data,it is likely that you will have to use stored procedures to import data in a reasonable time frame, and stored procedures in PostgreSQL exist for decades while MySQL adopted them 1 year ago.

Of course, it is possible to write a query which will be executing very slow on PostgreSQL, but in general, the chances to produce a good query plan are higher when using PostgreSQL, particularly for sub-queries.

Web framework choice

Ironically, in many cases decision to use Java for web development is a mistake. There are two cases here. Case 1, we can avoid using Java language, but still use Java platform, for example, with Grails. Case 2, we can avoid using Java platform at all, and use Apache plus some scripting language like PHP, Python or Ruby. My favorite is Python.

The problem with Java language for web is long development cycle. For example, when you add a method or variable to a Spring MVC controller, you have to re-compile the re-start web server. People who use scripting languages like PHP, Python or Groovy just save file on the disk and refresh the page, and that is much faster. So I suggest considering implementing web layer in Django, Ruby on Rails or Grails, and that can speed up web development from 2 to 5 times.

Templating

Let's assume that you decided to use Java for web developement. My advice is : avoid using JSP in any form, including JSTL! I suggest using FreeMarker which is a fantastic templating engine with clear and elegant syntax. Velocity is also a good choice. If your system sends emails, then use FreeMarker or Velocity for message body.


Configuration

Often people write classes which provide access to applications configuration. It is better to spend that time on something useful because commons configuration is an excellent library for configuring your application.

Tests

If you have functional tests, then TestNG is a better choice than JUnit. Functional tests are scenarios which are executed in an environment which is close to production environment, I mean real database, JMS server, probably mail server. For functional tests you will want to control the order of execution, for example, first you call your public API to enter some information into the system, then call API to update it, then call API to remove it. The order of operations is clear: first create, then update, then remove. In TestNG you can define the order with annotations. Of course, you can use JUnit, but TestNG is a more elegant solution for functional tests.

Temporal types

When designing API avoid using java.util.Calendar, use Joda Time instead. It will save you the time you would spend on writing unnecessary code for timezones, periods, intervals, time calculations.



пятница, 18 марта 2011 г.

Layla - Eric Clapton

Прекрасная аранжировка для акустической гитары.