<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-2480586187022057955</atom:id><lastBuildDate>Mon, 02 Sep 2024 00:30:48 +0000</lastBuildDate><category>erlang</category><category>fp</category><category>maven</category><category>python</category><category>faxien</category><category>memo</category><category>setup</category><category>PyGTK</category><category>design</category><category>framework</category><category>github</category><category>html</category><category>import</category><category>linux X</category><category>nexus</category><category>nitrogen</category><category>pip</category><category>portius</category><category>server</category><category>sinan</category><category>virtualenvwrapper</category><category>virtualevn</category><category>web</category><title>3BEP</title><description></description><link>http://3bep.blogspot.com/</link><managingEditor>noreply@blogger.com (3BEP)</managingEditor><generator>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-8343535620584249237</guid><pubDate>Sat, 21 Jul 2012 16:28:00 +0000</pubDate><atom:updated>2012-07-21T19:28:04.997+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">erlang</category><category domain="http://www.blogger.com/atom/ns#">fp</category><category domain="http://www.blogger.com/atom/ns#">framework</category><category domain="http://www.blogger.com/atom/ns#">nitrogen</category><category domain="http://www.blogger.com/atom/ns#">web</category><title>Обзор веб-фреймворка Nitrogen</title><description>&lt;b&gt;&lt;a href=&quot;http://nitrogenproject.com/&quot; target=&quot;_blank&quot;&gt;Nitrogen&lt;/a&gt;&lt;/b&gt;&amp;nbsp;- веб-фреймворк написанный на &lt;a href=&quot;http://www.erlang.org/&quot; target=&quot;_blank&quot;&gt;Erlang&lt;/a&gt;. Главное достоинство этого фреймворка - возможность легко и быстро создавать интерактивные приложения взаимодействующие с сервером с помощью Ajax. Создание comet соединения требует буквально нескольких строк кода. Пример простейшего чата на основе Nitrogen занимает менее страницы кода.&lt;br /&gt;
&lt;br /&gt;
Основной язык для Nitorgen это Erlang. Javascript явно не используется, хотя jQuery и используется для клиентской части. Специфика Erlang позволяет обойтись без зависимости от внешней базы данных для поддержки функционала сессий. Впрочем Erlang значительно упрощает предоставление общего доступа для всего кластера к данным находящимся на одном узле. Так же благодаря Erlang есть возможность использовать различные встроенные веб-сервера - встроенный inets, давно известный Yaws, недавно появившийся Cowboy. &lt;a href=&quot;http://nitrogenproject.com/doc/tutorial.html&quot; target=&quot;_blank&quot;&gt;Руководство&lt;/a&gt;, &lt;a href=&quot;http://nitrogenproject.com/doc/index.html&quot; target=&quot;_blank&quot;&gt;документация&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Маршрутизация в Nitrogen динамическая. Она строится на основании имен модулей. Корень сайта это &lt;i style=&quot;background-color: white;&quot;&gt;index.erl.&amp;nbsp;&lt;/i&gt;Подчеркивания преобразуются в слеши, например:
&lt;i style=&quot;background-color: white;&quot;&gt;http://localhost:8000/routes/to/a/module&lt;/i&gt; будет обработан модулем &lt;i style=&quot;background-color: white;&quot;&gt;routes_to_a_module.erl&lt;/i&gt;. Модуль выбирается по наиболее длинному совпадению: &lt;i style=&quot;background-color: white;&quot;&gt;http://localhost:8000/routes/to/a/module/foo/bar&lt;/i&gt; будет обработан модулем &lt;i style=&quot;background-color: white;&quot;&gt;routes_to_a_module.erl&lt;/i&gt;. Путь для которого не найден модуль обрабатывается модулем&amp;nbsp;&lt;i style=&quot;background-color: white;&quot;&gt;web_404.erl&lt;/i&gt;&amp;nbsp;если он существует. &lt;a href=&quot;http://nitrogenproject.com/doc/tutorial.html#sec-16_1_1&quot; target=&quot;_blank&quot;&gt;Подробности&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Страница рендерится из шаблона. Шаблон - это HTML файл с вставками вызовов функций Erlang &lt;i style=&quot;background-color: white;&quot;&gt;[[[module:function(Args)]]]&lt;/i&gt;.&amp;nbsp;Специальное имя модуля&amp;nbsp;&lt;i style=&quot;background-color: white;&quot;&gt;page&lt;/i&gt;&amp;nbsp;ссылается на текущую страницу. Хотя вызов функции выглядит похожим на обычный код Erlang - это не так. Вызов функции должен обязательно быть в форме &lt;i style=&quot;background-color: white;&quot;&gt;module:function(Args)&lt;/i&gt;. Так же возможно задавать вызовы для Javascript в виде &lt;i style=&quot;background-color: white;&quot;&gt;[[[script]]]&lt;/i&gt;. &lt;a href=&quot;http://nitrogenproject.com/doc/tutorial.html#sec-19_1_1&quot; target=&quot;_blank&quot;&gt;Подробности&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Система шаблонов подходит для описания статичной раскладки страницы. Для динамических частей предназначены Элементы (Nitrogen Elements). Элемент это HTML или запись (Erlang record) с данными, которая рендерится в HTML. Пример простейшего элемента это &lt;i style=&quot;background-color: white;&quot;&gt;#p{text=&quot;Text.&quot;}&lt;/i&gt;&amp;nbsp;который будет отрендерен в &lt;i style=&quot;background-color: white;&quot;&gt;&amp;lt;p class=&quot;wfid_temp790097 p&quot;&amp;gt;Text.&amp;lt;/p&amp;gt;&lt;/i&gt;. Элементы могут быть вложенными и Элементы могут быть связаны с Действиями. &lt;a href=&quot;http://nitrogenproject.com/doc/elements.html&quot; target=&quot;_blank&quot;&gt;Подробности&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Действия (Nitrogen Actions) это Javascript код или запись (Erlang record) которая рендерится в Javascript. Действия могут быть включены в Элемент с использованием свойства &lt;i style=&quot;background-color: white;&quot;&gt;action&lt;/i&gt; или связаны с Элементом с помощью функции &lt;i style=&quot;background-color: white;&quot;&gt;wf:wire/N&lt;/i&gt;. Действие может быть простым визуальным эффектом или сложным взаимодействием с сервером. Действие иницируются объктами заданными в свойстве Триггер и изменяют объекты указанные в свойстве Цель. Действия работают на клиенте. &lt;a href=&quot;http://nitrogenproject.com/doc/actions.html&quot; target=&quot;_blank&quot;&gt;Подробности&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Передача контроля от клиента к серверу производится с помощью События (Nitrogen Event) у которого заполнено свойство &lt;i style=&quot;background-color: white;&quot;&gt;postback=term&lt;/i&gt;. На сервере Событие обрабатывается функцией &lt;i&gt;event/1.&lt;/i&gt;&amp;nbsp;Используя &lt;i style=&quot;background-color: white;&quot;&gt;wf:update/2, wf:insert_top/2, wf:insert_bottom/2, wf:replace/2, wf:remove/1&lt;/i&gt;&amp;nbsp;в функции &lt;i&gt;event/1&lt;/i&gt;&amp;nbsp;можно изменять Элементы на клиенте. &lt;a href=&quot;http://nitrogenproject.com/doc/api.html#sec-2&quot; target=&quot;_blank&quot;&gt;Подробности&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
События обычно инициируются клиентом. Когда нужно обновлять данные на клиенте постоянно используют технологию Comet. Comet инициируется клиентом как обычный запрос, но соединение не закрывается. Когда сервер имеет данные для клиента - сущестующее соединение используется для передачи данных. Nitrogen значительно упрощает использование Comet. Функции &lt;i style=&quot;background-color: white;&quot;&gt;wf:comet/N&lt;/i&gt; запускают заданную функцию как независимый процесс. Этот процесс может сам собирать данные для клиента или ожидать данные от других процессов. Функция &lt;i style=&quot;background-color: white;&quot;&gt;wf:send/2&lt;/i&gt; позволяет отправить сообщение существующему процессу Comet. &lt;a href=&quot;http://nitrogenproject.com/doc/api.html#sec-5&quot; target=&quot;_blank&quot;&gt;Подробности&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Пример простейшего чата из &lt;a href=&quot;http://nitrogenproject.com/doc/tutorial.html#sec-69_1_1&quot; target=&quot;_blank&quot;&gt;Руководства&lt;/a&gt;:&lt;br /&gt;
&lt;pre class=&quot;src src-erlang&quot; style=&quot;border: 1pt solid rgb(174, 189, 204); color: #223366; font-family: Inconsolata, &#39;Courier New&#39;, Mono; font-size: 19px; line-height: 30px; overflow: auto; padding: 10px 30px;&quot;&gt;&lt;span style=&quot;color: #28439b;&quot;&gt;body&lt;/span&gt;() -&amp;gt;&lt;span style=&quot;color: #28439b;&quot;&gt; &lt;/span&gt;
    &lt;span style=&quot;color: #28439b;&quot;&gt;wf&lt;/span&gt;:&lt;span style=&quot;color: #28439b;&quot;&gt;comet_global&lt;/span&gt;(&lt;span style=&quot;color: #fb5d17;&quot;&gt;fun&lt;/span&gt;() -&amp;gt;&lt;span style=&quot;color: #28439b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #28439b;&quot;&gt;repeater&lt;/span&gt;() &lt;span style=&quot;color: #fb5d17;&quot;&gt;end&lt;/span&gt;, repeater_pool),
    [
        #&lt;span style=&quot;color: #28439b;&quot;&gt;textbox&lt;/span&gt; { id=msg, text=&lt;span style=&quot;color: #09a240;&quot;&gt;&quot;Your message...&quot;&lt;/span&gt;, next=submit },
        #&lt;span style=&quot;color: #28439b;&quot;&gt;button&lt;/span&gt; { id=submit, text=&lt;span style=&quot;color: #09a240;&quot;&gt;&quot;Submit&quot;&lt;/span&gt;, postback=submit },
        #&lt;span style=&quot;color: #28439b;&quot;&gt;panel&lt;/span&gt; { id=placeholder }
    ].

