Только недавно я восхищался (да и пока не перестал) node.js и вот совершенно случайно наткнулся на бинарники node.js под винду, а прямо рядом с ними очень интересное альтернативное мнение о node. Написано по-русски, доступным языком. Задумался. Но изучать не перестал.
node.js on windows
jabber web status
В поисках прикладной задачи для предметного изучения node.js вспомнил про заброшенный проектик – jabber web status.
И за несколько часов переписал на node. По сравнению с предыдущей версией написанной на PHP (XMPPHP) потребление памяти, а главное, нет ГЛАВНОЕ – потребление CPU снизилось до статистической погрешности (по непонятным причинам php-бот иногда забирает до 60% процессорного времени) . Скорость работы – отдельная, приятная на слух песня. Избавился от промежуточного хранилища (а значит и от лага в обновлении информации), в котором хранились статусы пользователей – скрипт не только работает с xmpp, но и сам раздаёт результат по http.
Работать с node ново и свежо. Удручает только то, что свежесть во всём – в библиотеках, в сборке, установке дополнительных модулей. Написание и отладка скриптика отняли от силы час, правка библиотек ещё два, установка node и модулей на сервере с дебильной Centos – целую вечность. Но всё-таки оно того стоит – писать на javascript легко и приятно, очень интересно использовать его вне привычных рамок браузера, асинхронность везде и во всём, интерпретатор, шустрый как электровеник, человеко-понятно ругается ошибками, неплохая документация к основным модулям. В общем хороший массаж не только для коры головного мозга, но и самой его древесины, изрядно дубеющих от PHP ;o)
Adobe AIR и linux. Часть II.
В начале года мне уже удалось установить Adobe AIR на свой slackware. Но спустя несколько месяцев вышел свежий релиз (2.0) и инструкция стала неактуальной. Я обещал разобраться и выложить обновлённую. Хотя и прошло почти полгода, но лучше поздно, чем никогда, правда?
С версией 2.0.2 так ничего и не вышло, а вот с недавно вышедшей версией 2.5 всё прошло очень гладко. Всё устанавливается и работает почти без проблем (остался описанный ранее изъян с тем, что инсталлятор air-приложений спрашивает пароль root-а).
Итак инструкция:
rpm --initdb
RPM_VERSION=`rpm --version|awk '{print $3}'`
cat <<ENDSPEC>>rpm.spec
Summary: The RPM package management system
Name: rpm
Version: ${RPM_VERSION}
Release: 1
Group: System Environment/Base
Url: http://www.rpm.org/
License: GPLv2+
BuildArch: noarch
Provides: /bin/sh
%description
The RPM Package Manager.
%files
ENDSPEC
BUILD=`rpmbuild -ba rpm.spec|grep 'noarch.rpm'|awk '{print $2}'`
rpm --justdb -ivh $BUILD
rm -f rpm.spec
GTK2_VERSION=`gtk-query-immodules-2.0|grep 'Created by'|awk '{print $6}'|sed 's/gtk+-//'`
cat <<ENDSPEC>>gtk2.spec
Summary: The GIMP ToolKit (GTK+), a library for creating GUIs for X
Name: gtk2
Version: ${GTK2_VERSION}
Release: 1
License: LGPLv2+
Group: System Environment/Libraries
%description
GTK+ is a multi-platform toolkit for creating GUI.
%files
ENDSPEC
BUILD=`rpmbuild -ba gtk2.spec|grep 'i386.rpm'|awk '{print $2}'`
rpm --justdb -ivh $BUILD
rm -f gtk2.spec
COREUTILS_VERSION=`/bin/env --version|head -n1|awk '{print $4}'`
for bin in /usr/bin/env /bin/uname /bin/cat /bin/chmod /bin/ln /bin/ls /bin/rm /bin/sh /bin/echo; do
PKG=`basename $bin`
mkdir -p /root/rpmbuild/BUILDROOT/$PKG-$COREUTILS_VERSION-1.i386/bin
mkdir -p /root/rpmbuild/BUILDROOT/$PKG-$COREUTILS_VERSION-1.i386/usr/bin
cp $bin /root/rpmbuild/BUILDROOT/$PKG-$COREUTILS_VERSION-1.i386$bin
cat <<ENDSPEC>>$PKG.spec
Summary: Coreutils
Name: $PKG
Version: ${COREUTILS_VERSION}
Release: 1
License: LGPLv2+
Group: System Environment/Libraries
%description
GNU Coreutils
%files
$bin
ENDSPEC
BUILD=`rpmbuild -ba $PKG.spec|grep 'i386.rpm'|awk '{print $2}'`
rpm --justdb -ivh $BUILD
rm -f $PKG.spec
done
AWK_VERSION=`/usr/bin/awk --version|head -n1|awk '{print $3}'`
mkdir -p /root/rpmbuild/BUILDROOT/awk-$AWK_VERSION-1.i386/usr/bin
cp /usr/bin/awk /root/rpmbuild/BUILDROOT/awk-$AWK_VERSION-1.i386/usr/bin/awk
cat <<ENDSPEC>>awk.spec
Summary: GNU AWK
Name: awk
Version: ${AWK_VERSION}
Release: 1
License: LGPLv2+
Group: System Environment/Libraries
%description
GNU AWK
%files
/usr/bin/awk
ENDSPEC
BUILD=`rpmbuild -ba awk.spec|grep 'i386.rpm'|awk '{print $2}'`
rpm --justdb -ivh $BUILD
rm -f awk.spec
GREP_VERSION=`/usr/bin/grep --version|head -n1|awk '{print $4}'`
mkdir -p /root/rpmbuild/BUILDROOT/grep-$GREP_VERSION-1.i386/bin
cp /usr/bin/grep /root/rpmbuild/BUILDROOT/grep-$GREP_VERSION-1.i386/bin/grep
cat <<ENDSPEC>>grep.spec
Summary: GNU GREP
Name: grep
Version: ${GREP_VERSION}
Release: 1
License: LGPLv2+
Group: System Environment/Libraries
%description
GNU GREP
%files
/bin/grep
ENDSPEC
BUILD=`rpmbuild -ba grep.spec|grep 'i386.rpm'|awk '{print $2}'`
rpm --justdb -ivh $BUILD
rm -f grep.spec
LIBXML2_VERSION=`xml2-config --version`
mkdir -p /root/rpmbuild/BUILDROOT/libxml2-$LIBXML2_VERSION-1.i386/usr/lib/
ln -s /usr/lib/libxml2.so /root/rpmbuild/BUILDROOT/libxml2-$LIBXML2_VERSION-1.i386/usr/lib/libxml2.so.2
cat <<ENDSPEC>>libxml2.spec
Summary: XML parser library
Name: libxml2
Version: ${LIBXML2_VERSION}
Release: 1
License: LGPLv2+
Group: System Environment/Libraries
%description
XML parser library
%files
/usr/lib/libxml2.so.2
ENDSPEC
BUILD=`rpmbuild -ba libxml2.spec|grep 'i386.rpm'|awk '{print $2}'`
rpm --justdb -ivh $BUILD
rm -f libxml2.spec
LIBXSLT_VERSION=`xslt-config --version`
mkdir -p /root/rpmbuild/BUILDROOT/libxslt-$LIBXSLT_VERSION-1.i386/usr/lib/
ln -s /usr/lib/libslt.so /root/rpmbuild/BUILDROOT/libxslt-$LIBXSLT_VERSION-1.i386/usr/lib/libxslt.so.1
cat <<ENDSPEC>>libxslt.spec
Summary: XML transformation library
Name: libxslt
Version: ${LIBXSLT_VERSION}
Release: 1
License: LGPLv2+
Group: System Environment/Libraries
%description
XML transformation library
%files
/usr/lib/libxslt.so.1
ENDSPEC
BUILD=`rpmbuild -ba libxslt.spec|grep 'i386.rpm'|awk '{print $2}'`
rpm --justdb -ivh $BUILD
rm -f libxslt.spec
wget http://airdownload.adobe.com/air/lin/download/latest/adobeair.i386.rpm
rpm -i adobeair.i386.rpm
Суть скрипта – создать для rpm фиктивную базу “зависимостей” необходимых для установки adobeair.
Скрипт проверен на нескольких инсталяциях более-менее свежих slackware, но инструкция должна подойти для любых не deb (и не rpm) систем.
Особая благодарность товарищу deywos, который не просто обнаружил “кривость” инструкции, опубликованной ранее, но и помог разобраться в причинах.
Subversion и время модификации файлов
Крайне странно что раньше я не замечал по-умолчанию директива use-commit-times ВЫКЛЮЧЕНА!.
Включить, понятное дело, можно настройкой в конфиге ~/.subversion/config.
Ну или в cli добавив параметр –config-option=config:miscellany:use-commit-times=yes
Adobe AIR и linux
Разумеется все заинтересованные уже в курсе, что Adobe AIR уже давно имеется под linux. И так же все давно в курсе, что установить runtime можно на rpm и deb-based дистрибутивы (читай red hat и bubuntu).
Остальным приходилось запускать приложения, установив adobe air sdk. И делать это, прямо скажем, было не слишком удобно.
Но кой-чего, как оказалось, сделать всё-таки можно – можно индусский инсталятор нае^Wобмануть. Можно прикинуться красной шапочкой например.

