22 мар. 2015 г.

Предварительный отзыв на книгу «Clojure web development essentials»

Недавно мне поступило предложение от издательства Packt Publishing: оставить отзыв о книге Clojure web development essentials в обмен на эту самую книгу.

Естественно, я согласился, потому что давно уже положил глаз на Clojure и его в веб-стек в том числе, и через некоторое время книга появилась в моей учетной записи на packtpub.com. Удобно, что прямо оттуда можно послать книгу прямо в Kindle — я использую приложение на телефоне и планшете, прогресс чтения синхронизируется между ними.

Итак, на данный я прочитал 5 глав из 11 и здесь опишу впечатления.

Краткое содержание прочитанного

О чем вообще книга

Как следует из названия, о веб-разработке с применением Clojure, причем только серверной части (соответственно, ничего нет про ClojureScript).

В книге используется «фреймворк» Luminus, который фреймворком можно назвать условно. Luminus — это шаблон для Leiningen (главная система сборки и автоматизации для Clojure-проектов), который предлагает некоторый набор библиотек для веб-разработки на Clojure и несколько удобных уже написанных функций (вроде запуска\остановки встроенного сервера, умного рендеринга шаблонов) и собственно каркаса приложения.

Глава 1. Приступая к работе с Luminus

Установка окружения, генерация с помощью Luminus первого приложения. В общем, запускаем HelloWorld и осматриваемся.

Глава 2. Ring и Ring Server

Хотя автор и называет главу «самой сухой в книге», она одна из самых главных — здесь достаточно подробно рассматривается основы взаимодействия с HTTP-стеком: request maps, response maps, handlers, middleware.

Глава 3. Логгирование

Как, наверное, и во всех языках, логгирование — это вещь из серии «настроил и забыл». Тут так же: сначала немного рассказывается про библиотеку Timbre, затем вместо стандартного настраиваем date rolling appender.

Глава 4. URL маршрутизация и шаблоны

Как стандартом для HTTP является Ring, так Compojure — стандартный набор макросов для генерации правил URL-маршрутизации. В первой части главы рассказывается про маршрутизацию URL, обработку и деструктуризацию параметров. Во второй части — про шаблонизатор Selmer, с краткой демонстрацией его возможностей: переменные, фильтры, теги, наследование шаблонов. Selmer написан с оглядкой на встроенный в Django шаблонизатор. Это удобно, учитывая распространенность подобного синтаксиса (в отличие, например, от Hiccup, который является скорее DSL для HTML).

Глава 5. Обработка ввода

В этой главе описан подход к валидации входных данных из HTML формы с помощью библиотеки Validateur и созданию переиспользуемых функций валидации.

Общие впечатления и примечания

Некоторые вещи уже устарели. Например, из Luminus 2 убрана библиотека lib-noir; для валидации теперь по умолчанию используется Bouncer, а не Validateur, как в книге; немного изменился код генерируемого приложения и т.д. Хоть автор и предупреждает об этом и говорит, как зафиксировать версию Luminus, чтобы все примеры из книги работали, все равно хочется самое свежее на данный момент. В целом можно приспособиться.

Отсутствует введение в Clojure, и это хорошо, потому что вряд ли кому-то нужно очередной tutorial по Clojure за 15 минут. Есть много хороших книг и кратких онлайн-руководств по языку.

Перед чтением, помимо знакомства с Clojure и основами веб-разработки, хорошо бы иметь представление о Java Servlet и контейнерах сервлетов, чтобы понять, что происходит в промежутке между браузером и Ring (и увидеть всю красоту Ring).

Понравился подход, когда сначала в кратком виде излагается «Что?», а после «Как?» и «Зачем?» — это позволяет быстро вернуться назад, и окинуть взглядом основные концепции главы. При этом нет слишком долгого описания библиотек — для глубокого ознакомления присутствуют ссылки на отдельную документацию (или прямиком на исходный код ☺). Кстати, книга своей простотой и последовательностью мне напомнила «The Definitive Guide to Django».

Также хорошо, что в такой небольшой книге освещаются важные для production темы: логирование, тестирование, миграции БД, работу в разных окружениях (dev\prod).

Заключение (тоже предварительное)

Пока что книга оставляет преимущественно позитивные впечатления. Даже если я не буду использовать Clojure в качестве основного языка в рабочих проектах, просто приятно отвлечься от «enterprise» кода с Java, Spring и т.п. и иногда что-нибудь на красивом языке.

3 янв. 2015 г.

Разделение окон в Openbox как в Windows 7

credits: http://v1chak.blogspot.ru/2013/03/lubuntu-openbox-keybind-to-split-screen.html

В секцию <keyboard> добавить:

<keybind key="W-Left">
    <action name="UnmaximizeFull"/>
    <action name="MoveResizeTo">
      <x>0</x>
      <y>0</y>
      <width>50%</width>
      <height>97%</height>
    </action>
</keybind>
<keybind key="W-Right">
    <action name="UnmaximizeFull"/>
    <action name="MoveResizeTo">
      <x>1/2</x>
      <y>0</y>
      <width>50%</width>
      <height>97%</height>
    </action>
</keybind>
<keybind key="W-Down">
    <action name="Iconify"/>
</keybind>
<keybind key="W-Up">
    <action name="Maximize"/>
</keybind>

2 янв. 2015 г.

Подключение к удаленному JMX через SSH

На сервере добавляем опции:

-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9999 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.ssl=false \

JMX сервер слушает 9999 порт.

Говорим ssh вести себя как прокси:

ssh -D 7777 <ssh host>

Локальный «прокси» слушает 7777 порт.

Подключаемся в JConsole:

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 \
service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi

Настраиваем и подключаемся в VisualVM:

Tools->Options->Network - Manual Proxy Settings localhost 7777

File -> Add remote host -> example.org

Right click example.org -> Add JXM connection -> example.org:9999

7 сент. 2013 г.

Компиляция Mercurial с помощью icc

Нужно было установить Mercurial на серверной машине с icc без админских прав.

Повезло, что в наличии были Python 2.6 и easy_install.

И из коробки (через easy_install), и установку руками по умолчанию Mercurial завершался с ошибкой, жалуясь на неопределенный символ __intel_security_cookie в модуле osutil.so.

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

Итак, чтобы установить Mercurial, в директории с исходниками нужно выполнить 2 команды:

CC=icc LDSHARED="icc -shared" python setup.py build
python setyp.py install --home=$HOME

После этого в домашнем каталоге появятся bin/ и lib/ (или lib64/).

Для нормального использования команды hg нужно добавить ${HOME}/bin в PATH и ${HOME}/lib/python (или ${HOME}/lib64/python) в PYTHONPATH.