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.

20 дек. 2012 г.

Обо всем № 1

Новый формат постов — сборная солянка. Короткие заметки, собранные в разное время и не тянущие на отдельный пост.

12 нояб. 2012 г.

Отчеты в Maven

upd 03.01.2015: конфиг переехал в reporting вместо site plugin, обновлены версии плагинов

Под катом очередная простыня XML с моим конфигом для построения отчетов, собранным из разных мест интернета.

9 авг. 2012 г.

Немного о Munin

Когда-то давно на домашнем сервере установил Munin, настроил по умолчанию (c помощью --suggest) и забыл. Со временем что-то изменилось, что-то добавилось: ACPI плагин перестал показывать температуру, потому что при очередном обновлении ядра пропало устройство из /proc/acpi/thermal_zone/что-то_там, появились Apache Tomcat и nginx, для которых тоже интересно получать разные красивые графики. А еще захотелось настроить уведомления о неприятных ситуациях вроде перегрева, недостатка свободного места на дисках и т. п.

29 февр. 2012 г.

Box.net, доступ через WebDAV с помощью Nautilus

По мотивам заметки на Лайфхакере.

В адресной строке Наутилуса пишем:

davs://www.box.com/dav
davs — WebDAV через HTTPS.

Затем вводим логин и пароль, и все, можно пользоваться. Для быстрого доступа в дальнейшем примонтированный сетевой диск можно добавить в закладки.

23 февр. 2012 г.

Mako, Markdown и немного Python...

... или генерируем кучу статического HTML с минимумом копипаста

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

Задача

Недавно понадобилось сделать из большого структурированного текста HTML-документы с навигацией.

Решил сделать это с помощью шаблонов и языка разметки Markdown, потому что:

  1. Можно избежать копипаста однотипной HTML-разметки, так как общая структура у документов одинаковая.
  2. При изменении структуры, ссылок на стили и т. п. не нужно изменять много файлов.

13 февр. 2012 г.

Maven и Mercurial. Версия с точностью до changeset'а

Захотелось для Maven проекта, размещенного в разных местах и с разными билдами, знать точную версию в виде changeset'a из репозитория Mercurial.

Ниже быстрое, простое (без scm плагина) и не слишком гибкое решение в виде кусков pom.xml.

20 янв. 2012 г.

Openbox. Индикаторы звука и раскладки клавиатуры

Уже достаточно давно начал пользоваться этими маленькими полезнюшками (наряду с описанными ранее). Пишу, чтобы не забыть названия программ :)

14 янв. 2012 г.

Lighttpd и Trac

Хоть Trac уже и заглушен, оставляю это тут на всякий случай.
Под катом кусок конфига lighttpd для Trac'а с комментариями.
/trac/root тут — корневая директория
Работало все это на поддомене (HTTP["host"] =~ "^trac\.example\.com$").

21 окт. 2011 г.

Realtek 8192se PKGBUILD Linux 3.x

As people say kernel 3.x driver for Realtek wifi-cards works worse than official one.

So I'll try to install it and see the difference.

Here is my PKGBUILD for Arch Linux. It's based on AUR package.

Here you'll find new driver (last from Realtek for kernel >= 2.6.35 official page) and some hack (thanks mhertz) to compile this driver.


# Maintainer: Techlive Zheng 
# Contributor: Peter Bui 

pkgname=rtl8192se
pkgdesc="Drivers for Realtek 8192SE wireless chipset"
pkgver=0003.0620.2011
pkgrel=5
license=("GPL")
depends=('linux>=3.0.0') 
makedepends=('linux>=3.0.0')
install="${pkgname}.install"
source=("ftp://WebUser:r3iZ6vJI@95.130.192.218/cn/wlan/92ce_se_de_linux_mac80211_${pkgver}.tar.gz")
md5sums=('f6d488ef52ba284b859989de58d85839')
changelog=Changelog
arch=('i686' 'x86_64')
url="http://www.realtek.com.tw/"

build() {
    cd ${srcdir}/rtl_92ce_92se_92de_linux_mac80211_${pkgver}

    sed -i 's|RX_FLAG_TSFT|RX_FLAG_MACTIME_MPDU|g' base.c rtl8192{ce,se,de}/trx.c

    make || return 1
}

package(){
    cd ${srcdir}/rtl_92ce_92se_92de_linux_mac80211_${pkgver}
    FW="${pkgdir}/lib/firmware"
    DEST="${pkgdir}/lib/modules/$(uname -r)/kernel/drivers/net/wireles/rtlwifi" 
    mkdir -p $FW/rtl8192{se,ce,de}
    mkdir -p $DEST/rtl8192{se,ce,de}

    #make FIRMWAREDIR=$FW MODDESTDIR=$DEST install
    install -p -m 644 rtlwifi.ko $DEST 
    install -p -m 644 ./rtl8192se/rtl8192se.ko $DEST/rtl8192se
    install -p -m 644 ./rtl8192ce/rtl8192ce.ko $DEST/rtl8192ce
    install -p -m 644 ./rtl8192de/rtl8192de.ko $DEST/rtl8192de

    cp -fr firmware/rtlwifi/ $FW/.
}

16 июн. 2011 г.

LaTeX. Скобки в математическом режиме


\left delim1 ... \right delim2

The two delimiters need not match; ‘.’ acts as a null delimiter, producing no output. The delimiters are sized according to the math in between. Example: \left( \sum_i=1^10 a_i \right].
Фишка с точкой после скобки понадобилась для систем уравнений.

source:

LaTeX reference