&lt;span style=&quot;color: #28439b;&quot;&gt;event&lt;/span&gt;(submit) -&amp;gt;
    ?&lt;span style=&quot;color: #a639ae;&quot;&gt;PRINT&lt;/span&gt;(&lt;span style=&quot;color: #28439b;&quot;&gt;wf&lt;/span&gt;:&lt;span style=&quot;color: #28439b;&quot;&gt;q&lt;/span&gt;(msg)),
    &lt;span style=&quot;color: #28439b;&quot;&gt;wf&lt;/span&gt;:&lt;span style=&quot;color: #28439b;&quot;&gt;send_global&lt;/span&gt;(repeater_pool, {msg, &lt;span style=&quot;color: #28439b;&quot;&gt;wf&lt;/span&gt;:&lt;span style=&quot;color: #28439b;&quot;&gt;q&lt;/span&gt;(msg)}).

&lt;span style=&quot;color: #28439b;&quot;&gt;repeater&lt;/span&gt;() -&amp;gt;
    &lt;span style=&quot;color: #fb5d17;&quot;&gt;receive&lt;/span&gt; 
        {msg, &lt;span style=&quot;color: black;&quot;&gt;Msg&lt;/span&gt;} -&amp;gt;&lt;span style=&quot;color: #28439b;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #28439b;&quot;&gt;wf&lt;/span&gt;:&lt;span style=&quot;color: #28439b;&quot;&gt;insert_top&lt;/span&gt;(placeholder, [&lt;span style=&quot;color: black;&quot;&gt;Msg&lt;/span&gt;, &lt;span style=&quot;color: #09a240;&quot;&gt;&quot;&amp;lt;br&amp;gt;&quot;&lt;/span&gt;])
    &lt;span style=&quot;color: #fb5d17;&quot;&gt;end&lt;/span&gt;,
    &lt;span style=&quot;color: #28439b;&quot;&gt;wf&lt;/span&gt;:&lt;span style=&quot;color: #28439b;&quot;&gt;flush&lt;/span&gt;(),
    &lt;span style=&quot;color: #28439b;&quot;&gt;repeater&lt;/span&gt;().&lt;/pre&gt;
&lt;br /&gt;
Наилучшей областью применения Nitrogen будут интерактивные приложения взаимодействующие с пользователем и с группами пользователе весь период работы, например игры или панель управления с активным обновлением статистики и интерактивными элементами управления. Для классических сайтов большая часть содержимого которых статично и время уведомления пользователя про обновления не имеет особого значения применять Nitrogen будет бесполезной тратой времени и усилий.&lt;br /&gt;
&lt;br /&gt;</description><link>http://3bep.blogspot.com/2012/07/nitrogen.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-5103487708603079949</guid><pubDate>Thu, 14 Apr 2011 22:51:00 +0000</pubDate><atom:updated>2011-04-15T01:51:29.632+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">server</category><title>Простейший способ открыть доступ к директории по http</title><description>Когда-то мне понадобилось перебросить данные между удаленными машинами.&lt;br /&gt;
Условия не то что бы особо сложные, но узкие места возникли сразу - данные надо&lt;br /&gt;
было залить на машины: с свежеустановленной Windows XP подключенной в&lt;br /&gt;
корпоративную сеть, на которую можно было зайти только через &quot;Удаленный рабочий&lt;br /&gt;
стол&quot; с весьма ограниченными правами; Mac Mini в том же сегменте что и машина с&lt;br /&gt;
Windows. Данные расположены на сервере в другом сегменте сети. Связь между&lt;br /&gt;
сегментами - только через http-прокси. Сервер с данными тоже не внушал вдохновения -&lt;br /&gt;
блейд с read-only корневой файловой системой смонтированной по НФС и без прав&lt;br /&gt;
редактирования образа. Веб-сервер на блейде естественно не установлен. Но на&lt;br /&gt;
выручку пришел Python - простая команда позволила запустить примитивный&lt;br /&gt;
http-сервер, с которого уже можно скачать данные используя Internet Explorer из&lt;br /&gt;
комплекта Windows и Safari из MacOS. Команда действительно проста:&lt;br /&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;python -m SimpleHTTPServer 9090
&lt;/pre&gt;Эта команда запускает веб сервер с корнем в текущей директории на порту 9090&lt;br /&gt;
(впрочем порт можно использовать любой).</description><link>http://3bep.blogspot.com/2011/04/http.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-4755048993317753456</guid><pubDate>Tue, 30 Nov 2010 12:01:00 +0000</pubDate><atom:updated>2010-11-30T14:01:00.392+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">memo</category><category domain="http://www.blogger.com/atom/ns#">pip</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">virtualenvwrapper</category><category domain="http://www.blogger.com/atom/ns#">virtualevn</category><title>Памятка для virtualevn, virtualenvwrapper and pip</title><description>Установка пакетов с помощью easy_install:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:bash&quot;&gt;$ sudo easy_install virtualenv
$ sudo easy_install pip
$ sudo easy_install virtualenvwrapper
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Добавить в &lt;span style=&quot;font-style:italic;&quot;&gt;~/.bashrc&lt;/span&gt;:&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;# Путь к корневой директории виртульных окружений
export WORKON_HOME=$HOME/py_virtual_envs

# Для Arch этот путь отличается от стандартного
# /usr/local/bin/virtualenvwrapper_bashrc
source /usr/bin/virtualenvwrapper_bashrc
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Теперь надо чтобы настройки вступили в действие:&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ source ~/.bashrc
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Создание нового окружения - команда &lt;span style=&quot;font-weight: bold;&quot;&gt;mkvirtualenv &lt;имя окружения&gt;&lt;/span&gt; или &lt;span style=&quot;font-weight: bold;&quot;&gt;mkvirtualenv --no-site-packages &lt;имя окружения&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Проверка:&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ workon
*
$ mkvirtualenv temp
New python executable in temp/bin/python
Installing setuptools............done.
$ workon
temp
$ mkvirtualenv temp2
New python executable in temp2/bin/python
Installing setuptools............done.
$ workon
temp
temp2
$ workon temp
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Переход в директорию текущего виртуального окружения:&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ cd $VIRTUAL_ENV
$ pwd
/home/beast/py_virtual_envs/temp

$ workon temp2
$ cd $VIRTUAL_ENV
$ pwd
/home/beast/py_virtual_envs/temp2
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Или можно использовать команду &lt;span style=&quot;font-weight: bold;&quot;&gt;cdvirtualenv&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ workon temp
$ cdvirtualenv
$ pwd
/home/beast/py_virtual_envs/temp2

$ cdvirtualenv include/python2.6/
$ pwd
/home/beast/py_virtual_envs/temp/include/python2.6
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
отключение виртульного окружения&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ deactivate
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Удаление виртуального окружения&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ rmvirtualenv temp
$ rmvirtualenv temp2
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Опции mkvirtualenv передаются напрямую в &lt;span style=&quot;font-style: italic;&quot;&gt;virtualenv&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ mkvirtualenv --no-site-packages temp3
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
есть быстрый переход к текущей директории &lt;span style=&quot;font-style: italic;&quot;&gt;site-packages&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ cdsitepackages
$ pwd
/home/beast/py_virtual_envs/temp3/lib/python2.6/site-packages
$ ls -l
итого 352
drwxr-xr-x 3 beast beast   4096 Мар 13 21:13 .
drwxr-xr-x 4 beast beast   4096 Мар 13 21:13 ..
-rw-r--r-- 1 beast beast    237 Мар 13 21:13 easy-install.pth
drwxr-xr-x 4 beast beast   4096 Мар 13 21:13 pip-0.6.3-py2.6.egg
-rw-r--r-- 1 beast beast 333447 Мар 13 12:53 setuptools-0.6c11-py2.6.egg
-rw-r--r-- 1 beast beast     30 Мар 13 21:13 setuptools.pth
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Есть команда для добавления директорий с пакетами - &lt;span style=&quot;font-weight: bold;&quot;&gt;add2virtualenv &lt;директория&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ add2virtualenv ~/py_virtual_envs/temp3/temp/
Warning: Converting &quot;/home/beast/py_virtual_envs/temp3/temp/&quot; to &quot;/home/beast/py_virtual_envs/temp3/temp&quot;
$ python
Python 2.6.4 (r264:75706, Jan 25 2010, 09:01:01)
[GCC 4.4.2 20091208 (prerelease)] on linux2
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&gt;&gt;&gt; import additional_package
&gt;&gt;&gt; additional_package.NAME
&#39;Additional package&#39;
^D
$ cat ./temp/additional_package/__init__.py
NAME=&quot;Additional package&quot;
$ add2virtualenv ~/py_virtual_envs/temp3/temp/
$ add2virtualenv
Usage: add2virtualenv dir [dir ...]