И так имеем – Slackware-current (13+), AdobeAirInstaller и горячее желание всё это заставить работать вместе, без песен и плясок народов крайнего севера.
Нужно создать базу rpm-пакетов и “установить” пакеты rpm (и как оказалось ещё gtk2), после чего air установится без сучка и задоринки.
Как это сделать?
rpm --initdb
RPM_VERSION=`rpm --version|awk '{print $3}'`
cat <<ENDSPEC>>rpm.spec
Summary: The RPM package management system
Name: rpm
Version: ${RPM_VERSION}
Release: 1
Group: System Environment/Base
Url: http://www.rpm.org/
License: GPLv2+
BuildArch: noarch
Provides: /bin/sh
%description
The RPM Package Manager.
%files
ENDSPEC
BUILD=`rpmbuild -ba rpm.spec|grep 'noarch.rpm'|awk '{print $2}'`
rpm -ivh $BUILD
GTK2_VERSION=`gtk-query-immodules-2.0|grep 'Created by'|awk '{print $6}'|sed 's/gtk+-//'`
cat <<ENDSPEC>>gtk2.spec
Summary: The GIMP ToolKit (GTK+), a library for creating GUIs for X
Name: gtk2
Version: ${GTK2_VERSION}
Release: 1
License: LGPLv2+
Group: System Environment/Libraries
%description
GTK+ is a multi-platform toolkit for creating GUI.
%files
ENDSPEC
BUILD=`rpmbuild -ba gtk2.spec|grep 'i386.rpm'|awk '{print $2}'`
rpm -ivh $BUILD
Выполнив этот нехитрый скрипт под рутом, можете запускать инсталятор – спросив пароль рута, он безропотно установится.
Думаю этот метод подойдёт для любого дистрибутива, про который не слыхом не слыхивали “специалисты” из адоба.

