вторник, 30 ноября 2010 г.

Памятка для virtualevn, virtualenvwrapper and pip

Установка пакетов с помощью easy_install:

$ sudo easy_install virtualenv
$ sudo easy_install pip
$ sudo easy_install virtualenvwrapper


Добавить в ~/.bashrc:
# Путь к корневой директории виртульных окружений
export WORKON_HOME=$HOME/py_virtual_envs

# Для Arch этот путь отличается от стандартного
# /usr/local/bin/virtualenvwrapper_bashrc
source /usr/bin/virtualenvwrapper_bashrc


Теперь надо чтобы настройки вступили в действие:
$ source ~/.bashrc


Создание нового окружения - команда mkvirtualenv <имя окружения> или mkvirtualenv --no-site-packages <имя окружения>

Проверка:
$ 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


Переход в директорию текущего виртуального окружения:
$ cd $VIRTUAL_ENV
$ pwd
/home/beast/py_virtual_envs/temp

$ workon temp2
$ cd $VIRTUAL_ENV
$ pwd
/home/beast/py_virtual_envs/temp2


Или можно использовать команду cdvirtualenv
$ workon temp
$ cdvirtualenv
$ pwd
/home/beast/py_virtual_envs/temp2

$ cdvirtualenv include/python2.6/
$ pwd
/home/beast/py_virtual_envs/temp/include/python2.6


отключение виртульного окружения
$ deactivate


Удаление виртуального окружения
$ rmvirtualenv temp
$ rmvirtualenv temp2


Опции mkvirtualenv передаются напрямую в virtualenv
$ mkvirtualenv --no-site-packages temp3


есть быстрый переход к текущей директории site-packages
$ 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


Есть команда для добавления директорий с пакетами - add2virtualenv <директория>
$ add2virtualenv ~/py_virtual_envs/temp3/temp/
Warning: Converting "/home/beast/py_virtual_envs/temp3/temp/" to "/home/beast/py_virtual_envs/temp3/temp"
$ python
Python 2.6.4 (r264:75706, Jan 25 2010, 09:01:01)
[GCC 4.4.2 20091208 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import additional_package
>>> additional_package.NAME
'Additional package'
^D
$ cat ./temp/additional_package/__init__.py
NAME="Additional package"
$ add2virtualenv ~/py_virtual_envs/temp3/temp/
$ add2virtualenv
Usage: add2virtualenv dir [dir ...]

Existing paths:
/home/beast/py_virtual_envs/temp3/temp


Просмотр установленных пакетов:
$ 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

В ~/.bashrc можно так же добавить:
export PIP_VIRTUALENV_BASE=$WORKON_HOME
export PIP_RESPECT_VIRTUALENV=true
# Это позволит pip определить текущее виртуальное окружение
# и устанавливать в него без использования параметра -E

Maven Erlang plugin rewrite

Я уже писал про установку и настройку Maven для сборки Erlang проектов. Link. Maven Erlang Plugin упомянутый в той статье не обновлялся больше года.

Недавно я обнаружил новый проект на SourceForge: maven-erlang-plugin который является развитием проекта Maven Erlang Plugin Сейчас проект активно развивается - последний коммит в транк был три часа назад.

четверг, 25 ноября 2010 г.

Включение изображений в html

Памятка:
Небольшие изображения зачастую имеет смысл влючать в html-код страницы с помощью схемы data:URL. Это позволяет не беспокоится о хостинге статичных файлов, например для элементов дизайна Blogger.

Подробности, достоинства и недостатки этого метода можно найти на Wikipedia

Пример:
Embedded Image

Так же можно вкладывать изображения в css-стили:
div.image {
  width:100px;
  height:100px;
  background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIA...);
}


Скрипт для подготовки изображений к вставке в html:
import base64
import os
import sys

from optparse import OptionParser


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

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

    if options.input is None:
        optp.print_help()
        exit(1)
    infile = open(options.input, 'rb')
    ext = os.path.splitext(options.input)[1][1:]
    outfile.write('')
    infile.close()
    outfile.close()

среда, 24 марта 2010 г.

Импорт стороннего проекта в хранилище артефактов Maven

Для проектов, артефакты которых не доступны в публичных хранилищах, можно хранить артефакты в собственном хранилище. Собственно задача делится на два этапа - изготовление артефакта и деплой его в хранилище.