Existing paths:
/home/beast/py_virtual_envs/temp3/temp
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Просмотр установленных пакетов:&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;$ lssitepackages
easy-install.pth  pip-0.6.3-py2.6.egg  setuptools-0.6c11-py2.6.egg
setuptools.pth  virtualenv_path_extensions.pth

virtualenv_path_extensions.pth:
/home/beast/py_virtual_envs/temp3/temp
&lt;/pre&gt;&lt;br /&gt;
В ~/.bashrc можно так же добавить:&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true
# Это позволит pip определить текущее виртуальное окружение
# и устанавливать в него без использования параметра -E
&lt;/pre&gt;</description><link>http://3bep.blogspot.com/2010/11/virtualevn-virtualenvwrapper-and-pip.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-9206550584213099546</guid><pubDate>Tue, 30 Nov 2010 11:44:00 +0000</pubDate><atom:updated>2010-11-30T13:44:36.821+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">erlang</category><category domain="http://www.blogger.com/atom/ns#">fp</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Maven Erlang plugin rewrite</title><description>Я уже писал про установку и настройку Maven для сборки Erlang проектов. &lt;a href=&quot;http://3bep.blogspot.com/2010/03/maven-erlang.html&quot;&gt;Link.&lt;/a&gt; &lt;a href=&quot;http://sourceforge.net/projects/maven-erlang/&quot;&gt;Maven Erlang Plugin&lt;/a&gt; упомянутый в той статье не обновлялся больше года.&lt;br /&gt;
&lt;br /&gt;
Недавно я обнаружил новый проект на SourceForge: &lt;a href=&quot;http://sourceforge.net/projects/erlang-plugin/&quot;&gt;maven-erlang-plugin&lt;/a&gt; который является развитием проекта &lt;a href=&quot;http://sourceforge.net/projects/maven-erlang/&quot;&gt;Maven Erlang Plugin&lt;/a&gt; Сейчас проект активно развивается - последний коммит в транк был три часа назад.</description><link>http://3bep.blogspot.com/2010/11/maven-erlang-plugin-rewrite.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-2062336531536282968</guid><pubDate>Thu, 25 Nov 2010 21:09:00 +0000</pubDate><atom:updated>2010-11-25T23:09:26.909+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">design</category><category domain="http://www.blogger.com/atom/ns#">html</category><category domain="http://www.blogger.com/atom/ns#">memo</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>Включение изображений в html</title><description>&lt;b&gt;Памятка:&lt;/b&gt;&lt;br /&gt;
Небольшие изображения зачастую имеет смысл влючать в html-код страницы с помощью схемы data:URL. Это позволяет не беспокоится о хостинге статичных файлов, например для элементов дизайна Blogger.&lt;br /&gt;
&lt;br /&gt;
Подробности, достоинства и недостатки этого метода можно найти на &lt;a href=&quot;http://ru.wikipedia.org/wiki/Data:_URL&quot;&gt;Wikipedia&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&lt;img alt=&quot;Embedded Image&quot; 
  src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...&quot; /&gt;
&lt;/pre&gt;&lt;br /&gt;
Так же можно вкладывать изображения в css-стили:&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;div.image {
  width:100px;
  height:100px;
  background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...);
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Скрипт для подготовки изображений к вставке в html:&lt;br /&gt;
&lt;pre class=&quot;brush:python&quot;&gt;import base64
import os
import sys

from optparse import OptionParser