P.S.
Единственное что – при установке приложений инсталятор спрашивает пароль root-а. Нет, не sudo, а именно su… Я не знаю ведёт ли он себя так же на “родных” для себя дистрибутивах, но мне это жутко не нравится… В остальном всё работает хорошо – приложения устанавливаются из браузера, иконки в меню и т.п.
kdebindings и ruby1.9
Злосчастное обновление ruby до 1.9 сломало не только watir, но и мои плазмоиды.
Полдня провёл в попытках разобраться с ситуацией – при загрузке rubygems вываливается трэйс, смысл которого в:
undefined method `synchronize’ for #<Mutex:0xab1cd2> .
Нашёл несколько сообщений с описываемой проблемой «встроенного ruby» , но решения по всей видимости нету.
Поэтому пришлось установить «старый» ruby и собрать kdebindings с ним:
tar -zxf kdebindings-*.tgz
cd kdebindings-*
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_KROSSRUBY=off -DENABLE_PYKDE4=off -DRUBY_INCLUDE_PATH=/opt/ruby4kde/lib/ruby/1.8/i686-linux/ -DRUBY_LIBRARY=/opt/ruby4kde/lib/libruby.so -DRUBY_EXECUTABLE=/opt/ruby4kde/bin/ruby ..
make && make install
watir и ruby1.9
В системе обновился ruby до 1.9 и после переустановки нужных gem-ов ВНЕЗАПНО обнаружилось, что watir не грузится.
/usr/lib/ruby/gems/1.9.1/gems/user-choices-1.1.6/lib/user-choices/arglist-strategies.rb:152: warning: else without rescue is useless
/usr/lib/ruby/gems/1.9.1/gems/user-choices-1.1.6/lib/user-choices.rb:1:in `require’: /usr/lib/ruby/gems/1.9.1/gems/user-choices-1.1.6/lib/user-choices/arglist-strategies.rb:148: syntax error, unexpected ‘:’, expecting keyword_then or ‘,’ or ‘;’ or ‘\n’ (SyntaxError)
when 0: # This is not considered an error because another source
Решить «проблему» удалось редактированием нескольких файлов в /usr/lib/ruby/gems/1.9.1/gems/user-choices-1.1.6/lib/user-choices/ – в arglist-stragergies.rb, conversions.rb и sources.rb необходимо все конструкции вида when XXXX : заменить на when XXXX then