Изготовление одиночного артефакта вполне можно выполнить и вручную, равно как и задеплоить его в хранилище используя mvn deploy:deploy-file.

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

Для примера могу привести проект который создает артефакт - архив tar.gz, используя последнюю версию кода доступную на github.com и деплоит его в хранилище в локальной сети.

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
local.test.import
githubtest
pom
1.0
githubtest


scm:git:git://github.com/<путь к проекту>.git
http://github.com/<адрес>





org.apache.maven.plugins
maven-scm-plugin
1.3


checkout

generate-sources


checkout








org.apache.maven.plugins
maven-assembly-plugin
2.2-beta-5



assembly.xml



${project.build.directory}/checkout




make-assembly
package

single






maven-deploy-plugin


true



deploy-assembly

deploy


deploy-file



releases
http://beast-server/nexus/content/repositories/releases


${project.build.directory}/${project.artifactId}-${project.version}.tar.gz


tar.gz
${project.groupId}
${project.artifactId}
${project.version}








releases
http://beast-server/nexus/content/repositories/releases


snapshots
http://beast-server/nexus/content/repositories/snapshots





assembly.xml содержить простой набор правил - cоздать архив tar.gz в который включить все что находится в текущей директории.

xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0
http://maven.apache.org/xsd/assembly-1.1.0.xsd">


tar.gz

false


./





Итог - Пример проекта который создает артефакт из исходников и деплоит его в хранилище.

понедельник, 22 марта 2010 г.

Дистрибутив Erlang в хранилище Maven

Для начала необходимо получить дистрибутив Erlang для целевой системы в виде артефакта. Erlang уже присутствует в хранилищах пакетов для многих дистрибутивов Linux, но может содержать патчи значительно усложняющие мобильность дистрибутива. Для этого примера я собрал "чистый" экземпляр основанный на исходных кода с офф. сайта http://www.erlang.org/download.html


$ ./configure --prefix=/tmp/erlang
$ make install
$ cd /tmp/erlang/lib/erlang/

Архиватор используемый Maven по умолчанию некорректно распаковывает ссылки из tar.gz. Для распаковки можно воспользоваться Exec Maven Plugin или не включать их в архив. Ссылка будет создана при вызове скрипта Install, так что я ее просто удаляю.

$ rm ./bin/epmd

Потом архивирую всю директорию и деплою получившийся архив в свое хранилище.

$ tar -czf ../erlang-R13B4-linux_x86_64.tar.gz ./
$ mvn deploy:deploy-file -DartifactId=erlang-otp -Dpackaging=tar.gz \
-DgroupId=local.test.erlang.linux-x86-64 -Dversion=R13B4 \
-Dfile=../erlang-R13B4-linux_x86_64.tar.gz \
-Durl=http://beast-server/nexus/content/repositories/releases \
-DrepositoryId=releases


Подключение не составляет проблемы, но развертывание дистрибутива Erlang будет производиться каждый раз при прохождении фазы обработки ресурсов. Что бы дистрибутив разворачивался только один раз, операции относящиеся к развертыванию можно вынести в профиль, который активируется основываясь на отсутствии файлов. Подробности о профилях Maven можно узнать из Introduction to Build Profiles.



4.0.0
local.erlang.test
test-erlang-maven
erlang-otp
1.0-SNAPSHOT
A custom Erlang project
http://www.myorganization.org



local.test.erlang.linux-x86-64
erlang-otp
R13B4
tar.gz
compile






net.sf.maven-erlang
erlang-plugin
true



${project.build.directory}/erlang



true



true



false







true





true














net.sf.maven-erlang
erlang-plugin










maven-surefire-report-plugin





setup_erlang_dist


target/erlang/Install





org.apache.maven.plugins
maven-dependency-plugin


unpack-erlang-dist
process-resources

unpack




local.test.erlang.linux-x86-64
erlang-otp
R13B4
tar.gz
false

${project.build.directory}/erlang








org.codehaus.mojo
exec-maven-plugin
1.1


configure-erlang-dist
process-resources

exec


${project.build.directory}/erlang/Install

-sasl
${project.build.directory}/erlang












Теперь можно проверить работу:

$ mvn package

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

Итог: Дистрибутив Erlang добавлен в хранилище артефактов как артефакт и доступен любому хосту использующему это хранилище. Дистрибутив Erlang может быть подключен к проекту и развернут при необходимости. Кроме распаковки можно так же произвести дополнительную настройку используя, к примеру, Exec Maven Plugin.

среда, 17 марта 2010 г.

Maven для Erlang

Maven 2 - это система сборки изначально ориентированная на Java приложения.
Однако благодаря системе плагинов Maven способен работать с любым языком и на любой платформе (где запустится Java). Именно это делает Maven весьма интересным кандидатом на роль основной системы сборки при старте мультиязычного проекта или нескольких связанных проектов на разных языка программирования.
К достоинствам Maven так же можно понятие репозитария артефактов - хранилища в котором можно разместить что угодно. Все что доступно в хранилище, легко подключается к проекту.
К тому же для многих Continuous Integration серверов уже есть готовые плагины/расширения для взаимодействия с Maven.
Подробности установки Maven доступны на официальном сайте - здесь.

А краткая инструкция выглядит так:
  1. Установить JDK
  2. Скачать и распаковать архив Maven
  3. Создать или обновить системные переменные так, чтобы JAVA_HOME указывал на JDK и PATH включал в себя путь к директории /bin распакованного Maven.


Nexus - это одна из реализаций хранилища артефактов. Nexus доступен в двух версиях - Open Source и Professional. Подробное сравнение этих версий доступно здесь. Впрочем даже Nexus Open Source способен проксировать удаленные и хостить местные хранилища.
Подробности установки и настройки Nexus превосходно описаны в Nexus Book.

Краткая инструкция для Nexus Open Source:
  1. Установить Tomcat
  2. Скачать последнюю версию Nexus в виде war
  3. Переименовать nexus-webapp-x.x.x.war в nexus.war
  4. Задеплоить nexus.war используя менеджер Tomcat

После этого необходимо настроить Maven на его использование. Это делается добавлением в ~/.m2/settings.xml следующих строк:





nexus
*
http://beast-server/nexus/content/groups/public




nexus




central
http://central
true
true




central
http://central
true
true






nexus



releases
deployment
deployment123


snapshots
deployment
deployment123




Более подробно это описано в Nexus Book.

Теперь можно приступить к Erlang. Для взаимодействия с Erlang у Maven есть плагин - Erlang Maven Plugin
Его нет в публичных хранилищах, так что надо будет собрать его из исходников:

$ svn co https://maven-erlang.svn.sourceforge.net/svnroot/maven-erlang maven-erlang

Чтобы не повторять эти операции на каждом хосте который будет использовать этот плагин, его необходимо задеплоить в хранилище. Для этого необходимо добавить в pom.xml информацию о нашем хранилище в секцию distributionManagement:

$ cd ./maven-erlang/maven-erlang/trunk/
$ vim ./pom.xml



releases
http://beast-server/nexus/content/repositories/releases


snapshots
http://beast-server/nexus/content/repositories/snapshots


Теперь необходимо запустить

$ mvn deploy -Dmaven.test.skip=true

-Dmaven.test.skip=true необходим поскольку некоторые юнит тесты не проходят с последними версиями Erlang. В качестве альтернативы можно прописать версии kernel, stdlib и mnesia из вашего екземпляра Erlang в erlang-plugin/trunk/src/test/resources/mojo-test-release-1/src/main/erlang/release_name.rel и использовать

$ mvn deploy


Итог:
  • Установлен Maven
  • Развернуто хранилище артефактов
  • В хранилище добавлен Erlang Maven Plugin

вторник, 16 марта 2010 г.

Portius - сервер репозитария для Faxien

Portius согласно документации это инструмент копирующий пакеты из одного репозитария в другой, фильтрующий битые/неправильные пакеты, извлекающий документацию и т.п. вещи из пакета и размещающий извлеченные вещи по местам.

Звучит страшно, поэтому мне больше нравится формулировка Portius - это сервер хранилища артефактов Faxien. К тому же это гораздо лучше описывает текущий функционал Portius.

Установка элементарна:

$ faxien ir portius

Опций командной строки на данный момент всего три: путь к корневой директории репозитария и номер порта или use_config - использовать путь и порт из sys.config