if __name__ == &#39;__main__&#39;:
    optp = OptionParser()
    optp.add_option(&#39;-i&#39;, &#39;--input&#39;, action=&#39;store&#39;, dest=&#39;input&#39;,
            help=&#39;File to be encoded&#39;)
    optp.add_option(&#39;-o&#39;, &#39;--output&#39;, action=&#39;store&#39;, dest=&#39;output&#39;,
            help=&#39;File to write output in.&#39;)

    (options, args) = optp.parse_args()
    if options.output is not None:
        outfile = open(options.output, &#39;wb&#39;)
    else:
        outfile = sys.stdout

    if options.input is None:
        optp.print_help()
        exit(1)
    infile = open(options.input, &#39;rb&#39;)
    ext = os.path.splitext(options.input)[1][1:]
    outfile.write(&#39;&lt;img src=&quot;data:image/%s;base64,&#39; % ext)
    base64.encode(infile, outfile)
    outfile.write(&#39;&quot; /&gt;&#39;)
    infile.close()
    outfile.close()

&lt;/pre&gt;</description><link>http://3bep.blogspot.com/2010/11/html.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-723574197713373285</guid><pubDate>Wed, 24 Mar 2010 02:24:00 +0000</pubDate><atom:updated>2010-03-24T13:28:39.028+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">github</category><category domain="http://www.blogger.com/atom/ns#">import</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Импорт стороннего проекта в хранилище артефактов Maven</title><description>Для проектов, артефакты которых не доступны в публичных хранилищах, можно хранить артефакты в собственном хранилище. Собственно задача делится на два этапа - изготовление артефакта и деплой его в хранилище.&lt;br /&gt;&lt;br /&gt;Изготовление одиночного артефакта вполне можно выполнить и вручную, равно как и задеплоить его в хранилище используя &lt;span style=&quot;font-style:italic;&quot;&gt;mvn deploy:deploy-file&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Для регулярного импорта стороннего проекта гораздо удобнее создать собственный проект импорта.&lt;br /&gt;&lt;br /&gt;Для примера могу привести проект который создает артефакт - архив tar.gz, используя последнюю версию кода доступную на github.com и деплоит его в хранилище в локальной сети.&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&lt;br /&gt;&lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot;&lt;br /&gt; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&gt;&lt;br /&gt;  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;&lt;br /&gt;  &lt;groupId&gt;local.test.import&lt;/groupId&gt;&lt;br /&gt;  &lt;artifactId&gt;githubtest&lt;/artifactId&gt;&lt;br /&gt;  &lt;packaging&gt;pom&lt;/packaging&gt;&lt;br /&gt;  &lt;version&gt;1.0&lt;/version&gt;&lt;br /&gt;  &lt;name&gt;githubtest&lt;/name&gt;&lt;br /&gt;  &lt;scm&gt;&lt;br /&gt;&lt;!-- Задаем адрес репозитария откуда будет произведен чекаут --&gt;&lt;br /&gt;    &lt;connection&gt;scm:git:git://github.com/&lt;путь к проекту&gt;.git&lt;/connection&gt;&lt;br /&gt;    &lt;url&gt;http://github.com/&lt;адрес&gt;&lt;/url&gt;&lt;br /&gt;  &lt;/scm&gt;&lt;br /&gt;  &lt;build&gt;&lt;br /&gt;    &lt;plugins&gt;&lt;br /&gt;      &lt;plugin&gt;&lt;br /&gt;&lt;!-- Плагин scm отвечает за работу с системами контроля версий--&gt;&lt;br /&gt;        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;&lt;br /&gt;        &lt;artifactId&gt;maven-scm-plugin&lt;/artifactId&gt;&lt;br /&gt;        &lt;version&gt;1.3&lt;/version&gt;&lt;br /&gt;        &lt;executions&gt;&lt;br /&gt;          &lt;execution&gt;&lt;br /&gt;            &lt;id&gt;checkout&lt;/id&gt;&lt;br /&gt;&lt;!-- Определем когда необходимо выполнить операцию --&gt;&lt;br /&gt;            &lt;phase&gt;generate-sources&lt;/phase&gt;&lt;br /&gt;            &lt;goals&gt;&lt;br /&gt;&lt;!-- Задаем необходимую операцию - чекаут --&gt;&lt;br /&gt;              &lt;goal&gt;checkout&lt;/goal&gt;&lt;br /&gt;            &lt;/goals&gt;&lt;br /&gt;&lt;!-- По умолчанию для чекаута используется директория&lt;br /&gt;${project.build.directory}/checkout но ее можно переопределить --&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;            &lt;configuration&gt;&lt;br /&gt;              &lt;checkoutDirectory&gt;${basedir}/src&lt;/checkoutDirectory&gt;&lt;br /&gt;            &lt;/configuration&gt;&lt;br /&gt;&lt;br /&gt;--&gt;&lt;br /&gt;          &lt;/execution&gt;&lt;br /&gt;        &lt;/executions&gt;&lt;br /&gt;      &lt;/plugin&gt;&lt;br /&gt;      &lt;plugin&gt;&lt;br /&gt;&lt;!-- Плагин assembly помогает создавать вспомогательные дистрибутивы --&gt;&lt;br /&gt;        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;&lt;br /&gt;        &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;&lt;br /&gt;        &lt;version&gt;2.2-beta-5&lt;/version&gt;&lt;br /&gt;        &lt;configuration&gt;&lt;br /&gt;          &lt;descriptors&gt;&lt;br /&gt;&lt;!-- Ни один из предлагаемых вариантов упаковки не подходит,&lt;br /&gt; поэтому я создал свое описание сборки --&gt;&lt;br /&gt;            &lt;descriptor&gt;assembly.xml&lt;/descriptor&gt;&lt;br /&gt;          &lt;/descriptors&gt;&lt;br /&gt;&lt;!-- Базовая директория - для данного случая это директория куда производился&lt;br /&gt;чекаут. Если директория чекаута переопределялась в конфигурации плагина scm или производились дополнительные операции - ее нужно изменить --&gt;&lt;br /&gt;          &lt;archiveBaseDirectory&gt;&lt;br /&gt;            ${project.build.directory}/checkout&lt;br /&gt;          &lt;/archiveBaseDirectory&gt;&lt;br /&gt;        &lt;/configuration&gt;&lt;br /&gt;        &lt;executions&gt;&lt;br /&gt;          &lt;execution&gt;&lt;br /&gt;            &lt;id&gt;make-assembly&lt;/id&gt;&lt;br /&gt;            &lt;phase&gt;package&lt;/phase&gt;&lt;br /&gt;            &lt;goals&gt;&lt;br /&gt;              &lt;goal&gt;single&lt;/goal&gt;&lt;br /&gt;            &lt;/goals&gt;&lt;br /&gt;          &lt;/execution&gt;&lt;br /&gt;        &lt;/executions&gt;&lt;br /&gt;      &lt;/plugin&gt;&lt;br /&gt;      &lt;plugin&gt;&lt;br /&gt;&lt;!-- Deploy плагин отвечает за деплой ;) --&gt;&lt;br /&gt;        &lt;artifactId&gt;maven-deploy-plugin&lt;/artifactId&gt;&lt;br /&gt;        &lt;configuration&gt;&lt;br /&gt;&lt;!-- Деплой pom.xml не нужен, поэтому он отключается --&gt;&lt;br /&gt;            &lt;skip&gt;true&lt;/skip&gt;&lt;br /&gt;        &lt;/configuration&gt;&lt;br /&gt;        &lt;executions&gt;&lt;br /&gt;          &lt;execution&gt;&lt;br /&gt;            &lt;id&gt;deploy-assembly&lt;/id&gt;&lt;br /&gt;&lt;!-- Для деплоя архива вполне подойдет фаза деплоя --&gt;&lt;br /&gt;            &lt;phase&gt;deploy&lt;/phase&gt;&lt;br /&gt;            &lt;goals&gt;&lt;br /&gt;&lt;!-- Для деплоя отдельного файла есть собственная цель --&gt;&lt;br /&gt;              &lt;goal&gt;deploy-file&lt;/goal&gt;&lt;br /&gt;            &lt;/goals&gt;&lt;br /&gt;            &lt;configuration&gt;&lt;br /&gt;&lt;!-- Задаем параметры хранилища --&gt;&lt;br /&gt;              &lt;repositoryId&gt;releases&lt;/repositoryId&gt;&lt;br /&gt;              &lt;url&gt;http://beast-server/nexus/content/repositories/releases&lt;/url&gt;&lt;br /&gt;&lt;!-- Задаем файл который будет деплоиться --&gt;&lt;br /&gt;                &lt;file&gt;&lt;br /&gt;${project.build.directory}/${project.artifactId}-${project.version}.tar.gz&lt;br /&gt;                &lt;/file&gt;&lt;br /&gt;&lt;!-- Осталось описать артефакт --&gt;&lt;br /&gt;              &lt;packaging&gt;tar.gz&lt;/packaging&gt;&lt;br /&gt;              &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;&lt;br /&gt;              &lt;artifactId&gt;${project.artifactId}&lt;/artifactId&gt;&lt;br /&gt;              &lt;version&gt;${project.version}&lt;/version&gt;&lt;br /&gt;            &lt;/configuration&gt;&lt;br /&gt;          &lt;/execution&gt;&lt;br /&gt;        &lt;/executions&gt;&lt;br /&gt;      &lt;/plugin&gt;&lt;br /&gt;    &lt;/plugins&gt;&lt;br /&gt;  &lt;/build&gt;&lt;br /&gt;   &lt;distributionManagement&gt;&lt;br /&gt;        &lt;repository&gt;&lt;br /&gt;            &lt;id&gt;releases&lt;/id&gt;&lt;br /&gt;            &lt;url&gt;http://beast-server/nexus/content/repositories/releases&lt;/url&gt;&lt;br /&gt;        &lt;/repository&gt;&lt;br /&gt;        &lt;snapshotRepository&gt;&lt;br /&gt;            &lt;id&gt;snapshots&lt;/id&gt;&lt;br /&gt;            &lt;url&gt;http://beast-server/nexus/content/repositories/snapshots&lt;/url&gt;&lt;br /&gt;        &lt;/snapshotRepository&gt;&lt;br /&gt;    &lt;/distributionManagement&gt;&lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;assembly.xml содержить простой набор правил - cоздать архив tar.gz в который включить все что находится в текущей директории.&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&lt;br /&gt;&lt;assembly&lt;br /&gt;xmlns=&quot;http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0&quot;&lt;br /&gt;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&lt;br /&gt;xsi:schemaLocation=&quot;http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0&lt;br /&gt;http://maven.apache.org/xsd/assembly-1.1.0.xsd&quot;&gt;&lt;br /&gt;  &lt;formats&gt;&lt;br /&gt;&lt;!-- Для каждого формата указанного в этой секции будет создан отдельный архив --&gt;&lt;br /&gt;    &lt;format&gt;tar.gz&lt;/format&gt;&lt;br /&gt;  &lt;/formats&gt;&lt;br /&gt;  &lt;includeBaseDirectory&gt;false&lt;/includeBaseDirectory&gt;&lt;br /&gt;  &lt;fileSets&gt;&lt;br /&gt;    &lt;fileSet&gt;&lt;br /&gt;      &lt;directory&gt;./&lt;/directory&gt;&lt;br /&gt;    &lt;/fileSet&gt;&lt;br /&gt;  &lt;/fileSets&gt;&lt;br /&gt;&lt;/assembly&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итог - Пример проекта который создает артефакт из исходников и деплоит его в хранилище.</description><link>http://3bep.blogspot.com/2010/03/maven.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-847193259026414702</guid><pubDate>Sun, 21 Mar 2010 22:29:00 +0000</pubDate><atom:updated>2010-03-24T14:58:24.950+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">erlang</category><category domain="http://www.blogger.com/atom/ns#">fp</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Дистрибутив Erlang в хранилище Maven</title><description>Для начала необходимо получить дистрибутив Erlang для целевой системы в виде артефакта. Erlang уже присутствует в хранилищах пакетов для многих дистрибутивов Linux, но может содержать патчи значительно усложняющие мобильность дистрибутива. Для этого примера я собрал &quot;чистый&quot; экземпляр основанный на исходных кода с офф. сайта &lt;a href=&quot;http://www.erlang.org/download.html&quot;&gt;http://www.erlang.org/download.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ ./configure --prefix=/tmp/erlang&lt;br /&gt;$ make install&lt;br /&gt;$ cd /tmp/erlang/lib/erlang/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Архиватор используемый Maven по умолчанию некорректно распаковывает ссылки из tar.gz. Для распаковки можно воспользоваться &lt;a href=&quot;http://mojo.codehaus.org/exec-maven-plugin/&quot;&gt;Exec Maven Plugin&lt;/a&gt; или не включать их в архив. Ссылка будет создана при вызове скрипта Install, так что я ее просто удаляю.&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ rm ./bin/epmd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Потом архивирую всю директорию и деплою получившийся архив в свое хранилище.&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ tar -czf ../erlang-R13B4-linux_x86_64.tar.gz ./&lt;br /&gt;$ mvn deploy:deploy-file -DartifactId=erlang-otp -Dpackaging=tar.gz \&lt;br /&gt;-DgroupId=local.test.erlang.linux-x86-64 -Dversion=R13B4 \&lt;br /&gt;-Dfile=../erlang-R13B4-linux_x86_64.tar.gz \&lt;br /&gt;-Durl=http://beast-server/nexus/content/repositories/releases  \&lt;br /&gt;-DrepositoryId=releases&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Подключение не составляет проблемы, но развертывание дистрибутива Erlang будет производиться каждый раз при прохождении фазы обработки ресурсов. Что бы дистрибутив разворачивался только один раз, операции относящиеся к развертыванию можно вынести в профиль, который активируется основываясь на отсутствии файлов. Подробности о профилях Maven можно узнать из &lt;a href=&quot;http://maven.apache.org/guides/introduction/introduction-to-profiles.html&quot;&gt;Introduction to Build Profiles&lt;/a&gt;.&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&lt;br /&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;br /&gt;&lt;project&gt;&lt;br /&gt;  &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;&lt;br /&gt;  &lt;groupId&gt;local.erlang.test&lt;/groupId&gt;&lt;br /&gt;  &lt;artifactId&gt;test-erlang-maven&lt;/artifactId&gt;&lt;br /&gt;  &lt;packaging&gt;erlang-otp&lt;/packaging&gt;&lt;br /&gt;  &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;&lt;br /&gt;  &lt;name&gt;A custom Erlang project&lt;/name&gt;&lt;br /&gt;  &lt;url&gt;http://www.myorganization.org&lt;/url&gt;&lt;br /&gt;&lt;br /&gt;  &lt;dependencies&gt;&lt;br /&gt;    &lt;dependency&gt;&lt;br /&gt;      &lt;groupId&gt;local.test.erlang.linux-x86-64&lt;/groupId&gt;&lt;br /&gt;      &lt;artifactId&gt;erlang-otp&lt;/artifactId&gt;&lt;br /&gt;      &lt;version&gt;R13B4&lt;/version&gt;&lt;br /&gt;      &lt;type&gt;tar.gz&lt;/type&gt;&lt;br /&gt;      &lt;scope&gt;compile&lt;/scope&gt;&lt;br /&gt;    &lt;/dependency&gt;&lt;br /&gt;  &lt;/dependencies&gt;&lt;br /&gt;&lt;br /&gt;  &lt;build&gt;&lt;br /&gt;    &lt;plugins&gt;&lt;br /&gt;      &lt;plugin&gt;&lt;br /&gt;        &lt;groupId&gt;net.sf.maven-erlang&lt;/groupId&gt;&lt;br /&gt;        &lt;artifactId&gt;erlang-plugin&lt;/artifactId&gt;&lt;br /&gt;        &lt;extensions&gt;true&lt;/extensions&gt;&lt;br /&gt;        &lt;configuration&gt;&lt;br /&gt;          &lt;!-- Optional parameter: path to the erlang installation directory, i.e. path in path/bin/erlc --&gt;&lt;br /&gt;          &lt;!-- &lt;erlPath&gt;C:/Program Files/erl5.5&lt;/erlPath&gt; --&gt;&lt;br /&gt;          &lt;erlPath&gt;${project.build.directory}/erlang&lt;/erlPath&gt;&lt;br /&gt;          &lt;!-- Optional parameter : path to eunit i.e. path in path/ebin --&gt;&lt;br /&gt;          &lt;!-- &lt;eunitPath&gt;&lt;/eunitPath&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter: if we should generate surefire-compatible&lt;br /&gt;          reports. Requires eunit. --&gt;&lt;br /&gt;          &lt;surefireReports&gt;true&lt;/surefireReports&gt;&lt;br /&gt;          &lt;!-- Optional parameter: ask eunit to generate XML reports (requires EUNIT-13 patch). --&gt;&lt;br /&gt;          &lt;!-- &lt;eunitXml&gt;true&lt;/eunitXml&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter: debug_info (defaults to false, required to run dialyzer) --&gt;&lt;br /&gt;          &lt;debugInfo&gt;true&lt;/debugInfo&gt;&lt;br /&gt;          &lt;!-- Optional parameter: compiler additional options --&gt;&lt;br /&gt;          &lt;!-- &lt;erlcOptions&gt;&lt;param&gt;+export_all&lt;/param&gt;&lt;/erlcOptions&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter: run dialyzer (defaults to false) --&gt;&lt;br /&gt;          &lt;useDialyzer&gt;false&lt;/useDialyzer&gt;&lt;br /&gt;          &lt;!-- Optional parameter: compiler additional options for tests (in addition to erlcOptions) --&gt;&lt;br /&gt;          &lt;!-- &lt;erlcTestOptions&gt;&lt;param&gt;+debug_info&lt;/param&gt;&lt;param&gt;-DTEST&lt;/param&gt;&lt;/erlcTestOptions&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter: run dialyzer for tests (defaults to false) --&gt;&lt;br /&gt;          &lt;!-- &lt;testUseDialyzer&gt;true&lt;/testUseDialyzer&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter: dialyzer additional options --&gt;&lt;br /&gt;          &lt;!-- &lt;dialyzerOptions&gt;&lt;param&gt;-Werror_handling&lt;/param&gt;&lt;/dialyzerOptions&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter: fail on dialyzer warnings (defaults to false) --&gt;&lt;br /&gt;          &lt;dialyzerWarningsAreErrors&gt;true&lt;/dialyzerWarningsAreErrors&gt;&lt;br /&gt;          &lt;!-- Optional parameter: also run dialyzer on the dependencies --&gt;&lt;br /&gt;          &lt;!-- &lt;dialyzerWithDependencies&gt;true&lt;/dialyzerWithDependencies&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter: run code coverage during tests --&gt;&lt;br /&gt;          &lt;!-- &lt;codeCoverage&gt;true&lt;/codeCoverage&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter : generate edoc documentation with package. --&gt;&lt;br /&gt;          &lt;useEdoc&gt;true&lt;/useEdoc&gt;&lt;br /&gt;          &lt;!-- Optional parameter : application resource file. If this file&lt;br /&gt;          exists, it will be used with edoc and it will be copied to &quot;ebin/&quot;&lt;br /&gt;          directory. Defaults to artifactId.app --&gt;&lt;br /&gt;          &lt;!-- &lt;applicationResourceFile&gt;mymodule.app&lt;/applicationResourceFile&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter : check that all modules are listed in the .app&lt;br /&gt;          file. Defaults to true --&gt;&lt;br /&gt;          &lt;!-- &lt;failOnUndeclaredModules&gt;true&lt;/failOnUndeclaredModules&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter : edoc options --&gt;&lt;br /&gt;          &lt;!-- &lt;edocOptions&gt;&lt;param&gt;{def, {macro, &quot;value&quot;}}&lt;/param&gt;&lt;/edocOptions&gt; --&gt;&lt;br /&gt;        &lt;/configuration&gt;&lt;br /&gt;      &lt;/plugin&gt;&lt;br /&gt;    &lt;/plugins&gt;&lt;br /&gt;  &lt;/build&gt;&lt;br /&gt;&lt;br /&gt;  &lt;reporting&gt;&lt;br /&gt;    &lt;plugins&gt;&lt;br /&gt;      &lt;plugin&gt;&lt;br /&gt;        &lt;groupId&gt;net.sf.maven-erlang&lt;/groupId&gt;&lt;br /&gt;        &lt;artifactId&gt;erlang-plugin&lt;/artifactId&gt;&lt;br /&gt;        &lt;configuration&gt;&lt;br /&gt;          &lt;!-- Optional parameter: path to the erlang installation directory, i.e. path in path/bin/erlc --&gt;&lt;br /&gt;          &lt;!-- &lt;erlPath&gt;C:/Program Files/erl5.5&lt;/erlPath&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter : application resource file. If this file&lt;br /&gt;          exists, it will be used with edoc and it will be copied to &quot;ebin/&quot;&lt;br /&gt;          directory. Defaults to artifactId.app --&gt;&lt;br /&gt;          &lt;!-- &lt;applicationResourceFile&gt;mymodule.app&lt;/applicationResourceFile&gt; --&gt;&lt;br /&gt;          &lt;!-- Optional parameter : edoc options --&gt;&lt;br /&gt;          &lt;!-- &lt;edocOptions&gt;&lt;param&gt;{def, {macro, &quot;value&quot;}}&lt;/param&gt;&lt;/edocOptions&gt; --&gt;&lt;br /&gt;        &lt;/configuration&gt;&lt;br /&gt;      &lt;/plugin&gt;&lt;br /&gt;      &lt;plugin&gt;&lt;br /&gt;        &lt;artifactId&gt;maven-surefire-report-plugin&lt;/artifactId&gt;&lt;br /&gt;      &lt;/plugin&gt;&lt;br /&gt;    &lt;/plugins&gt;&lt;br /&gt;  &lt;/reporting&gt;&lt;br /&gt;  &lt;profiles&gt;&lt;br /&gt;    &lt;profile&gt;&lt;br /&gt;      &lt;id&gt;setup_erlang_dist&lt;/id&gt;&lt;br /&gt;      &lt;activation&gt;&lt;br /&gt;        &lt;file&gt;&lt;br /&gt;          &lt;missing&gt;target/erlang/Install&lt;/missing&gt;&lt;br /&gt;        &lt;/file&gt;&lt;br /&gt;      &lt;/activation&gt;&lt;br /&gt;      &lt;build&gt;&lt;br /&gt;        &lt;plugins&gt;&lt;br /&gt;          &lt;plugin&gt;&lt;br /&gt;            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;maven-dependency-plugin&lt;/artifactId&gt;&lt;br /&gt;            &lt;executions&gt;&lt;br /&gt;              &lt;execution&gt;&lt;br /&gt;                &lt;id&gt;unpack-erlang-dist&lt;/id&gt;&lt;br /&gt;                &lt;phase&gt;process-resources&lt;/phase&gt;&lt;br /&gt;                &lt;goals&gt;&lt;br /&gt;                  &lt;goal&gt;unpack&lt;/goal&gt;&lt;br /&gt;                &lt;/goals&gt;&lt;br /&gt;                &lt;configuration&gt;&lt;br /&gt;                  &lt;artifactItems&gt;&lt;br /&gt;                    &lt;artifactItem&gt;&lt;br /&gt;                      &lt;groupId&gt;local.test.erlang.linux-x86-64&lt;/groupId&gt;&lt;br /&gt;                      &lt;artifactId&gt;erlang-otp&lt;/artifactId&gt;&lt;br /&gt;                      &lt;version&gt;R13B4&lt;/version&gt;&lt;br /&gt;                      &lt;type&gt;tar.gz&lt;/type&gt;&lt;br /&gt;                      &lt;overWrite&gt;false&lt;/overWrite&gt;&lt;br /&gt;                      &lt;outputDirectory&gt;&lt;br /&gt;                        ${project.build.directory}/erlang&lt;br /&gt;                      &lt;/outputDirectory&gt;&lt;br /&gt;                    &lt;/artifactItem&gt;&lt;br /&gt;                  &lt;/artifactItems&gt;&lt;br /&gt;                &lt;/configuration&gt;&lt;br /&gt;              &lt;/execution&gt;&lt;br /&gt;            &lt;/executions&gt;&lt;br /&gt;          &lt;/plugin&gt;&lt;br /&gt;          &lt;plugin&gt;&lt;br /&gt;            &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;&lt;br /&gt;            &lt;artifactId&gt;exec-maven-plugin&lt;/artifactId&gt;&lt;br /&gt;            &lt;version&gt;1.1&lt;/version&gt;&lt;br /&gt;            &lt;executions&gt;&lt;br /&gt;              &lt;execution&gt;&lt;br /&gt;                &lt;id&gt;configure-erlang-dist&lt;/id&gt;&lt;br /&gt;                &lt;phase&gt;process-resources&lt;/phase&gt;&lt;br /&gt;                &lt;goals&gt;&lt;br /&gt;                  &lt;goal&gt;exec&lt;/goal&gt;&lt;br /&gt;                &lt;/goals&gt;&lt;br /&gt;                &lt;configuration&gt;&lt;br /&gt;                  &lt;executable&gt;${project.build.directory}/erlang/Install&lt;/executable&gt;&lt;br /&gt;                  &lt;arguments&gt;&lt;br /&gt;                    &lt;argument&gt;-sasl&lt;/argument&gt;&lt;br /&gt;                    &lt;argument&gt;${project.build.directory}/erlang&lt;/argument&gt;&lt;br /&gt;                  &lt;/arguments&gt;&lt;br /&gt;                &lt;/configuration&gt;&lt;br /&gt;              &lt;/execution&gt;&lt;br /&gt;            &lt;/executions&gt;&lt;br /&gt;          &lt;/plugin&gt;&lt;br /&gt;        &lt;/plugins&gt;&lt;br /&gt;      &lt;/build&gt;&lt;br /&gt;    &lt;/profile&gt;&lt;br /&gt;  &lt;/profiles&gt;&lt;br /&gt;&lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь можно проверить работу:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ mvn package&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;При первом запуске будет развернут дистрибутив Erlang, что потребует некоторое время. При последующих запусках дистрибутив Erlang уже будет существовать и они будут выполняться гораздо быстрее.&lt;br /&gt;&lt;br /&gt;Итог: Дистрибутив Erlang добавлен в хранилище артефактов как артефакт и доступен любому хосту использующему это хранилище. Дистрибутив Erlang может быть подключен к проекту и развернут при необходимости. Кроме распаковки можно так же произвести дополнительную настройку используя, к примеру, &lt;a href=&quot;http://mojo.codehaus.org/exec-maven-plugin/&quot;&gt;Exec Maven Plugin&lt;/a&gt;.</description><link>http://3bep.blogspot.com/2010/03/erlang-maven.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-685366238566660440</guid><pubDate>Wed, 17 Mar 2010 21:19:00 +0000</pubDate><atom:updated>2010-03-18T18:16:56.168+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">erlang</category><category domain="http://www.blogger.com/atom/ns#">fp</category><category domain="http://www.blogger.com/atom/ns#">maven</category><category domain="http://www.blogger.com/atom/ns#">nexus</category><category domain="http://www.blogger.com/atom/ns#">setup</category><title>Maven для Erlang</title><description>&lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven 2&lt;/a&gt; - это система сборки изначально ориентированная на Java приложения.&lt;br /&gt;Однако благодаря системе плагинов Maven способен работать с любым языком и на любой платформе (где запустится Java). Именно это делает Maven весьма интересным кандидатом на роль основной системы сборки при старте мультиязычного проекта или нескольких связанных проектов на разных языка программирования.&lt;br /&gt;К достоинствам Maven так же можно понятие репозитария артефактов - хранилища в котором можно разместить что угодно. Все что доступно в хранилище, легко подключается к проекту.&lt;br /&gt;К тому же для многих Continuous Integration серверов уже есть готовые плагины/расширения для взаимодействия с Maven.&lt;br /&gt;Подробности установки Maven доступны на официальном сайте - &lt;a href=&quot;http://maven.apache.org/&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;А краткая инструкция выглядит так:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Установить JDK&lt;/li&gt;&lt;li&gt;Скачать и распаковать архив Maven&lt;/li&gt;&lt;li&gt;Создать или обновить системные переменные так, чтобы JAVA_HOME указывал на JDK и PATH включал в себя путь к директории /bin распакованного Maven.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://nexus.sonatype.org/&quot;&gt;Nexus&lt;/a&gt; - это одна из реализаций хранилища артефактов. Nexus доступен в двух версиях - Open Source и Professional. Подробное сравнение этих версий доступно &lt;a href=&quot;http://www.sonatype.com/books/nexus-book/reference/intro-sect-choosing.html#d0e800&quot;&gt;здесь&lt;/a&gt;. Впрочем даже Nexus Open Source способен проксировать удаленные и хостить местные хранилища.&lt;br /&gt;Подробности установки и настройки Nexus превосходно описаны в &lt;a href=&quot;http://www.sonatype.com/books/nexus-book/reference/&quot;&gt;Nexus Book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Краткая инструкция для Nexus Open Source:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Установить Tomcat&lt;/li&gt;&lt;li&gt;Скачать последнюю версию Nexus в виде war&lt;/li&gt;&lt;li&gt;Переименовать nexus-webapp-x.x.x.war в nexus.war&lt;/li&gt;&lt;li&gt;Задеплоить nexus.war используя менеджер Tomcat&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;После этого необходимо настроить Maven на его использование. Это делается добавлением в ~/.m2/settings.xml следующих строк:&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&lt;br /&gt;&lt;settings&gt;&lt;br /&gt;   &lt;mirrors&gt;&lt;br /&gt;       &lt;mirror&gt;&lt;br /&gt;           &lt;!--This sends everything else to /public --&gt;&lt;br /&gt;           &lt;id&gt;nexus&lt;/id&gt;&lt;br /&gt;           &lt;mirrorof&gt;*&lt;/mirrorof&gt;&lt;br /&gt;           &lt;url&gt;http://beast-server/nexus/content/groups/public&lt;/url&gt;&lt;br /&gt;       &lt;/mirror&gt;&lt;br /&gt;   &lt;/mirrors&gt;&lt;br /&gt;   &lt;profiles&gt;&lt;br /&gt;       &lt;profile&gt;&lt;br /&gt;           &lt;id&gt;nexus&lt;/id&gt;&lt;br /&gt;           &lt;!--Enable snapshots for the built in central repo to direct --&gt;&lt;br /&gt;           &lt;!--all requests to nexus via the mirror --&gt;&lt;br /&gt;           &lt;repositories&gt;&lt;br /&gt;               &lt;repository&gt;&lt;br /&gt;                   &lt;id&gt;central&lt;/id&gt;&lt;br /&gt;                   &lt;url&gt;http://central&lt;/url&gt;&lt;br /&gt;                   &lt;releases&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/releases&gt;&lt;br /&gt;                   &lt;snapshots&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/snapshots&gt;&lt;br /&gt;               &lt;/repository&gt;&lt;br /&gt;           &lt;/repositories&gt;&lt;br /&gt;           &lt;pluginrepositories&gt;&lt;br /&gt;               &lt;pluginrepository&gt;&lt;br /&gt;                   &lt;id&gt;central&lt;/id&gt;&lt;br /&gt;                   &lt;url&gt;http://central&lt;/url&gt;&lt;br /&gt;                   &lt;releases&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/releases&gt;&lt;br /&gt;                   &lt;snapshots&gt;&lt;enabled&gt;true&lt;/enabled&gt;&lt;/snapshots&gt;&lt;br /&gt;               &lt;/pluginrepository&gt;&lt;br /&gt;           &lt;/pluginrepositories&gt;&lt;br /&gt;       &lt;/profile&gt;&lt;br /&gt;   &lt;/profiles&gt;&lt;br /&gt;   &lt;activeprofiles&gt;&lt;br /&gt;       &lt;!--make the profile active all the time --&gt;&lt;br /&gt;       &lt;activeprofile&gt;nexus&lt;/activeprofile&gt;&lt;br /&gt;   &lt;/activeprofiles&gt;&lt;br /&gt;   &lt;servers&gt;&lt;br /&gt;       &lt;server&gt;&lt;br /&gt;           &lt;id&gt;releases&lt;/id&gt;&lt;br /&gt;           &lt;username&gt;deployment&lt;/username&gt;&lt;br /&gt;           &lt;password&gt;deployment123&lt;/password&gt;&lt;br /&gt;       &lt;/server&gt;&lt;br /&gt;       &lt;server&gt;&lt;br /&gt;           &lt;id&gt;snapshots&lt;/id&gt;&lt;br /&gt;           &lt;username&gt;deployment&lt;/username&gt;&lt;br /&gt;           &lt;password&gt;deployment123&lt;/password&gt;&lt;br /&gt;       &lt;/server&gt;&lt;br /&gt;   &lt;/servers&gt;&lt;br /&gt;&lt;/settings&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Более подробно это описано в &lt;a href=&quot;http://www.sonatype.com/books/nexus-book/reference/&quot;&gt;Nexus Book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Теперь можно приступить к Erlang. Для взаимодействия с Erlang у Maven есть плагин - &lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;a href=&quot;http://maven-erlang.sourceforge.net/&quot;&gt;Erlang Maven Plugin&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;Его нет в публичных хранилищах, так что надо будет собрать его из исходников:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ svn co https://maven-erlang.svn.sourceforge.net/svnroot/maven-erlang maven-erlang&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Чтобы не повторять эти операции на каждом хосте который будет использовать этот плагин, его необходимо задеплоить в хранилище. Для этого необходимо добавить в pom.xml информацию о нашем хранилище в секцию &lt;span style=&quot;font-style: italic;&quot;&gt;distributionManagement&lt;/span&gt;:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ cd ./maven-erlang/maven-erlang/trunk/&lt;br /&gt;$ vim ./pom.xml&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&lt;br /&gt;       &lt;repository&gt;&lt;br /&gt;           &lt;id&gt;releases&lt;/id&gt;&lt;br /&gt;           &lt;url&gt;http://beast-server/nexus/content/repositories/releases&lt;/url&gt;&lt;br /&gt;       &lt;/repository&gt;&lt;br /&gt;       &lt;snapshotrepository&gt;&lt;br /&gt;           &lt;id&gt;snapshots&lt;/id&gt;&lt;br /&gt;           &lt;url&gt;http://beast-server/nexus/content/repositories/snapshots&lt;/url&gt;&lt;br /&gt;       &lt;/snapshotrepository&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь необходимо запустить&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ mvn deploy -Dmaven.test.skip=true&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;-Dmaven.test.skip=true&lt;/span&gt; необходим поскольку некоторые юнит тесты не проходят с последними версиями Erlang. В качестве альтернативы можно прописать версии &lt;span style=&quot;font-style: italic;&quot;&gt;kernel, stdlib и mnesia&lt;/span&gt; из вашего екземпляра Erlang в &lt;span style=&quot;font-style: italic;&quot;&gt;erlang-plugin/trunk/src/test/resources/mojo-test-release-1/src/main/erlang/release_name.rel&lt;/span&gt; и использовать&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ mvn deploy&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итог:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Установлен Maven&lt;/li&gt;&lt;li&gt;Развернуто хранилище артефактов&lt;/li&gt;&lt;li&gt;В хранилище добавлен Erlang Maven Plugin&lt;/li&gt;&lt;/ul&gt;</description><link>http://3bep.blogspot.com/2010/03/maven-erlang.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-2000333510501164333</guid><pubDate>Mon, 15 Mar 2010 22:39:00 +0000</pubDate><atom:updated>2010-03-18T18:16:40.107+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">erlang</category><category domain="http://www.blogger.com/atom/ns#">faxien</category><category domain="http://www.blogger.com/atom/ns#">fp</category><category domain="http://www.blogger.com/atom/ns#">portius</category><title>Portius - сервер репозитария для Faxien</title><description>&lt;a href=&quot;http://www.erlware.org/tools/portius/index.html&quot;&gt;Portius&lt;/a&gt; согласно документации это инструмент копирующий пакеты из одного репозитария в другой, фильтрующий битые/неправильные пакеты, извлекающий документацию и т.п. вещи из пакета и размещающий извлеченные вещи по местам. &lt;br /&gt;&lt;br /&gt;Звучит страшно, поэтому мне больше нравится формулировка &lt;span style=&quot;font-weight:bold;&quot;&gt;&lt;a href=&quot;http://www.erlware.org/tools/portius/index.html&quot;&gt;Portius&lt;/a&gt; - это сервер хранилища артефактов Faxien&lt;/span&gt;. К тому же это гораздо лучше описывает текущий функционал Portius.&lt;br /&gt;&lt;br /&gt;Установка элементарна:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;$ faxien ir portius&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Опций командной строки на данный момент всего три: путь к корневой директории репозитария и номер порта или use_config - использовать путь и порт из sys.config&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;&lt;br /&gt;portius &amp;lt;document-root&amp;gt; &amp;lt;port-number&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Скринкаст от Мартина Логана (Martin Logan) - Как создать репозитарий Erlware используя Portius.&lt;br /&gt;&lt;br /&gt;&lt;object width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/ogbz0Ram1_w&amp;hl=ru_RU&amp;fs=1&amp;&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/ogbz0Ram1_w&amp;hl=ru_RU&amp;fs=1&amp;&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;385&quot;&gt;&lt;/embed&gt;&lt;/object&gt;</description><link>http://3bep.blogspot.com/2010/03/portius-faxien.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-9062585189742566405</guid><pubDate>Mon, 15 Mar 2010 10:53:00 +0000</pubDate><atom:updated>2010-03-18T18:16:12.065+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">erlang</category><category domain="http://www.blogger.com/atom/ns#">faxien</category><category domain="http://www.blogger.com/atom/ns#">fp</category><category domain="http://www.blogger.com/atom/ns#">setup</category><category domain="http://www.blogger.com/atom/ns#">sinan</category><title>Faxien/Sinan для Erlang</title><description>Для удобной разработки приложений Erlang существуют следующие инструменты:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/faxien/&quot;&gt;Faxien&lt;/a&gt; - система управления пакетами Erlang/OTP&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/sinan/&quot;&gt;Sinan&lt;/a&gt; - система сборки&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Сначала надо получить faxien-launcher-universal-x.x.x.py c &lt;a href=&quot;http://code.google.com/p/faxien/&quot;&gt;http://code.google.com/p/faxien/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;И запустить его:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;$ python ./faxien-launcher-universal-0.3.5.py&lt;br /&gt;&lt;/pre&gt;После установки можно посмотреть справку:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;$ ~/lib/erlang/bin/faxien help&lt;br /&gt;&lt;br /&gt;Faxien is a powerful package manager for the Erlang language. This&lt;br /&gt;message is the gateway into further Faxien help.&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;faxien help&lt;br /&gt;faxien version&lt;br /&gt;faxien &lt;command&gt; [options|arguments...]&lt;br /&gt;&lt;br /&gt;More Help:&lt;br /&gt;faxien help commands: Lists all faxien commands&lt;br /&gt;faxien help &amp;lt;command&amp;gt;: Gives help on an individual command&lt;br /&gt;faxien help examples: Lists example usages of faxien&lt;br /&gt;faxien alias: lists faxien command aliases&lt;br /&gt;&lt;br /&gt;Short Examples:&lt;br /&gt;faxien install-release sinan&lt;br /&gt;faxien search yaws&lt;br /&gt;faxien help search&lt;br /&gt;ok&lt;br /&gt;&lt;br /&gt;$ ~/lib/erlang/bin/faxien help commands&lt;br /&gt;&lt;br /&gt;Commands:&lt;br /&gt;help                    print help information&lt;br /&gt;search                  search for remote packages&lt;br /&gt;installed               list the packages installed on the local system&lt;br /&gt;describe-app            print more information about a specific&lt;br /&gt;                      application package&lt;br /&gt;install-release         install a release package&lt;br /&gt;fetch-release           fetch a release package into the specified&lt;br /&gt;                      directory&lt;br /&gt;install-app             install an application package&lt;br /&gt;fetch-app               fetch an application package into the specified&lt;br /&gt;                      directory&lt;br /&gt;publish                 publish a package to remote repositories&lt;br /&gt;remove-release          uninstall a release package&lt;br /&gt;remove-app              uninstall an application package&lt;br /&gt;upgrade-release         upgrade a release package installed on the&lt;br /&gt;                      local system&lt;br /&gt;upgrade-all-releases    upgrade all the release packages installed on&lt;br /&gt;                      the local system&lt;br /&gt;upgrade-app             upgrade an application package installed on the&lt;br /&gt;                      local system&lt;br /&gt;upgrade-all-apps        upgrade all the application packages installed&lt;br /&gt;                      on the local system&lt;br /&gt;translate-version       translate one version type to another such as&lt;br /&gt;                      an erts version to an erlang release version&lt;br /&gt;version                 display the current Faxien version installed on&lt;br /&gt;                      the local system&lt;br /&gt;diff-config             diff the configuration between two installed&lt;br /&gt;                      versions of a release&lt;br /&gt;&lt;br /&gt;Configuration Management Commands:&lt;br /&gt;environment             display information about the current Faxien&lt;br /&gt;                      environment settings.&lt;br /&gt;add-repo                add a repo to search for packages in&lt;br /&gt;remove-repo             remove one of the repos Faxien is set to search&lt;br /&gt;                      for packages in&lt;br /&gt;show-repos              display the repos Faxien is set to search for&lt;br /&gt;                      packages in&lt;br /&gt;add-publish-repo        add a repo to publish packages to&lt;br /&gt;remove-publish-repo     remove one of the repos Faxien is set to&lt;br /&gt;                      publish to&lt;br /&gt;show-publish-repos      display the repos Faxien is set to publish to&lt;br /&gt;set-request-timeout     set the timeout faxien uses for requests to&lt;br /&gt;                      remote repositories&lt;br /&gt;show-request-timeout    display the timeout faxien uses for requests to&lt;br /&gt;                      remote repositories&lt;br /&gt;set-preferred-erts-vsn  set the erts vsn faxien will search first&lt;br /&gt;show-preferred-erts-vsn display the erts vsn faxien will search first&lt;br /&gt;ok&lt;br /&gt;&lt;/pre&gt;Теперь можно поставить Erlang:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;$ ~/lib/erlang/bin/faxien ir erl&lt;br /&gt;&lt;/pre&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;ir - это install-release&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;И проверить его:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;$ ~/lib/erlang/bin/erl&lt;br /&gt;Erlang R13B04 (erts-5.7.5) [source] [64-bit] [smp:4:4]&lt;br /&gt;[rq:4] [async-threads:0] [hipe] [kernel-poll:false]&lt;br /&gt;&lt;br /&gt;Eshell V5.7.5  (abort with ^G)&lt;br /&gt;1&gt; q().&lt;br /&gt;ok&lt;br /&gt;2&gt;&lt;br /&gt;&lt;/pre&gt;Теперь необходимо установить Sinan:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;$ ~/lib/erlang/bin/faxien ir sinan&lt;br /&gt;&lt;/pre&gt;И проверить:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;$ ~/lib/erlang/bin/sinan help&lt;br /&gt;starting server now.&lt;br /&gt;Unable to connect after 0 seconds. Waiting 1 second(s)&lt;br /&gt;Describing tasks ...&lt;br /&gt;release&lt;br /&gt; Creates the *.rel, *.boot and *.script into the &amp;lt;build-area&amp;gt;/realeases/&amp;lt;vsn&amp;gt;&lt;br /&gt; directory. It also builds up a release tar bal into the &amp;lt;build-area&amp;gt;/tar/ directory&lt;br /&gt;depends on: build&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;clean&lt;br /&gt; Removes the build area and everything underneath&lt;br /&gt;depends on:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;shell&lt;br /&gt; Starts an erlang shell with all of the correct paths preset so the developer&lt;br /&gt; can noodle with the code to his hearts content&lt;br /&gt;depends on: build&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;gen&lt;br /&gt; Generates a buildable default project layout&lt;br /&gt;depends on:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;build&lt;br /&gt; Compiles all of the compilable files in the project&lt;br /&gt;depends on: depends&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;version&lt;br /&gt; Provides sinan server version information&lt;br /&gt;depends on:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;test&lt;br /&gt; Runs all of the existing eunit unit tests in the project&lt;br /&gt;depends on: build&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;dist&lt;br /&gt; Creates an tarball of the distribution including release information.&lt;br /&gt; Check documentation for the dist task for configuration information&lt;br /&gt;depends on: release&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;depends&lt;br /&gt; Analyzes all of the dependencies in the project and pulls down those that&lt;br /&gt; arn&#39;t curently available locally&lt;br /&gt;depends on:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;doc&lt;br /&gt; Runs edoc across all sources in the project and outputs it into the build area&lt;br /&gt;depends on: build&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;help&lt;br /&gt; Provides help information for the available tasks&lt;br /&gt;depends on:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[help] stop&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итог:&lt;br /&gt;&lt;br /&gt;Установлены Erlang, Faxien - система управления пакетам и Sinan - система сборки.</description><link>http://3bep.blogspot.com/2010/03/erlang.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-4686601060932660880</guid><pubDate>Tue, 13 May 2008 16:53:00 +0000</pubDate><atom:updated>2008-05-13T20:03:13.710+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux X</category><title>Когда проблемы с Х-ами</title><description>Посмотреть свойства сервера Х-ов можно с помощью команды &lt;span style=&quot;font-weight:bold;&quot;&gt;xprop&lt;/span&gt;&lt;br /&gt;Например, текущие настройки &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ xprop -root | grep XKB&lt;br /&gt;_XKB_RULES_NAMES(STRING) = &quot;xorg&quot;, &quot;pc104&quot;, &quot;us,ru&quot;, &quot;&quot;,&lt;br /&gt;&quot;grp:lwin_toggle,grp_led:scroll&quot;&lt;br /&gt;$&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Также есть команда &lt;span style=&quot;font-weight:bold;&quot;&gt;xset&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ xset q | grep DPMS&lt;br /&gt;DPMS (Energy Star):&lt;br /&gt; DPMS is Enabled&lt;br /&gt;$ &lt;br /&gt;&lt;/pre&gt;</description><link>http://3bep.blogspot.com/2008/05/blog-post.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-2480586187022057955.post-9094692218294627712</guid><pubDate>Tue, 29 Apr 2008 22:46:00 +0000</pubDate><atom:updated>2008-04-30T02:40:51.032+03:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PyGTK</category><category domain="http://www.blogger.com/atom/ns#">python</category><title>PyGTK. Наследование от базового класса.</title><description>&lt;p&gt;При работе с &lt;a href=&quot;http://www.pygtk.org/&quot; target=&quot;_blank&quot;&gt;PyGTK&lt;/a&gt; иногда возникает необходимость создавать собственные виджеты. Теоретически все просто - унаследуем свой класс от базового &lt;a href=&quot;http://www.pygtk.org/docs/pygtk/class-gtkwidget.html&quot; target=&quot;_blank&quot;&gt;gtk.Widget&lt;/a&gt;, &lt;a href=&quot;http://www.pygtk.org/docs/pygtk/class-gtkcontainer.html&quot; target=&quot;_blank&quot;&gt;gtk.Container&lt;/a&gt; или &lt;a href=&quot;http://www.pygtk.org/docs/pygtk/class-gtkbin.html&quot; target=&quot;_blank&quot;&gt;gtk.Bin&lt;/a&gt;  и в конструкторе вызовем конструктор класса-родителя. Но не так все просто как кажется на первый взгляд. Создадим такой класс:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;mywidget.py&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;import gtk&lt;br /&gt;&lt;br /&gt;class MyWidget(gtk.Widget):&lt;br /&gt;  &quot;&quot;&quot;&lt;br /&gt;  Класс созданный на основе gtk.Widget&lt;br /&gt;  &quot;&quot;&quot;&lt;br /&gt;&lt;br /&gt;  def __init__(self):&lt;br /&gt;      gtk.Widget.__init__(self)&lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Проверяем:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;blockquote&gt;&lt;br /&gt;$ python&lt;br /&gt;Python 2.4.5 (#2, Mar 12 2008, 00:15:51)&lt;br /&gt;[GCC 4.2.3 (Debian 4.2.3-2)] on linux2&lt;br /&gt;Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import mywidget&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; wdg = mywidget.MyWidget()&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in ?&lt;br /&gt;File &quot;mywidget.py&quot;, line 7, in __init__&lt;br /&gt;  gtk.Widget.__init__(self)&lt;br /&gt;TypeError: cannot create instance of abstract (non-instantiable) type `GtkWidget`&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Для обычного создания унаследованных классов необходимо зарегистрировать этот класс перед использованием:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;mywidget.py&lt;/span&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;# -*- coding: utf-8 -*-&lt;br /&gt;&lt;br /&gt;import gtk&lt;br /&gt;import gobject&lt;br /&gt;&lt;br /&gt;class MyWidget(gtk.Widget):&lt;br /&gt;  &quot;&quot;&quot;&lt;br /&gt;  Класс созданный на основе gtk.Widget&lt;br /&gt;  &quot;&quot;&quot;&lt;br /&gt;&lt;br /&gt;  def __init__(self):&lt;br /&gt;      gtk.Widget.__init__(self)&lt;br /&gt;# Регистрируем класс как виджет GTK&lt;br /&gt;gobject.type_register(MyWidget)&lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Проверяем:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;$ python&lt;br /&gt;Python 2.4.5 (#2, Mar 12 2008, 00:15:51)&lt;br /&gt;[GCC 4.2.3 (Debian 4.2.3-2)] on linux2&lt;br /&gt;Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import mywidget&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; wdg = mywidget.MyWidget()&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;</description><link>http://3bep.blogspot.com/2008/04/pygtk.html</link><author>noreply@blogger.com (3BEP)</author><thr:total>0</thr:total></item></channel></rss>