portius <document-root> <port-number>

Скринкаст от Мартина Логана (Martin Logan) - Как создать репозитарий Erlware используя Portius.

понедельник, 15 марта 2010 г.

Faxien/Sinan для Erlang

Для удобной разработки приложений Erlang существуют следующие инструменты:
  • Faxien - система управления пакетами Erlang/OTP
  • Sinan - система сборки


Сначала надо получить faxien-launcher-universal-x.x.x.py c http://code.google.com/p/faxien/

И запустить его:
$ python ./faxien-launcher-universal-0.3.5.py
После установки можно посмотреть справку:
$ ~/lib/erlang/bin/faxien help

Faxien is a powerful package manager for the Erlang language. This
message is the gateway into further Faxien help.

Usage:
faxien help
faxien version
faxien [options|arguments...]

More Help:
faxien help commands: Lists all faxien commands
faxien help <command>: Gives help on an individual command
faxien help examples: Lists example usages of faxien
faxien alias: lists faxien command aliases

Short Examples:
faxien install-release sinan
faxien search yaws
faxien help search
ok

$ ~/lib/erlang/bin/faxien help commands

Commands:
help print help information
search search for remote packages
installed list the packages installed on the local system
describe-app print more information about a specific
application package
install-release install a release package
fetch-release fetch a release package into the specified
directory
install-app install an application package
fetch-app fetch an application package into the specified
directory
publish publish a package to remote repositories
remove-release uninstall a release package
remove-app uninstall an application package
upgrade-release upgrade a release package installed on the
local system
upgrade-all-releases upgrade all the release packages installed on
the local system
upgrade-app upgrade an application package installed on the
local system
upgrade-all-apps upgrade all the application packages installed
on the local system
translate-version translate one version type to another such as
an erts version to an erlang release version
version display the current Faxien version installed on
the local system
diff-config diff the configuration between two installed
versions of a release

Configuration Management Commands:
environment display information about the current Faxien
environment settings.
add-repo add a repo to search for packages in
remove-repo remove one of the repos Faxien is set to search
for packages in
show-repos display the repos Faxien is set to search for
packages in
add-publish-repo add a repo to publish packages to
remove-publish-repo remove one of the repos Faxien is set to
publish to
show-publish-repos display the repos Faxien is set to publish to
set-request-timeout set the timeout faxien uses for requests to
remote repositories
show-request-timeout display the timeout faxien uses for requests to
remote repositories
set-preferred-erts-vsn set the erts vsn faxien will search first
show-preferred-erts-vsn display the erts vsn faxien will search first
ok
Теперь можно поставить Erlang:
$ ~/lib/erlang/bin/faxien ir erl
ir - это install-release

И проверить его:
$ ~/lib/erlang/bin/erl
Erlang R13B04 (erts-5.7.5) [source] [64-bit] [smp:4:4]
[rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.5 (abort with ^G)
1> q().
ok
2>
Теперь необходимо установить Sinan:
$ ~/lib/erlang/bin/faxien ir sinan
И проверить:
$ ~/lib/erlang/bin/sinan help
starting server now.
Unable to connect after 0 seconds. Waiting 1 second(s)
Describing tasks ...
release
Creates the *.rel, *.boot and *.script into the <build-area>/realeases/<vsn>
directory. It also builds up a release tar bal into the <build-area>/tar/ directory
depends on: build


clean
Removes the build area and everything underneath
depends on:


shell
Starts an erlang shell with all of the correct paths preset so the developer
can noodle with the code to his hearts content
depends on: build


gen
Generates a buildable default project layout
depends on:


build
Compiles all of the compilable files in the project
depends on: depends


version
Provides sinan server version information
depends on:


test
Runs all of the existing eunit unit tests in the project
depends on: build


dist
Creates an tarball of the distribution including release information.
Check documentation for the dist task for configuration information
depends on: release


depends
Analyzes all of the dependencies in the project and pulls down those that
arn't curently available locally
depends on:


doc
Runs edoc across all sources in the project and outputs it into the build area
depends on: build


help
Provides help information for the available tasks
depends on:


[help] stop


Итог:

Установлены Erlang, Faxien - система управления пакетам и Sinan - система сборки.