<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7967939136639017593</id><updated>2012-01-20T11:04:27.238+03:00</updated><category term='linux'/><category term='arm'/><category term='pm'/><category term='altsp'/><category term='wiki'/><category term='java'/><category term='connexion'/><category term='monetdb'/><category term='voip'/><category term='maven'/><category term='telecom'/><category term='databases'/><category term='trac'/><category term='fax'/><category term='desktop'/><category term='git'/><category term='python'/><category term='groovy'/><category term='redmine'/><category term='jee'/><category term='ovz'/><category term='altlinux-live'/><category term='callweaver'/><category term='altlinux'/><category term='svn'/><category term='freeswitch'/><title type='text'>Админодевелопмент</title><subtitle type='html'>Администрирование и разработка : проблемы и решения</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-8821035791145295177</id><published>2012-01-20T10:52:00.000+03:00</published><updated>2012-01-20T11:04:27.256+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='arm'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>ALT Linux на OMAP3 BlueShark</title><content type='html'>Попала в руки плата &lt;a href="http://www.mentorel.ru/index.php/products/som/blueshark-omap3/10"&gt;Atoll-Deluxe v4 с процессорным модулем OMAP3 BlueShark&lt;/a&gt; и LCD-панелью NEC E170632:&lt;br /&gt;&lt;table style="width: auto;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="https://lh3.googleusercontent.com/-aSvub1ktpfQ/TxkAeqQDXkI/AAAAAAAACow/y7mQiHdN5fc/s912/1.png"&gt;&lt;img height="257" src="https://lh3.googleusercontent.com/-aSvub1ktpfQ/TxkAeqQDXkI/AAAAAAAACow/y7mQiHdN5fc/s640/1.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;На борту уже имелся &lt;a href="http://www.angstrom-distribution.org/"&gt;Ångström Linux&lt;/a&gt;, однако захотелось получить более привычное окружение. Имевшаяся в комплекте загрузочная SD-карта была разбита на два раздела:&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;с &lt;a href="http://www.denx.de/wiki/U-Boot/"&gt;U-Boot&lt;/a&gt; и ядром&lt;/li&gt;&lt;li&gt;с корневой файловой системой&lt;/li&gt;&lt;/ul&gt;Поэтому я решил просто отложить родной корень в сторонку и сгенерировать новый &lt;a href="http://www.altlinux.org/Mkimage"&gt;традиционным для ALT Linux способом&lt;/a&gt;, загрузившись для начала со штатным ядром. Получилось не сразу, но &lt;a href="http://packages.altlinux.org/en/Sisyphus/maintainers/manowar"&gt;Paul Wolneykien&lt;/a&gt; помог решить &lt;a href="http://article.gmane.org/gmane.linux.altlinux.sisyphus/93263"&gt;основную проблему с логином через mini-USB&lt;/a&gt; - а дальше дело оказалось в шляпе. Профиль доступен &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-armrootfs.git"&gt;здесь&lt;/a&gt;, выложены:&lt;ul&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/arm/arm-root-minimal.tar.bz2"&gt;минимальный консольный образ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/arm/arm-root-x11-glxgears.tar.bz2"&gt;игрушечный киоск с glxgears в качестве единственного приложения&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;В планах сборка правильного ядра.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-8821035791145295177?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/8821035791145295177/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=8821035791145295177' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/8821035791145295177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/8821035791145295177'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2012/01/atoll-deluxe-v4-omap3-blueshark-lcd-nec.html' title='ALT Linux на OMAP3 BlueShark'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-aSvub1ktpfQ/TxkAeqQDXkI/AAAAAAAACow/y7mQiHdN5fc/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-5401239096251045837</id><published>2011-11-25T14:32:00.001+03:00</published><updated>2011-11-25T14:44:52.321+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux-live'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>Последняя версия ALT Linux Live</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Обновил ALT Linux Live до текущего &lt;a href="ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/t6/branch"&gt;branch/t6&lt;/a&gt;, доступны образы:&lt;ul&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/t6/iso/altlive-console-t6-i586.iso"&gt;altlive-console-t6-i586&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/t6/iso/altlive-xfce-t6-i586.iso"&gt;altlive-xfce-t6-i586&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/t6/iso/altlive-console-t6-x86_64.iso"&gt;altlive-console-t6-x86_64&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/t6/iso/altlive-xfce-t6-x86_64.iso"&gt;altlive-xfce-t6-x86_64&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;И, скорее всего, эта сборка будет последней. У меня не хватает сил самостоятельно поддерживать профиль &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git"&gt;m-p-l&lt;/a&gt; в актуальном состоянии, а тем временем наследник тонущего от переизбытка возможностей и их бессистемного добавления основного профиля &lt;a href="http://git.altlinux.org/people/boyarsh/packages/mkimage-profiles-desktop.git"&gt;m-p-d&lt;/a&gt; в лице &lt;a href="http://git.altlinux.org/people/mike/packages/mkimage-profiles.git"&gt;m-p&lt;/a&gt; довольно активно &lt;a href="http://www.altlinux.org/Mkimage/Profiles/m-p"&gt;развивается&lt;/a&gt;. Поэтому со временем я планирую перебираться на него, чего всем выпиливателям кастомных образов и советую.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-5401239096251045837?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/5401239096251045837/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=5401239096251045837' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5401239096251045837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5401239096251045837'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2011/11/alt-linux-live.html' title='Последняя версия ALT Linux Live'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-818144638665220096</id><published>2011-08-01T13:28:00.000+03:00</published><updated>2011-08-01T13:28:53.559+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='monetdb'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>Колоночная СУБД MonetDB</title><content type='html'>Внезапно дошли руки пощупать настоящую &lt;a href="http://en.wikipedia.org/wiki/Column-oriented_DBMS"&gt;колоночную СУБД&lt;/a&gt; в реализации &lt;a href="http://www.monetdb.org"&gt;MonetDB&lt;/a&gt;, свежая версия которой в честь этого доступна в &lt;a href="http://packages.altlinux.org/ru/Sisyphus/srpms/monetdb"&gt;Сизифе&lt;/a&gt; и &lt;a href="http://packages.altlinux.org/ru/t6/srpms/monetdb"&gt;t6/branch&lt;/a&gt;. Тестировал на старой задаче, которая замечательно укладывается в область применения колоночных СУБД - учет объема ip-трафика по различным критериям (периоды, сети, хосты, пропущено/зарезано). Впечатления смешанные. Оно действительно уделывает &lt;a href="http://pgfoundry.org/projects/pgtune"&gt;тщательно тюненный PostgreSQL&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Загрузка данных из текстового файла происходит в 3 раза быстрее&lt;/li&gt;&lt;li&gt;Выборка с GROUP BY и полным сканированием большой таблицы - в 7 раз быстрее&lt;/li&gt;&lt;li&gt;Выборка небольшого набора строк с кучей WHERE - на удивление даже это чуть вышло быстрее, однако в пределах погрешности измерений&lt;/li&gt;&lt;li&gt;Размер БД в 1,5 раза меньше исходного текстового файла&lt;/li&gt;&lt;/ul&gt;Однако ничего не бывает просто так. Помимо ожидаемых проблем колоночных СУБД с одновременным доступом на запись, которые в данном случае совершенно не актуальны, обнаружились и пара более неприятных вещей, являющихся уже особенностью реализации MonetDB:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://permalink.gmane.org/gmane.comp.db.monetdb.user/4139"&gt;Нельзя отменить запрос&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://permalink.gmane.org/gmane.comp.db.monetdb.user/4461"&gt;Нет эффективной реализации VACUUM&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Это уже не говоря о &lt;a href="http://www.monetdb.org/Documentation"&gt;значительно более лаконичной по сравнению с PostgreSQL документацией&lt;/a&gt; и &lt;a href="http://www.monetdb.org/Developers/Mailinglists"&gt;несравнимо меньшим комьюнити&lt;/a&gt;. Поэтому рекомендовать это кому-либо в production я не решаюсь, хотя сам, пожалуй, попробую ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-818144638665220096?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/818144638665220096/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=818144638665220096' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/818144638665220096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/818144638665220096'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2011/08/monetdb.html' title='Колоночная СУБД MonetDB'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-5019329917571591164</id><published>2011-04-07T15:18:00.000+03:00</published><updated>2011-04-07T15:18:50.274+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux-live'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>Автоинсталляция ALT Linux Live</title><content type='html'>Некоторое время назад у меня возникла необходимость установить и предварительно настроить около 30 идентичных серверов. Дело слегка осложнялось тем, что расстояние от них до меня измеряется десятками и сотнями километров, а потому без помощи местных специалистов не обойтись было никак, но и обучать их чему-то более сложному, чем вставить диск или настроить сетевую загрузку, было крайне нежелательно.&lt;br /&gt;&lt;br /&gt;Для решения задачи на базе фичи fakeinstall была &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git?p=mkimage-profile-live.git;a=commit;h=1c8dd94378ea79e75ceb2c61c451082d8cb098cf"&gt;изготовлена фича autoinstall&lt;/a&gt; и с ее помощью задача была быстро решена, однако чувства удовлетворенности не появилось. Во-первых, код в фичах дублировался, а во-вторых, практически всю процедуру настройки пришлось оформить отдельным коммитом во внутреннем бранче - там гвозди совсем большие и толстые.&lt;br /&gt;&lt;br /&gt;Положение исправил неожиданно проснувшийся интерес других участников &lt;a href="http://www.altlinux.org/ALT_Linux_Team"&gt;ALT Linux Team&lt;/a&gt; к моей процедуре [авто]инсталляции. Например, Михаил Пожидаев выпилил пересекающуюся часть упомянутых выше фич в &lt;a href="http://sisyphus.ru/ru/srpm/Sisyphus/live-install"&gt;пакет live-install&lt;/a&gt; и использовал его в своем проекте &lt;a href="http://homeros.altlinux.org/"&gt;специализированного дистрибутива для людей с ограничениями по зрению&lt;/a&gt;. Теперь уже мне ничего не оставалось, кроме как &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git?p=mkimage-profile-live.git;a=commit;h=bc6ea5c2ed7158d868ff0ac33b313081157224a5"&gt;задействовать этот пакет и выкинуть из фич ненужный код&lt;/a&gt;, а заодно &lt;a href="http://www.altlinux.org/Lxde/eeelive/livehooks"&gt;по аналогии с eeelive&lt;/a&gt; - сделать &lt;a href="http://git.altlinux.org/people/enp/packages/live-hooks-tftp.git"&gt;пакет&lt;/a&gt; и &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git?p=mkimage-profile-live.git;a=commit;h=0417a13534fefded6dd89320717a4d0b78aa5f38"&gt;фичу&lt;/a&gt; для тонкого подпиливания уже загруженного (в моем случае как правило по сети) образа - и тем самым утащить самые страшные гвозди из профиля в настраиваемые внешние скрипты.&lt;br /&gt;&lt;br /&gt;Обновленные образы, собранные на текущем &lt;a href="ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/5.1/branch"&gt;branch/5.1&lt;/a&gt;, по традиции можно взять &lt;a href="http://enp.itx.ru/linux/alt/5.1/iso/"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-5019329917571591164?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/5019329917571591164/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=5019329917571591164' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5019329917571591164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5019329917571591164'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2011/04/alt-linux-live.html' title='Автоинсталляция ALT Linux Live'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-802391095371974962</id><published>2010-08-12T16:43:00.000+03:00</published><updated>2010-08-12T16:43:35.050+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='callweaver'/><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='telecom'/><category scheme='http://www.blogger.com/atom/ns#' term='freeswitch'/><title type='text'>Король умер, да здравствует король ...</title><content type='html'>&lt;a href="http://ru.wikipedia.org/wiki/CallWeaver"&gt;CallWeaver&lt;/a&gt; медленно, но верно впадает в анабиоз (критерий - &lt;a href="http://www.callweaver.org/changesets"&gt;количество новых коммитов в SVN&lt;/a&gt;), и потому я давно стал &lt;a href="http://www.itx.ru/presentations/voip.pdf"&gt;приискивать&lt;/a&gt; ему такую замену, которая не называется &lt;a href="http://ru.wikipedia.org/wiki/Asterisk"&gt;Asterisk&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Остановился в итоге на &lt;a href="http://ru.wikipedia.org/wiki/FreeSWITCH"&gt;FreeSWITCH&lt;/a&gt;, который соблазнил меня:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Красивой архитектурой с честной модульностью и возможностью масштабироваться от &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%84%D1%82%D1%84%D0%BE%D0%BD"&gt;софтфона&lt;/a&gt; до &lt;a href="http://ru.wikipedia.org/wiki/Softswitch"&gt;софтсвитча&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Использованием уже зарекомендовавших себя свободных фреймворков (&lt;a href="http://apr.apache.org/"&gt;Apache Portable Runtime&lt;/a&gt; для обеспечения переностимости между различными платформами, &lt;a href="http://sofia-sip.sourceforge.net/"&gt;SofiaSIP&lt;/a&gt; в качестве &lt;a href="http://ru.wikipedia.org/wiki/SIP"&gt;SIP&lt;/a&gt;-стека и т.д.)&lt;/li&gt;&lt;li&gt;Конфигурацией в XML (по мне это значительно удобнее ini-файлов) с возможностью перечитывать фрагменты конфигурации с HTTP-сервера в процессе работы&lt;/li&gt;&lt;/ul&gt;Правда размер дефолтной конфигурации &lt;a href="http://wiki.freeswitch.org/wiki/Default_config"&gt;совершенно безумен&lt;/a&gt;, да сама она скорее сборник примеров, чем то, от чего можно отталкиваться в процессе настройки системы для промышленной эксплуатации. Поэтому &lt;a href="http://admdev.blogspot.com/2008/08/callweaver.html"&gt;по аналогии с CallWeaver&lt;/a&gt; я выпилил для себя &lt;a href="http://freeswitch.ru/wiki/minimal"&gt;минимально работоспособный вариант&lt;/a&gt;, который дальше по мере необходимости уже можно наращивать дополнительными возможностями. Хотел было даже подбить текущего майнтейнера &lt;a href="http://sisyphus.ru/ru/srpm/Sisyphus/freeswitch"&gt;FreeSWITCH в ALT Linux&lt;/a&gt; сделать этот вариант конфигурации одним из коробочных - да тот оказался &lt;a href="https://bugzilla.altlinux.org/show_bug.cgi?id=23868"&gt;слишком несговорчивым&lt;/a&gt; :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-802391095371974962?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/802391095371974962/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=802391095371974962' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/802391095371974962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/802391095371974962'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2010/08/blog-post.html' title='Король умер, да здравствует король ...'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-3999946446197854159</id><published>2010-05-04T09:47:00.005+03:00</published><updated>2010-12-29T15:25:43.742+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Java services with Maven</title><content type='html'>Наконец-то я научился использовать &lt;a href="http://ru.wikipedia.org/wiki/Apache_Maven"&gt;maven&lt;/a&gt; :) Устанавливаем &lt;a href="http://admdev.blogspot.com/2009/12/groovy-first-steps.html"&gt;аналогично Groovy&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;# cd /opt&lt;br /&gt;# wget http://www.sai.msu.su/apache/maven/binaries/apache-maven-2.2.1-bin.zip&lt;br /&gt;# unzip apache-maven-2.2.1-bin.zip &lt;br /&gt;# ln -s apache-maven-2.2.1 maven&lt;br /&gt;# cat &gt; /etc/profile.d/m2home.sh &lt;&lt; EOF&lt;br /&gt;&gt; M2_HOME=/opt/maven&lt;br /&gt;&gt; export M2_HOME&lt;br /&gt;&gt; export PATH=$PATH:$M2_HOME/bin&lt;br /&gt;&gt; EOF&lt;br /&gt;# chmod 755 /etc/profile.d/m2home.sh&lt;br /&gt;&lt;/pre&gt;В качестве подопытного кролика используем &lt;a href="http://admdev.blogspot.com/2008/08/lightweight-jee.html"&gt;мои старые примеры&lt;/a&gt;, разрезанные на 2 части:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://git.altlinux.org/people/enp/packages/java-service.git"&gt;дистрибутивозависимую&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/enp/service"&gt;кросcплатформенную&lt;/a&gt; (примеры &lt;a href="http://enp.itx.ru/java/examples/ServiceApp.NoLib.zip"&gt;ServiceApp&lt;/a&gt;, &lt;a href="http://enp.itx.ru/java/examples/SpringApp.NoLib.zip"&gt;SpringApp&lt;/a&gt;, &lt;a href="http://enp.itx.ru/java/examples/SpringJettyWebApp.NoLib.zip"&gt;SpringJettyWebApp&lt;/a&gt; и &lt;a href="http://enp.itx.ru/java/examples/SpringJpaApp.NoLib.zip"&gt;SpringJpaApp&lt;/a&gt; приблизительно соответствуют тегам &lt;a href="http://github.com/enp/service/tree/logging"&gt;logging&lt;/a&gt;, &lt;a href="http://github.com/enp/service/tree/spring"&gt;spring&lt;/a&gt;, &lt;a href="http://github.com/enp/service/tree/web/jetty"&gt;web&lt;/a&gt; и &lt;a href="http://github.com/enp/service/tree/persistence/hibernate"&gt;persistence&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;Собираем:&lt;br /&gt;&lt;pre&gt;$ git clone git://github.com/enp/service.git&lt;br /&gt;$ cd service/&lt;br /&gt;$ mvn package&lt;br /&gt;$ du -s target/service-0.1*&lt;br /&gt;2.2M    target/service-0.1-dist.zip&lt;br /&gt;8.0K    target/service-0.1.jar&lt;br /&gt;12K     target/service-0.1-src.zip&lt;br /&gt;&lt;/pre&gt;Запустить можно как приложение:&lt;br /&gt;&lt;pre&gt;$ cd target/&lt;br /&gt;$ unzip service-0.1-dist.zip &lt;br /&gt;$ cd service-0.1&lt;br /&gt;$ java -jar service-0.1.jar &lt;br /&gt;&lt;/pre&gt;И как сервис:&lt;br /&gt;&lt;pre&gt;# apt-get install java-service&lt;br /&gt;# java-service-create myservice&lt;br /&gt;# service myservice start&lt;br /&gt;# service myservice status&lt;br /&gt;# service myservice stop&lt;br /&gt;# java-service-destroy myservice&lt;br /&gt;&lt;/pre&gt;В пакете &lt;a href="http://sisyphus.ru/ru/srpm/Sisyphus/java-service"&gt;java-service&lt;/a&gt; в качестве уже скомпилированной реализации сервиса (файл /var/lib/java-service/template.zip) лежит то, что доступно по тегу &lt;a href="http://github.com/enp/service/tree/service"&gt;service&lt;/a&gt;. Командой java-service-create myservice архив template.zip разворачивается в /var/lib/java-service/myservice - и вот содержимое этого каталога я уже подменяю моим собственным приложением.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-3999946446197854159?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/3999946446197854159/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=3999946446197854159' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/3999946446197854159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/3999946446197854159'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2010/05/java-services-with-maven.html' title='Java services with Maven'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-5520586202618203628</id><published>2010-04-23T16:33:00.019+03:00</published><updated>2011-01-28T11:32:25.483+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux-live'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>Новые сборки ALT Linux Live Lite c XFCE и KDE3</title><content type='html'>Немного доработал десктопную часть &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git"&gt;mkimage-profile-live&lt;/a&gt; и попутно на свежем &lt;a href="ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/5.1/branch"&gt;branch/5.1&lt;/a&gt; собрал livecd с &lt;a href="http://enp.itx.ru/linux/alt/5.1/iso/altlive-xfce-5.1-i586.iso"&gt;XFCE&lt;/a&gt; и &lt;a href="http://enp.itx.ru/linux/alt/5.1/iso/altlive-kde3-5.1-i586.iso"&gt;KDE3&lt;/a&gt; (только i586) - причем последний &lt;a href="http://www.altlinux.org/LTSP/Memory#.D0.9F.D0.BE.D1.82.D1.80.D0.B5.D0.B1.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BF.D0.B0.D0.BC.D1.8F.D1.82.D0.B8_.28Mb.29"&gt;по некоторым данным&lt;/a&gt; должен быть едва ли не легче первого. &lt;br /&gt;&lt;br /&gt;Выглядят они так:&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_adZ-zFvdT_0/S9GW1DcsEdI/AAAAAAAAAuU/I-gx-5xjAu8/xfce.jpg"&gt;&lt;img  style="cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://lh6.ggpht.com/_adZ-zFvdT_0/S9GW1DcsEdI/AAAAAAAAAuU/I-gx-5xjAu8/xfce.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_adZ-zFvdT_0/S9GgYgs96xI/AAAAAAAAAuY/XY7-Jjj3PCo/kde3.jpg"&gt;&lt;img  style="cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://lh5.ggpht.com/_adZ-zFvdT_0/S9GgYgs96xI/AAAAAAAAAuY/XY7-Jjj3PCo/kde3.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Инструкции по переносу загруженной системы на жесткий диск можно найти в файле /etc/issue и, соответственно, на всех текстовых консолях - впрочем &lt;a href="http://admdev.blogspot.com/2009/12/alt-linux-live-lite.html"&gt;чуть раньше&lt;/a&gt; я их уже приводил. Инструкции по изготовлению liveflash из livecd лежат в файле README прямо в корне iso-образов.&lt;br /&gt;&lt;br /&gt;Желающие могут воспроизвести результаты следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ git clone git.alt:/people/enp/packages/mkimage-profile-live.git&lt;br /&gt;$ cd mkimage-profile-live&lt;br /&gt;$ git checkout autoconf&lt;br /&gt;$ autoconf&lt;br /&gt;$ ./configure \&lt;br /&gt;  --with-release=5.1 \&lt;br /&gt;  --with-aptconf=/home/enp/apt/apt.conf.M51.i586 \&lt;br /&gt;  --with-kernel=el-smp \&lt;br /&gt;  --with-features=fakeinstall,tools-console,tools-network,xorg,dm-autologin-gdm,de-xfce,apps-firefox,apps-office,apps-mobile,sound &lt;br /&gt;  --with-timezone=Europe/Moscow &lt;br /&gt;  --with-locale=ru_RU&lt;br /&gt;  --with-user=user&lt;br /&gt;$ make&lt;br /&gt;$ du -s .work/.out/altlinux-5.1-live.iso &lt;br /&gt;516M    altlinux-5.1-live.iso&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Это сборка образа с XFCE. Образ с KDE3 собирается аналогично, только dm-autologin-gdm,de-xfce нужно заменить на dm-autologin-kdm3,de-kde3.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-5520586202618203628?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/5520586202618203628/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=5520586202618203628' title='Комментарии: 11'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5520586202618203628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5520586202618203628'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2010/04/alt-linux-live-lite-c-xfce-kde3.html' title='Новые сборки ALT Linux Live Lite c XFCE и KDE3'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_adZ-zFvdT_0/S9GW1DcsEdI/AAAAAAAAAuU/I-gx-5xjAu8/s72-c/xfce.jpg' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-5804558419587960659</id><published>2010-01-26T13:05:00.008+02:00</published><updated>2010-04-19T09:05:10.229+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='altsp'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux-live'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>ALT Linux Live Lite для толстых бездисковых клиентов</title><content type='html'>Использовать современные рабочие станции с 1Gb RAM и (зачастую двухъядерными) Atom в минимальной комплектации в качестве тонких бездисковых клиентов кажется слишком расточительным, а найти менее производительное и дорогое (но при этом не б/у) железо чем дальше, тем сложнее. Самый логичный выход из этой ситуации - запуск DE и всех необходимых приложений локально, но с удаленного носителя, как и в случае тонких клиентов. Принципиальное отличие в том, что приложениям потребуется где-то сохранять результаты своей работы - но r/w /home можно держать на NFS, а остальное и потерять не жалко.&lt;br /&gt;&lt;br /&gt;Образ для удаленной загрузки легко изготовить на основе профиля &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git"&gt;mkimage-profile-live.git&lt;/a&gt;, в который только что добавлена feature с именем nfshome - она позволяет указать адрес сервера и имя экспортируемого каталога в конфигурации syslinux примерно так:&lt;br /&gt;&lt;pre&gt;label remote&lt;br /&gt;&amp;nbsp;&amp;nbsp;kernel altlinux-live-i586/vmlinuz&lt;br /&gt;&amp;nbsp;&amp;nbsp;append initrd=altlinux-live-i586/initrd.img root=/dev/nfs ip=dhcp fastboot nfsroot=192.168.100.209:/export/root nfshome=192.168.100.209:/export/home&lt;br /&gt;&lt;/pre&gt;В зависимости от необходимости авторизации пользователей можно либо использовать автологин и монтировать в /home разные каталоги для разных рабочих станций (и реализовать в nfshome автоподстановку каталога на основе имени рабочей станции), либо использовать LDAP. Поскольку ни то, ни другое пока не работает из коробки, то в нарушение традиции я не буду выкладывать образы - желающие могут собрать и допилить их самостоятельно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-5804558419587960659?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/5804558419587960659/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=5804558419587960659' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5804558419587960659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5804558419587960659'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2010/01/alt-linux-live-lite.html' title='ALT Linux Live Lite для толстых бездисковых клиентов'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-4817268686234077840</id><published>2009-12-23T10:15:00.010+02:00</published><updated>2010-04-19T09:07:28.872+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy first steps</title><content type='html'>Озаботившись скриптовой обвязкой для очередной инсталляции, где выразительности unix shell явно недостаточно, подумал о том, что поздняк метаться. Perl, Python, Ruby и прочие скриптовые языки хороши каждый по-своему, но от Java мне все равно никуда не деться. В то же время с &lt;a href="http://groovy.codehaus.org"&gt;Groovy&lt;/a&gt; я получу примерно тот же уровень комфорта при ad-hook scripting с сохранением всего, что я уже умею и сделал. Ибо код Groovy не просто компилируется в байткод JVM (таких языков &lt;a href="http://en.wikipedia.org/wiki/List_of_JVM_languages"&gt;много&lt;/a&gt;), но максимально синтаксически и семантически похож на Java.&lt;br /&gt;&lt;br /&gt;Предварительные требования для Groovy: установленный JDK и прописанный JAVA_HOME (в ALT Linux для этого достаточно сказать apt-get install java-1.6.0-sun-devel tzdata-java). Процесс установки выглядит так:&lt;br /&gt;&lt;pre&gt;# cd /opt&lt;br /&gt;# wget http://dist.groovy.codehaus.org/distributions/groovy-binary-1.7.0.zip&lt;br /&gt;# unzip groovy-binary-1.7.0.zip &lt;br /&gt;# ln -s groovy-1.7.0 groovy&lt;br /&gt;# cat &gt; /etc/profile.d/groovyhome.sh &lt;&lt; EOF&lt;br /&gt;&gt; GROOVY_HOME=/opt/groovy&lt;br /&gt;&gt; export GROOVY_HOME&lt;br /&gt;&gt; export PATH=$PATH:$GROOVY_HOME/bin&lt;br /&gt;&gt; EOF&lt;br /&gt;# chmod 755 /etc/profile.d/groovyhome.sh&lt;br /&gt;&lt;/pre&gt;Причины неиспользования groovy из альтовского репозитария (или &lt;a href="http://jpackage.org/"&gt;JPackage&lt;/a&gt; в общем случае) просты - огромный список зависимостей, большая часть которых мне никогда не потребуется, и, как следствие, протухшие версии зависимых пакетов да и самого groovy. Проблема переносимости в случае ad-hook scripting менее актуальна, однако при увеличении размеров проекта она вполне может проявиться.&lt;br /&gt;&lt;br /&gt;Теперь перелогинимся и убедимся в том, что Groovy у нас есть:&lt;br /&gt;&lt;pre&gt;$ groovy -version&lt;br /&gt;Groovy Version: 1.7.0 JVM: 1.6.0_17&lt;br /&gt;&lt;/pre&gt;а затем напишем традиционный Hello World:&lt;br /&gt;&lt;pre&gt;$ cat &gt; hello.groovy &lt;&lt; EOF&lt;br /&gt;&gt; #!/usr/bin/env groovy&lt;br /&gt;&gt;&lt;br /&gt;&gt; def hello(name) {&lt;br /&gt;&gt;     println("Hello $name!")&lt;br /&gt;&gt; }&lt;br /&gt;&gt;&lt;br /&gt;&gt; hello("World")&lt;br /&gt;&gt; EOF&lt;br /&gt;$ chmod 755 hello.groovy&lt;br /&gt;$ ./hello.groovy &lt;br /&gt;Hello World!&lt;br /&gt;&lt;/pre&gt;Ну и тормоз же он однако:&lt;br /&gt;&lt;pre&gt;$ time ./hello.groovy &lt;br /&gt;Hello World!&lt;br /&gt;3.18user 0.18system 0:02.22elapsed 151%CPU (0avgtext+0avgdata 0maxresident)k&lt;br /&gt;0inputs+0outputs (1major+25068minor)pagefaults 0swaps&lt;br /&gt;&lt;/pre&gt;И даже предварительная компиляция и запуск готового байткода помогает не сильно:&lt;br /&gt;&lt;pre&gt;$ groovyc hello.groovy &lt;br /&gt;$ time java -cp .:$GROOVY_HOME/embeddable/groovy-all-1.7.0.jar hello&lt;br /&gt;Hello World!&lt;br /&gt;1.88user 0.10system 0:01.60elapsed 123%CPU (0avgtext+0avgdata 0maxresident)k&lt;br /&gt;0inputs+0outputs (1major+15771minor)pagefaults 0swaps&lt;br /&gt;&lt;/pre&gt;Хотя здесь как раз нет ничего удивительного - скоростью запуска JVM никогда не отличалась. Для разных мелочей эту проблему можно обойти с помощью Groovy Shell:&lt;br /&gt;&lt;pre&gt;$ groovysh &lt;br /&gt;Groovy Shell (1.7.0, JVM: 1.6.0_17)&lt;br /&gt;Type 'help' or '\h' for help.&lt;br /&gt;------------------------------------------------------------------------------------&lt;br /&gt;groovy:000&gt; def hello(name) {      &lt;br /&gt;groovy:001&gt; println("Hello $name!")&lt;br /&gt;groovy:002&gt; }&lt;br /&gt;===&gt; true&lt;br /&gt;groovy:000&gt; hello("World")         &lt;br /&gt;Hello World!&lt;br /&gt;===&gt; null&lt;br /&gt;groovy:000&gt; exit&lt;br /&gt;&lt;/pre&gt;Для отлаженных скриптов лишних 3 секунд на запуск уже не очень жалко, ну а запускать их (и JVM вообще) слишком часто никто в здравом уме не станет - постоянно запущенный сервис будет работать значительно эффективнее.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-4817268686234077840?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/4817268686234077840/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=4817268686234077840' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/4817268686234077840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/4817268686234077840'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/12/groovy-first-steps.html' title='Groovy first steps'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-2949892729830987180</id><published>2009-12-09T13:38:00.014+02:00</published><updated>2011-01-28T11:51:08.164+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux-live'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>Развитие ALT Linux Live Lite</title><content type='html'>Давно ожидаемый &lt;a href="http://lists.altlinux.org/pipermail/sisyphus/2009-October/343127.html"&gt;комбинаторый взрыв возможных конфигураций &lt;b&gt;Live Lite&lt;/b&gt;&lt;/a&gt; заставил меня задействовать autoconf в одноименном бранче &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git"&gt;профиля&lt;/a&gt;. Выглядит примерно так:&lt;br /&gt;&lt;pre&gt;$ autoconf&lt;br /&gt;&lt;br /&gt;$ ./configure --help&lt;br /&gt;...&lt;br /&gt;  --with-aptconf=file       custom apt.conf location, e.g '--with-aptconf=/etc/apt/apt.conf'&lt;br /&gt;  --with-release=release    install altlinux-release-* package&lt;br /&gt;  --with-kernel=kernel      install kernel-image-* package&lt;br /&gt;  --with-boot=boot          boot : propagator, nfs, nbd&lt;br /&gt;  --with-features=features  features : see live/features directory ...&lt;br /&gt;  --with-user=user          user : default user name&lt;br /&gt;  --with-locale=locale      locale : en_US, ru_RU, ...&lt;br /&gt;  --with-timezone=timezone  timezone : Europe/London, Europe/Moscow, ...&lt;br /&gt;&lt;br /&gt;$ ls live/features&lt;br /&gt;apps-firefox&lt;br /&gt;apps-mobile&lt;br /&gt;apps-office&lt;br /&gt;de-xfce&lt;br /&gt;dm-autologin&lt;br /&gt;dm-autologin-gdm&lt;br /&gt;dm-gdm&lt;br /&gt;fakeinstall&lt;br /&gt;sound&lt;br /&gt;tools-console&lt;br /&gt;tools-network&lt;br /&gt;xorg&lt;br /&gt;&lt;/pre&gt;Типичная feature выглядит следующим образом:&lt;br /&gt;&lt;pre&gt;$ cat live/features/dm-autologin/packages &lt;br /&gt;autologin&lt;br /&gt;&lt;br /&gt;$ cat live/features/dm-autologin/image-scripts.d/01-autologin &lt;br /&gt;#!/bin/sh -e&lt;br /&gt;cat &gt;&gt; /etc/sysconfig/autologin &lt;&lt; EOF&lt;br /&gt;USER=altlive&lt;br /&gt;EXEC=/usr/bin/xinit&lt;br /&gt;EXEC_ARGS=/usr/bin/startx&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;И пока для моих инсталляций такой способ формирования образов выглядит удобнее &lt;a href="http://git.altlinux.org/people/boyarsh/packages/mkimage-profiles-desktop.git"&gt;m-p-d&lt;/a&gt;.Желающие могут загрузить образы, собранные на текущем &lt;a href="ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/5.1/branch"&gt;branch/5.1&lt;/a&gt; (общая часть --with-release=5.1 --with-kernel=el-smp --with-user=user --with-timezone=Europe/Moscow --with-locale=ru_RU):&lt;ul&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/5.1/iso/altlive-console-5.1-i586.iso"&gt;i586&lt;/a&gt; --with-features=fakeinstall,tools-console,tools-network&lt;/li&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/5.1/iso/altlive-xfce-5.1-i586.iso"&gt;i586&lt;/a&gt; --with-features=fakeinstall,tools-console,tools-network,xorg,dm-autologin-gdm,de-xfce,apps-firefox,apps-office,apps-mobile,sound&lt;/li&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/5.1/iso/altlive-console-5.1-x86_64.iso"&gt;x86_64&lt;/a&gt; --with-features=fakeinstall,tools-console,tools-network&lt;/li&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/5.1/iso/altlive-xfce-5.1-x86_64.iso"&gt;x86_64&lt;/a&gt; --with-features=fakeinstall,tools-console,tools-network,xorg,dm-autologin-gdm,de-xfce,apps-firefox,apps-office,apps-mobile,sound&lt;/li&gt;&lt;/ul&gt;Немного измененная процедура установки выглядит теперь так:&lt;ul&gt;&lt;li&gt;размечаем диск с помощью [c|s]fdisk/mkswap/mkfs.ext4 или parted&lt;/li&gt;&lt;li&gt;вызываем /live/install (диск) (раздел для корня) - при этом загруженная система переносится на корневой раздел, настраивается fstab (туда прописываются корень и все найденные своп-разделы) и lilo&lt;/li&gt;&lt;li&gt;перезагружаемся с жесткого диска&lt;/li&gt;&lt;li&gt;настраиваем FQDN в /etc/sysconfig/network&lt;/li&gt;&lt;li&gt;настраиваем &lt;a href="http://www.altlinux.org/Etcnet"&gt;сеть&lt;/a&gt;&lt;/li&gt;&lt;li&gt;меняем рутовский пароль и пароль пользователя user - по дефолту они пустые&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-2949892729830987180?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/2949892729830987180/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=2949892729830987180' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/2949892729830987180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/2949892729830987180'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/12/alt-linux-live-lite.html' title='Развитие ALT Linux Live Lite'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-3089373629923719623</id><published>2009-10-05T13:07:00.007+03:00</published><updated>2011-01-28T12:00:39.414+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='altsp'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux-live'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>Сетевая загрузка ALT Linux Live Lite</title><content type='html'>&lt;a href="http://sisyphus.ru/ru/srpm/Sisyphus/propagator"&gt;Пропагатор&lt;/a&gt; позволяет загружать &lt;a href="http://admdev.blogspot.com/2009/09/alt-linux-live-lite.html"&gt;ALT Linux Live Lite&lt;/a&gt; не только с локальных устройств, но и &lt;a href="http://www.altlinux.org/NetInstall"&gt;по сети&lt;/a&gt;, однако при этом образ загружаемой системы размещается в RAM - и это не очень хорошо в тех случаях, когда памяти мало. По аналогии с &lt;a href="http://www.altlinux.org/LTSP"&gt;ALTSP&lt;/a&gt; можно монтировать корень загружаемой по сети системы непосредственно по NFS/NBD - профиль можно взять &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git"&gt;там же&lt;/a&gt; - но в бранче netboot.&lt;br /&gt;&lt;br /&gt;Не удержался и сделал "ALTSP на коленке" - в настройках pxelinux можно указать параметры nbdswap для сетевого свопа и xdmcp для подключения к удаленному десктопу. Результаты в бранче netboot-xdmcp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-3089373629923719623?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/3089373629923719623/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=3089373629923719623' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/3089373629923719623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/3089373629923719623'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/10/alt-linux-live-lite.html' title='Сетевая загрузка ALT Linux Live Lite'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-895766083219640100</id><published>2009-09-23T15:06:00.013+03:00</published><updated>2011-01-28T12:02:25.415+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux-live'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>ALT Linux Live Lite</title><content type='html'>&lt;a href="http://admdev.blogspot.com/2008/08/alt-linux-40-server-lite.html"&gt;ALT Linux 4.0 Server Lite&lt;/a&gt; умер, да здравствует &lt;b&gt;ALT Linux Live Lite&lt;/b&gt;! Как видно из названия, это в первую очередь live-система с &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git?p=mkimage-profile-live.git;a=blob;f=live/packages;h=112b8cf672d3c1dfb6aa157adb3f85c811217105;hb=a74c6fc8434be72695e17f3420fc5e2867c4f5d8"&gt;минимальным набором необходимых инструментов&lt;/a&gt;, однако она также пригодна к установке самой себя на жесткий диск в ручном режиме:&lt;ul&gt;&lt;li&gt;размечаем диск с помощью fdisk/sfdisk/cfdisk&lt;/li&gt;&lt;li&gt;вызываем /live/install (диск) (раздел для корня) (раздел для свопа) - при этом инициализируется своп, создается и заполняется файловая система ext3 на корневом разделе, настраивается fstab и lilo&lt;/li&gt;&lt;li&gt;перезагружаемся с жесткого диска&lt;/li&gt;&lt;li&gt;настраиваем FQDN в /etc/sysconfig/network&lt;/li&gt;&lt;li&gt;настраиваем &lt;a href="http://www.altlinux.org/Etcnet"&gt;сеть&lt;/a&gt;&lt;/li&gt;&lt;li&gt;удаляем PermitRootLogin yes из /etc/openssh/sshd_config - это удобно для удаленной установки через выключенный по умолчанию ssh, но не очень подходит в production&lt;/li&gt;&lt;li&gt;создаем хотя бы одного пользователя и включаем его в группу wheel - по умолчанию таких пользователей еще нет&lt;/li&gt;&lt;/ul&gt;Система собрана на текущем Сизифе, &lt;s&gt;доступны iso для архитертур &lt;a href="http://enp.itx.ru/linux/alt/sisyphus/iso/altlinux-live-i586.iso"&gt;i586&lt;/a&gt; и &lt;a href="http://enp.itx.ru/linux/alt/sisyphus/iso/altlinux-live-x86_64.iso"&gt;x86_64&lt;/a&gt;&lt;/s&gt; iso потеряны а, профиль можно взять &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profile-live.git"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-895766083219640100?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/895766083219640100/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=895766083219640100' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/895766083219640100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/895766083219640100'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/09/alt-linux-live-lite.html' title='ALT Linux Live Lite'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-6756375157047572897</id><published>2009-08-13T14:31:00.010+03:00</published><updated>2010-05-25T15:00:55.094+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='telecom'/><title type='text'>Telephone eXchange Management Library</title><content type='html'>На &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; отправилась &lt;a href="http://github.com/enp/txmlib"&gt;TXMLib (Telephone eXchange Management Library)&lt;/a&gt; - небольшая библиотека, предоставляющая унифицированный API к общим операциям различных &lt;a href="http://en.wikipedia.org/wiki/Telephone_exchange#Digital_switches"&gt;цифровых АТС&lt;/a&gt;. Пока поддерживается только измерение параметров абонентской линии только для АТС типа &lt;a href="http://en.wikipedia.org/wiki/EWSD"&gt;EWSD&lt;/a&gt;, &lt;a href="http://mt20.ru"&gt;MT-20/25&lt;/a&gt; и &lt;a href="http://loniis.ru/products/DX200.pdf"&gt;DX-200&lt;/a&gt; (а также ее потомка &lt;a href="http://loniis.ru/products/atsc-90.pdf"&gt;АТСЦ-90&lt;/a&gt;), однако дизайн библиотеки позволяет сравнительно легко добавлять поддержку новых типов АТС и новых типов операций.&lt;br /&gt;&lt;br /&gt;Для этого потребуется описать наследников классов:&lt;ul&gt;&lt;li&gt;txm.lib.common.core.CommandManager - для выделения ответов на команды из терминала АТС - поддержка чего-то отличного от текстового терминала возможна, но пока детально не проработана&lt;/li&gt;&lt;li&gt;txm.lib.common.core.OperationManager - для перевода унифицированных операций в конкретные команды АТС&lt;/li&gt;&lt;/ul&gt;Помимо хорошей экономии на общем коде и повышения его читабельности по сравнению с инструментами типа &lt;a href="http://ru.wikipedia.org/wiki/Expect"&gt;expect&lt;/a&gt; мы также получаем дополнительный бонус в виде сформированного графа операций, команд, их результатов и ошибок, готового к сериализации в XML (см. класс txm.lib.examples.OperationExample) или, например, в реляционную БД посредством &lt;a href="http://ru.wikipedia.org/wiki/ORM"&gt;ORM&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Принципиальным ограничением TXMLib явлется отсутствие поддержки операций с состояниием, но потребность в них невелика. Скорее наоборот, есть потребность пакетном режиме: выполнение одной операции не должно приводить к отказу выполнения другой - вместо этого они должны ставиться в очередь и выполняться по мере поступления.&lt;br /&gt;&lt;br /&gt;Разумеется, диспетчеризацией операций и их передачей по сети TXMLib не занимается - это следующая задача для другого инструмента.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-6756375157047572897?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/6756375157047572897/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=6756375157047572897' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/6756375157047572897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/6756375157047572897'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/08/telephone-exchange-management-library.html' title='Telephone eXchange Management Library'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-3415095671132302451</id><published>2009-02-17T13:24:00.015+02:00</published><updated>2009-03-05T09:55:18.078+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>ALT Linux 4.1 Desktop Lite - неофициальная сборка</title><content type='html'>Время от времени в &lt;a href="https://lists.altlinux.org/mailman/listinfo/community"&gt;community@lists.altlinux.ru&lt;/a&gt; спрашивают: &lt;a href="http://lists.altlinux.org/pipermail/community/2009-February/648474.html"&gt;а где бы раздобыть ALT Linux 4.1 Desktop Lite&lt;/a&gt;, который до релиза, как известно, не дожил :(&lt;br /&gt;&lt;br /&gt;Поскольку я собирал для себя нечто подобное, но с другим дизайном и с другими дефолтами, и лучше поздно, чем никогда, выкладываю пересобранные на сегодняшнем &lt;a href="ftp://ftp.altlinux.org/pub/distributions/ALTLinux/4.1/branch/"&gt;branch/4.1&lt;/a&gt; cd-образы:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.1/iso/altlinux-4.1-xfce-min-i586.iso"&gt;минимальный&lt;/a&gt; - в комплекте только &lt;a href="http://www.xfce.org/"&gt;XFCE&lt;/a&gt; и &lt;a href="http://www.mozilla-europe.org/ru/firefox/"&gt;Firefox&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.1/iso/altlinux-4.1-xfce-max-i586.iso"&gt;полный&lt;/a&gt; - также включены &lt;a href="http://www.mozilla-russia.org/products/thunderbird/"&gt;Thunderbird&lt;/a&gt;, &lt;a href="http://"&gt;Pidgin&lt;/a&gt;, &lt;a href="http://ru.openoffice.org/"&gt;OpenOffice&lt;/a&gt;, &lt;a href="http://projects.gnome.org/evince/"&gt;Evince&lt;/a&gt;, &lt;a href="http://www.videolan.org/vlc/"&gt;VLC Player&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Инсталлятор от официального не отличается ничем, свежеустановленная система выглядит так:&lt;table&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_adZ-zFvdT_0/SZqfkuUC6QI/AAAAAAAAAEg/VhdYSGFa4Sc/s1600-h/altlinux-4.1-xfce-login.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://1.bp.blogspot.com/_adZ-zFvdT_0/SZqfkuUC6QI/AAAAAAAAAEg/VhdYSGFa4Sc/s320/altlinux-4.1-xfce-login.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5303726964438395138" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_adZ-zFvdT_0/SZqhAvrXQgI/AAAAAAAAAEw/CWUCeIHugE0/s1600-h/altlinux-4.1-xfce-desktop.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 187px;" src="http://2.bp.blogspot.com/_adZ-zFvdT_0/SZqhAvrXQgI/AAAAAAAAAEw/CWUCeIHugE0/s320/altlinux-4.1-xfce-desktop.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5303728545352598018" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;Если кому-то вдруг захочется это собрать, профиль можно взять &lt;a href="http://git.altlinux.org/people/enp/packages/mkimage-profiles-desktop.git"&gt;здесь&lt;/a&gt;. Планы по сборке аналогичного дистрибутива на &lt;a href="ftp://ftp.altlinux.org/pub/distributions/ALTLinux/5.0/branch/"&gt;branch/5.0&lt;/a&gt; есть, но если кто-нибудь меня опередит, я буду только рад :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-3415095671132302451?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/3415095671132302451/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=3415095671132302451' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/3415095671132302451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/3415095671132302451'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/02/alt-linux-41-desktop-lite.html' title='ALT Linux 4.1 Desktop Lite - неофициальная сборка'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_adZ-zFvdT_0/SZqfkuUC6QI/AAAAAAAAAEg/VhdYSGFa4Sc/s72-c/altlinux-4.1-xfce-login.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-4062880161670973418</id><published>2009-02-15T22:30:00.010+02:00</published><updated>2010-04-19T09:36:03.211+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pm'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Практическое введение в Git</title><content type='html'>Возможно, я плохо искал, но простого пошагового введения в &lt;a href="http://ru.wikipedia.org/wiki/Git"&gt;Git&lt;/a&gt; на русском для тех разработчиков и админов, которые кое-как научились использовать &lt;a href="http://ru.wikipedia.org/wiki/CVS"&gt;CVS&lt;/a&gt; или &lt;a href="http://ru.wikipedia.org/wiki/Subversion"&gt;SVN&lt;/a&gt;, до сих пор нет. Много полезных материалов и ссылок можно найти на &lt;a href="http://www.altlinux.org/Git"&gt;ALT Linux Wiki&lt;/a&gt;, однако значительная их часть содержит альтовскую дистрибутивостроительную специфику или, наоборот, несколько далека от практических задач. Я попытаюсь описать один из типичных сценариев использования Git без привязки к каким-либо задачам и без излишних подробностей - за ними лучше сразу идти в &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html"&gt;Git User's Manual&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Итак, основная идея Git, как и любой распределенной SCM, заключается в том, что мы имеем дело с локальными коммитами в индивидуальных репозитариях разработчиков и с мехнизмами обмена коммитами между репозитариями. Главное преимущество - гибкость (можно вести локальные бранчи с локальными коммитами, не забивая основной репозитарий результатами неудачных или удачных экспериментов), обратная сторона - некоторое увеличение сложности взаимодействия по сравнению с централизованными SCM.&lt;br /&gt;&lt;br /&gt;Далее предполагаем, что центральный и всегда доступный репозитарий все же имеется, и разработчики обмениваются коммитами не напрямую друг с другом, а с центральным репозитарием.&lt;br /&gt;&lt;br /&gt;Устанавливаем все необходимое и заводим на сервере центральный репозитарий:&lt;br /&gt;&lt;pre&gt;# apt-get install git-core&lt;br /&gt;# mkdir /home/repo/alpha.git&lt;br /&gt;# cd /home/repo/alpha.git&lt;br /&gt;# git init --bare --shared=true&lt;br /&gt;&lt;/pre&gt;Работать с ним будем по ssh, поэтому создаем для разработчиков учетные записи и добавляем их в группу, во владение которой передаем репозитарий:&lt;br /&gt;&lt;pre&gt;# useradd -d /var/empty/ -s /usr/bin/git-shell user1&lt;br /&gt;# useradd -d /var/empty/ -s /usr/bin/git-shell user2&lt;br /&gt;# groupadd alpha&lt;br /&gt;# usermod -G alpha user1&lt;br /&gt;# usermod -G alpha user2&lt;br /&gt;# chown -R root:alpha /home/repo/alpha.git&lt;br /&gt;&lt;/pre&gt;Теперь один из разработчиков может создать локальный репозитарий и сделать в нем несколько коммитов:&lt;br /&gt;&lt;pre&gt;[user1@workstation1 ~]$ mkdir alpha&lt;br /&gt;[user1@workstation1 ~]$ cd alpha&lt;br /&gt;[user1@workstation1 alpha]$ git init&lt;br /&gt;[user1@workstation1 alpha]$ git config user.name 'User 1'&lt;br /&gt;[user1@workstation1 alpha]$ git config user.email 'user1@workstation1'&lt;br /&gt;[user1@workstation1 alpha]$ echo 'line 1' &gt; file&lt;br /&gt;[user1@workstation1 alpha]$ git add .&lt;br /&gt;[user1@workstation1 alpha]$ git commit -a -m 'add line 1'&lt;br /&gt;[user1@workstation1 alpha]$ echo 'line 2' &gt;&gt; file&lt;br /&gt;[user1@workstation1 alpha]$ git commit -a -m 'add line 2'&lt;br /&gt;&lt;/pre&gt;Каждый коммит принадлежит одному или нескольким бранчам. Для первого коммита автоматически создается бранч с именем master, в него же по умолчанию попадают следующие коммиты.&lt;br /&gt;&lt;br /&gt;Несколько полезных команд:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;git branch - показать список бранчей, выделив текущий, создать, удалить или переименовать бранч&lt;/li&gt;&lt;li&gt;git status - показать текущее состояние рабочей копии (какие новые файлы появились, а какие были удалены, что закоммитили, а что нет, и т.д.)&lt;/li&gt;&lt;li&gt;git log - показать историю коммитов, каждый из которых идентифицируется с помощью хеша sha1&lt;/li&gt;&lt;li&gt;git show - показать подробности последнего коммита или любого коммита по его хешу&lt;/li&gt;&lt;li&gt;git diff - показать разницу между последним коммитом и рабочей копией или между коммитами&lt;/li&gt;&lt;/ul&gt;Теперь подготовим наш репозитарий к отгрузке коммитов в центральный репозитарий на сервере:&lt;br /&gt;&lt;pre&gt;[user1@workstation1 alpha]$ git remote add origin user1@gitserver:/home/repo/alpha.git&lt;br /&gt;&lt;/pre&gt;И отправим туда коммиты, принадлежащие локальному бранчу master - они попадут в удаленный бранч с таким же именем:&lt;br /&gt;&lt;pre&gt;[user1@workstation1 alpha]$ git push origin master&lt;br /&gt;&lt;/pre&gt;В дальнейшем можно будет ограничиться git push, т.к. origin - дефолтное имя удаленного репозитария, а бранч master в нем уже существует. С другой стороны, ничто не мешает явно указывать URL удаленного репозитария и имена локального и удаленного бранчей:&lt;br /&gt;&lt;pre&gt;[user1@workstation1 alpha]$ git push user1@gitserver:/home/repo/alpha.git master:master&lt;br /&gt;&lt;/pre&gt;Для получения коммитов из центрального репозитария в локальный бранч master его нужно было бы создать с параметром --track, однако бранч уже существует, поэтому просто укажем соответствующий ему удаленный бранч в настройках:&lt;br /&gt;&lt;pre&gt;$ cat &gt;&gt; .git/config &lt;&lt; EOF&lt;br /&gt;&gt; [branch "master"]&lt;br /&gt;&gt;       remote = origin&lt;br /&gt;&gt;       merge = refs/heads/master&lt;br /&gt;&gt; EOF&lt;br /&gt;&lt;/pre&gt;Получить новые коммиты из центрального репозитария можно так:&lt;br /&gt;&lt;pre&gt;[user1@workstation1 alpha]$ git fetch&lt;br /&gt;[user1@workstation1 alpha]$ git merge origin/master&lt;br /&gt;&lt;/pre&gt;или просто:&lt;br /&gt;&lt;pre&gt;[user1@workstation1 alpha]$ git pull&lt;br /&gt;&lt;/pre&gt;В случае конфликтующих изменений операция merge не будет завершена коммитом - в этом случае нужно будет выполнить git commit самостоятельно после разрешения конфликта.&lt;br /&gt;&lt;br /&gt;Разумеется новые коммиты могут появиться в центральном репозитарии только после того, как другой разработчик клонирует его, внесет туда какие-либо изменения и отправит их обратно - при этом настраивать свой репозитарий для взаимодействия с удаленным ему уже не потребуется:&lt;br /&gt;&lt;pre&gt;[user2@workstation2 ~]$ git clone user2@gitserver:/home/repo/alpha.git&lt;br /&gt;[user2@workstation2 ~]$ cd alpha/&lt;br /&gt;[user2@workstation2 alpha]$ git config user.name 'User 1'&lt;br /&gt;[user2@workstation2 alpha]$ git config user.email 'user2@workstation2'&lt;br /&gt;[user2@workstation2 alpha]$ echo 'line 3' &gt;&gt; file&lt;br /&gt;[user2@workstation2 alpha]$ git commit -a -m 'add line 3'&lt;br /&gt;[user2@workstation2 alpha]$ git push&lt;br /&gt;&lt;/pre&gt;Теперь чуть подробнее о том, ради чего все эти мучения - ведь для выполнения аналогичных операций средствами CVS или SVN потребовалось бы меньше операций. Дело в том, что до тех пор, пока мы не отгрузили коммиты в удаленный репозитарий, мы вольны распоряжаться ими как нам вздумается. Например, заведем для экспериментов новый локальный бранч и сделаем в нем еще пару коммитов:&lt;br /&gt;&lt;pre&gt;[user1@workstation1 alpha]$ git-checkout -b experimental&lt;br /&gt;[user1@workstation1 alpha]$ echo 'line 4' &gt;&gt; file&lt;br /&gt;[user1@workstation1 alpha]$ git commit -a -m 'add line 4'&lt;br /&gt;[user1@workstation1 alpha]$ echo 'line 5' &gt;&gt; file&lt;br /&gt;[user1@workstation1 alpha]$ git commit -a -m 'add line 5'&lt;br /&gt;&lt;/pre&gt;Если какие-то коммиты лучше было бы не делать, можно откатиться к любому заданному коммиту, указав его:&lt;ul&gt;&lt;li&gt;явно в виде sha1 id - их покажет git log&lt;/li&gt;&lt;li&gt;по имени тэга - его можно создать для коммита по его sha1 id с помощью git tag&lt;/li&gt;&lt;li&gt;относительно другого коммита - например, последнему коммиту, на который указывает HEAD, предшествует HEAD^:&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;[user1@workstation1 alpha]$ git reset --hard HEAD^&lt;br /&gt;&lt;/pre&gt;Также бывают полезны параметр --soft (откатиться, но сохранить содержимое измененных файлов для последующего редактирования) и параметр --amend команды  git commit (включить содержимое старого коммита в новый).&lt;br /&gt;&lt;br /&gt;Вернемся в бранч master, сделаем в нем еще один коммит и втянем туда результаты экспериментов:&lt;br /&gt;&lt;pre&gt;[user1@workstation1 alpha]$ git checkout master&lt;br /&gt;[user1@workstation1 alpha]$ subst '/line 1/iline 0' file&lt;br /&gt;[user1@workstation1 alpha]$ git commit -a -m 'add line 0'&lt;br /&gt;[user1@workstation1 alpha]$ git merge experimental&lt;br /&gt;&lt;/pre&gt;Вместо операции merge, которая создает общий коммит для бранчей, иногда бывает полезно использовать rebase - эта операция переупорядочивает коммиты для того, чтобы сохранить историю линейной. Очень полезно для изучения истории использовать gitk, gitg или qgit - эти инструменты помогут представить описанное более наглядно.&lt;br /&gt;&lt;br /&gt;Разумеется, после того, как мы сделали git push, с историей лучше не забавляться - этим мы сильно осложним жизнь тем, кто уже основывает свои новые коммиты на ней. А вот до git push - сколько угодно :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-4062880161670973418?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/4062880161670973418/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=4062880161670973418' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/4062880161670973418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/4062880161670973418'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/02/git.html' title='Практическое введение в Git'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-8739917829170052625</id><published>2009-02-02T10:46:00.019+02:00</published><updated>2010-04-19T09:43:23.978+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pm'/><category scheme='http://www.blogger.com/atom/ns#' term='redmine'/><title type='text'>Redmine quickstart</title><content type='html'>Похоже, что изначально не приглянувшийся мне &lt;a href="http://www.redmine.org/"&gt;Redmine&lt;/a&gt; несколько удобнее &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt;:&lt;ul&gt;&lt;li&gt;есть приличная русификация&lt;/li&gt;&lt;li&gt;есть поддержка подпроектов&lt;/li&gt;&lt;li&gt;есть web-интерфейс для управления проектами и правами доступа к ним - прям аж обидно, и зачем я тратил время на &lt;a href="http://admdev.blogspot.com/2009/01/trac-appliance.html"&gt;Trac appliance&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;и самое главное - дефолтный дизайн отлично гармонирует с дизайном моего блога :)&lt;/li&gt;&lt;/ul&gt;В качестве ложки дегтя пока заметил лишь то, что принимать информацию об авторизации от &lt;a href="http://ru.wikipedia.org/wiki/Apache"&gt;Apache&lt;/a&gt; он не умеет, правда умеет &lt;a href="http://ru.wikipedia.org/wiki/LDAP"&gt;LDAP&lt;/a&gt;, который уже можно прикрутить &lt;a href="http://httpd.apache.org/docs/2.2/mod/mod_ldap.html"&gt;к Apache&lt;/a&gt;. И опакетить его, к сожалению, &lt;a href="http://lists.altlinux.org/pipermail/sysadmins/2009-February/029235.html"&gt;так просто не выйдет&lt;/a&gt; (&lt;b&gt;updated&lt;/b&gt;: поэтому &lt;a href="http://lists.altlinux.org/pipermail/sisyphus/2009-November/343786.html"&gt;вышло непросто&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Мне пришлось поставить из тарболла:&lt;br /&gt;&lt;pre&gt;# apt-get install ruby-rake ruby-stdlibs ruby-activerecord-sqlite3-adapter rubygems&lt;br /&gt;# useradd -d /opt/redmine -s /dev/null redmine&lt;br /&gt;# su - redmine -s /bin/bash&lt;br /&gt;$ wget http://rubyforge.org/frs/download.php/49319/redmine-0.8.0.tar.gz&lt;br /&gt;$ tar -zxf redmine-0.8.0.tar.gz &lt;br /&gt;$ cd redmine-0.8.0&lt;br /&gt;$ cat &gt; config/database.yml &lt;&lt; EOF&lt;br /&gt;&gt; production:&lt;br /&gt;&gt; &amp;nbsp;&amp;nbsp;adapter: sqlite3&lt;br /&gt;&gt; &amp;nbsp;&amp;nbsp;dbfile: db/production.db&lt;br /&gt;&gt; EOF&lt;br /&gt;$ rake db:migrate RAILS_ENV="production"&lt;br /&gt;$ rake redmine:load_default_data RAILS_ENV="production"&lt;br /&gt;$ ruby script/server -e production&lt;br /&gt;&lt;/pre&gt;Теперь подключаемся к http://server:3000/ и логинимся под именем admin с таким же точно паролем. Несмотря на грозные предупреждения в &lt;a href="http://www.redmine.org/wiki/redmine/RedmineInstall"&gt;руководстве по установке&lt;/a&gt; с более новыми, нежели указано, версиями &lt;a href="http://ru.wikipedia.org/wiki/Ruby"&gt;ruby&lt;/a&gt; и &lt;a href="http://ru.wikipedia.org/wiki/SQLite"&gt;sqlite&lt;/a&gt; вроде бы все работает.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-8739917829170052625?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/8739917829170052625/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=8739917829170052625' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/8739917829170052625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/8739917829170052625'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/02/redmine-quickstart.html' title='Redmine quickstart'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-997606563160219005</id><published>2009-01-29T13:56:00.015+02:00</published><updated>2010-04-19T09:50:26.403+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pm'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='trac'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Trac appliance</title><content type='html'>И все-таки &lt;a href="http://admdev.blogspot.com/2009/01/trac-quickstart-with-alt-linux.html"&gt;быстрый запуск Trac&lt;/a&gt; оказывается не слишком быстрым, а результат - не слишком удобным в сопровождении, особенно когда совместно с Trac предполагается использовать &lt;a href="http://ru.wikipedia.org/wiki/Система_управления_версиями"&gt;систему управления версиями&lt;/a&gt;. Более удобный use case представляется для меня сейчас таким:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;N проектов - каждый представляет из себя проект Trac и, возможно, настроенный для использования с ним репозитарий &lt;a href="http://ru.wikipedia.org/wiki/Git"&gt;Git&lt;/a&gt; или &lt;a href="http://ru.wikipedia.org/wiki/Subversion"&gt;Subversion&lt;/a&gt;&lt;/li&gt;&lt;li&gt;M пользователей - каждый имеет полный доступ к некоторым проектам (т.е. может работать в Trac и коммитить в репозитарий), а к некоторым не имеет вовсе.&lt;/li&gt;&lt;/ul&gt;Проекты/пользователи должны создаваться/удаляться одной командой, для разрешения/запрета доступа пользователя к проекту также должно быть достаточно одной команды.&lt;br /&gt;&lt;br /&gt;Проблема заключается в выборе технологии авторизации и аутентификации, которые позволили бы реализовать описанную схему. Для standalone версий Trac, Git и Subversion ведение единой базы данных пользователей и прав доступа к проектам невозможно, поэтому придется задействовать &lt;a href="http://ru.wikipedia.org/wiki/Apache"&gt;Apache&lt;/a&gt; и его &lt;a href="http://httpd.apache.org/docs/2.2/howto/auth.html"&gt;средства управления доступом&lt;/a&gt; - соответственно репозитарии Git и Subversion будут доступны по протоколу &lt;a href="http://ru.wikipedia.org/wiki/WebDAV"&gt;WebDAV&lt;/a&gt;. При этом никто не мешает при необходимости использовать более гибкие настройки прав доступа внутри проектов средствами самих &lt;a href="http://trac.edgewall.org/wiki/TracFineGrainedPermissions"&gt;Trac&lt;/a&gt; и &lt;a href="http://svnbook.red-bean.com/nightly/ru/svn.serverconfig.httpd.html#svn.serverconfig.httpd.authz.perdir"&gt;Subversion&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Готовое решение доступно в виде основного пакета appliance-trac и дополнительных appliance-trac-scm-git и appliance-trac-scm-svn, собираемых из &lt;a href="http://git.altlinux.org/people/enp/packages/appliance-trac.git"&gt;одноименного репозитария&lt;/a&gt;. Устанавливаем требуемое штатным для ALT Linux образом:&lt;br /&gt;&lt;pre&gt;trac-scm-git&lt;br /&gt;&lt;/pre&gt;Создаем проект (указываем имя и тип репозитария - если последним параметром будет что-то отличное от git или svn, то репозитарий просто не будет создан):&lt;br /&gt;&lt;pre&gt;# appliance-trac-create alpha git&lt;br /&gt;&lt;/pre&gt;Средствами Apache создаем пользователя:&lt;br /&gt;&lt;pre&gt;# htpasswd2 -b /var/www/appliance-trac/passwd user userpwd&lt;br /&gt;&lt;/pre&gt;Включаем его в соответствующую группу Apache, имя которой соответствует имени проекта:&lt;br /&gt;&lt;pre&gt;# vim /var/www/appliance-trac/group&lt;br /&gt;&lt;/pre&gt;При необходимости пользователя можно сделать администратором Trac:&lt;br /&gt;&lt;pre&gt;# trac-admin /var/www/appliance-trac/env/alpha permission add user TRAC_ADMIN&lt;br /&gt;&lt;/pre&gt;Теперь пользователь user может работать с проектом через web-интерфейс по ссылке http://server//appliance-trac/env/alpha и напрямую с репозитарием:&lt;br /&gt;&lt;pre&gt;$ cat &gt; ~/.netrc &lt;&lt; EOF&lt;br /&gt;&gt; machine server&lt;br /&gt;&gt; login user&lt;br /&gt;&gt; password userpwd&lt;br /&gt;&gt; EOF&lt;br /&gt;$ git-clone http://server/appliance-trac/scm/git/alpha.git&lt;br /&gt;$ cd alpha/&lt;br /&gt;$ echo "new line" &gt;&gt; README &lt;br /&gt;$ git commit -a -m 'new commit'&lt;br /&gt;$ git-http-push http://server/appliance-trac/scm/git/alpha.git heads/master&lt;br /&gt;&lt;/pre&gt;После того, как проект стал ненужным, его можно удалить:&lt;br /&gt;&lt;pre&gt;# appliance-trac-drop alpha git&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-997606563160219005?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/997606563160219005/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=997606563160219005' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/997606563160219005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/997606563160219005'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/01/trac-appliance.html' title='Trac appliance'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-8990350921101257863</id><published>2009-01-10T18:28:00.017+02:00</published><updated>2010-04-19T09:52:32.827+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pm'/><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='trac'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Trac quickstart</title><content type='html'>Вместе с &lt;a href="http://admdev.blogspot.com/2008/12/lightweight-wiki-engine.html"&gt;совсем уж примитивными wiki-движками&lt;/a&gt; бывают также полезны &lt;a href="http://en.wikipedia.org/wiki/List_of_project_management_software"&gt;интегрированные системы&lt;/a&gt; с wiki, багтрекером, web-интерфейсом к какой-нибудь &lt;a href="http://ru.wikipedia.org/wiki/Система_управления_версиями"&gt;системе управления версиями&lt;/a&gt; и прочими вкусностями - и среди них, как одну из самых простых в установке и в эксплуатации, можно выделить &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;После установки и запуска штатным для ALT Linux образом:&lt;br /&gt;&lt;pre&gt;# apt-get install trac&lt;br /&gt;# service trac start&lt;br /&gt;&lt;/pre&gt;Trac готов к обслуживанию проектов, размещенных в каталоге /var/lib/trac, однако хотя бы один проект еще нужно создать:&lt;br /&gt;&lt;pre&gt;# su - trac -s /bin/sh&lt;br /&gt;$ trac-admin alpha initenv alpha sqlite:db/trac.db "" ""&lt;br /&gt;$ vim alpha/conf/trac.ini # edit [header_logo] and [project] sections&lt;br /&gt;&lt;/pre&gt;После этого проект будет доступен на чтение всем желающим по ссылке http://localhost:8000/alpha. Для создания и редактирования багов и wiki-страниц необходимо авторизоваться, а для этого сначала создать пользователей следующим образом:&lt;br /&gt;&lt;pre&gt;$ trac-passwd -u user -p usrpwd &gt;&gt; /etc/trac/passwd&lt;br /&gt;&lt;/pre&gt;Для полного управления проектом нужно выдать пользователю user соответствующие права:&lt;br /&gt;&lt;pre&gt;$ trac-admin alpha permission add user TRAC_ADMIN&lt;br /&gt;&lt;/pre&gt;Такая схема разграничения прав доступа удобна для свободных проектов. Для проектов, процесс работы над которыми не должен быть публично доступным, необходима другая схема: как минимум, у пользователя anonymous необходимо изъять все права и явно выдать их группе authenticated. В этом случае все авторизовавшиеся пользователи будут иметь доступ ко все проектам, а это тоже не всегда оправдано. Для того, чтобы можно было ограничить права на уровне отдельных проектов, потребуется также изъять все права у группы authenticated, и передать их отдельной группе, а затем включать требуемых пользователей в эту группу:&lt;br /&gt;&lt;pre&gt;$ trac-restrict-env alpha developers&lt;br /&gt;$ trac-admin alpha permission add user developers&lt;br /&gt;&lt;/pre&gt;Конечно, возможна и более тонкая настройка прав доступа - но об этом подробно написано в документации Trac&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-8990350921101257863?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/8990350921101257863/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=8990350921101257863' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/8990350921101257863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/8990350921101257863'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2009/01/trac-quickstart-with-alt-linux.html' title='Trac quickstart'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-931587403318466326</id><published>2008-12-30T16:55:00.006+02:00</published><updated>2009-01-10T22:32:43.574+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Lightweight wiki engine</title><content type='html'>У всех популярных wiki-движков есть один существенный недостаток - они предлагают редактировать контент с помощью браузера. Этот недостаток давно и успешно &lt;a href="http://en.wikipedia.org/wiki/Wikipedia:Syntax_highlighting"&gt;лечится&lt;/a&gt;, однако осадок остается. Действительно, зачем все эти извращения в тех случаях, когда список авторов ограничен и все они имеют shell-доступ к серверу, на котором и живет wiki engine? Пусть редактируют вволю с помощью своего любимого текстового редактора (заодно и какую-нибудь &lt;a href="http://ru.wikipedia.org/wiki/Система_управления_версиями"&gt;систему управления версиями&lt;/a&gt; можно прикрутить), а wiki engine пусть всего лишь отдает текст, отформатированный в html.&lt;br /&gt;&lt;br /&gt;Концепт такого движка в виде автономного http-сервера можно можно посмотреть &lt;a href="http://git.altlinux.org/people/enp/packages/wwm.git"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-931587403318466326?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/931587403318466326/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=931587403318466326' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/931587403318466326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/931587403318466326'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/12/lightweight-wiki-engine.html' title='Lightweight wiki engine'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-3506031450136108199</id><published>2008-11-25T12:26:00.024+02:00</published><updated>2010-04-19T09:55:57.778+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='altsp'/><category scheme='http://www.blogger.com/atom/ns#' term='ovz'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>ALTSP inside OpenVZ VE</title><content type='html'>Требуется обеспечить всем необходимым (доступ в интернет, почта, офисные приложения и учетное ПО) небольшой офис, в котором имеется один приличный сервер и десяток бездисковых рабочих станций. Задача прекрасно решается средствами &lt;a href="http://www.altlinux.org/LTSP"&gt;ALTSP&lt;/a&gt;, однако есть одна проблема - очень уж неудобно держать на одном хосте офис, почтовый сервер, прокси-сервер и т.д. Решение - &lt;a href="http://ru.wikipedia.org/wiki/OpenVZ"&gt;OpenVZ&lt;/a&gt;, возможно, с размазыванием функциональности ALTSP по разным VE.&lt;br /&gt;&lt;br /&gt;Первый вопрос, на который следует ответить: будем ли мы использовать venet, veth или вообще проброс физических интерфейсов в VE. Первый вариант, конечно, &lt;a href="http://wiki.openvz.org/Differences_between_venet_and_veth"&gt;bit faster and more efficient&lt;/a&gt;, но не умеет броадкастов, а потому всю инфраструктуру, необходимую для загрузки бездисковых клиентов придется разместить в HN. В дальнейшем предполагаем, что используется &lt;a href="http://admdev.blogspot.com/2008/11/openvz-alt-linux-lite-40.html"&gt;OpenVZ в ALT Linux Lite 4.0&lt;/a&gt; c виртуальной сетью 192.168.0.0/24 и физической сетью 192.168.1.0/24 - в последней и будут размещены бездисковые клиенты.&lt;br /&gt;&lt;br /&gt;Настраиваем загрузку клиентов по TFTP:&lt;br /&gt;&lt;pre&gt;# apt-get install dnsmasq&lt;br /&gt;&lt;br /&gt;# chkconfig dnsmasq on&lt;br /&gt;&lt;br /&gt;# cat /dev/null &amp;gt; /etc/sysconfig/dnsmasq&lt;br /&gt;&lt;br /&gt;# cat &amp;gt; /etc/dnsmasq.conf &amp;lt;&amp;lt;END&lt;br /&gt;bind-interfaces&lt;br /&gt;interface=lo&lt;br /&gt;interface=lan&lt;br /&gt;resolv-file=/etc/resolv.conf.dnsmasq&lt;br /&gt;strict-order&lt;br /&gt;expand-hosts&lt;br /&gt;domain=local&lt;br /&gt;dhcp-range=192.168.1.10,192.168.1.50&lt;br /&gt;enable-tftp&lt;br /&gt;tftp-root=/diskless/altsp/boot/i586&lt;br /&gt;dhcp-boot=pxelinux.0&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;# cat &amp;gt; /etc/resolv.conf.dnsmasq &amp;lt;&amp;lt;END&lt;br /&gt;nameserver ${NAMESERVER}&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;# cat &amp;gt; /etc/resolv.conf &amp;lt;&amp;lt;END&lt;br /&gt;nameserver 127.0.0.1&lt;br /&gt;search local&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;# mkdir -p /diskless/altsp/boot/i586/pxelinux.cfg&lt;br /&gt;&lt;br /&gt;# cat &amp;gt; /diskless/altsp/boot/i586/pxelinux.cfg/default &amp;lt;&amp;lt;END&lt;br /&gt;DEFAULT vmlinuz ro initrd=initrd.img root=/dev/nfs nfsroot=/diskless/altsp/root/i586,udp ip=dhcp&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;# service dnsmasq start&lt;br /&gt;&lt;/pre&gt;В /diskless/altsp/boot/i586 нужно положить &lt;a href="http://enp.itx.ru/linux/alt/4.0/altsp/boot-i586.tar.bz2"&gt;vmlinuz, initrd.img и pxelinux.0&lt;/a&gt; из уже существующей инсталляции ALTSP (см. каталог /var/lib/tftpboot/ltsp/i586/) - увы, автономного инструмента для сборки пока нет :(&lt;br /&gt;&lt;br /&gt;Уже на этом этапе загрузка бездисковых клиентов начнется, но остановится на монтировании корневой файловой системы. Настроим раздачу корня по NFS:&lt;br /&gt;&lt;pre&gt;# apt-get install unfs3&lt;br /&gt;&lt;br /&gt;# chkconfig nfs on&lt;br /&gt;# chkconfig portmap on&lt;br /&gt;&lt;br /&gt;# cat &amp;gt; /etc/exports &amp;lt;&amp;lt;END&lt;br /&gt;/diskless/altsp/root/i586 (ro,no_root_squash)&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;# service portmap start&lt;br /&gt;# service nfs start&lt;br /&gt;&lt;/pre&gt;В /diskless/altsp/root/i586 тоже нужно положить каталог &lt;a href="http://enp.itx.ru/linux/alt/4.0/altsp/root-i586.tar.bz2"&gt;/var/lib/ltsp/i586&lt;/a&gt; из существующей инсталляции ALTSP.&lt;br /&gt;&lt;br /&gt;Также включим поддержку сетевого свопа на случай непредвиденного расхода памяти на клиентах:&lt;br /&gt;&lt;pre&gt;# apt-get install ltspswapd&lt;br /&gt;# chkconfig ltspswapd on&lt;br /&gt;# service ltspswapd start&lt;br /&gt;&lt;/pre&gt;Теперь бездисковые клиенты смогут полностью загрузиться и обратиться по XDMCP к тому же серверу, с которого загрузились, но безуспешно: никакого XDMCP там нет и не предполагается. Сначала укажем адрес сервера XDMCP:&lt;br /&gt;&lt;pre&gt;# cat &amp;gt;&amp;gt; /diskless/altsp/root/i586/etc/lts.conf &amp;lt;&amp;lt;END&lt;br /&gt;XDM_SERVER=192.168.0.101&lt;br /&gt;END&lt;/pre&gt;Затем создадим соответствующий виртуальный сервер с помощью скрипта-обертки, описанного &lt;a href="http://admdev.blogspot.com/2008/11/openvz-alt-linux-lite-40.html"&gt;ранее&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;# create-ve.sh 101 desktop 4.1 i586&lt;/pre&gt;Установим в него все необходимое:&lt;br /&gt;&lt;pre&gt;# vzctl start desktop&lt;br /&gt;# vzctl enter desktop&lt;br /&gt;&lt;br /&gt;# cat &amp;gt; /etc/sysconfig/i18n &amp;lt;&amp;lt;END&lt;br /&gt;LANG=ru_RU.UTF-8&lt;br /&gt;SUPPORTED=ru_RU&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;# cat &amp;gt; /etc/X11/xinit/Xkbmap &amp;lt;&amp;lt;END&lt;br /&gt;-layout us,ru&lt;br /&gt;-option grp:ctrl_shift_toggle&lt;br /&gt;-variant ,winkeys&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;# apt-get install gdm gdm-theme-altlinux xfce4-minimal xfce-mcs-plugins xfce-settings-simple icon-theme-hicolor xterm Thunar leafpad firefox-ru fonts-ttf-ms&lt;br /&gt;&lt;br /&gt;# subst 's/happygnome-list/altlinux/' /etc/X11/gdm/custom.conf&lt;br /&gt;# subst 's/Greeter/RemoteGreeter/' /etc/X11/gdm/custom.conf&lt;br /&gt;# subst '/\[greeter\]/aGraphicalThemedColor=#90a8ca' /etc/X11/gdm/custom.conf&lt;br /&gt;# subst '/\[xdmcp\]/aEnable=true' /etc/X11/gdm/custom.conf&lt;br /&gt;# subst 's/id:3:initdefault:/id:5:initdefault:/' /etc/inittab&lt;br /&gt;&lt;br /&gt;# exit&lt;br /&gt;&lt;br /&gt;# vzctl restart desktop&lt;/pre&gt;И вот теперь бездисковые рабочие станции должны загрузиться и показать приглашение GDM.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-3506031450136108199?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/3506031450136108199/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=3506031450136108199' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/3506031450136108199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/3506031450136108199'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/11/altsp-inside-openvz-ve.html' title='ALTSP inside OpenVZ VE'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-5696700721171827900</id><published>2008-11-24T17:48:00.038+02:00</published><updated>2010-04-19T09:58:00.196+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ovz'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>OpenVZ в ALT Linux Lite 4.0</title><content type='html'>Так сложилось, что даже для инсталляций с &lt;a href="http://ru.wikipedia.org/wiki/OpenVZ"&gt;OpenVZ&lt;/a&gt; мне удобнее использовать &lt;a href="http://admdev.blogspot.com/2008/08/alt-linux-40-server-lite.html"&gt;ALT Linux 4.0 Server Lite&lt;/a&gt; (как раз сегодня пересобрал все iso на свежей пакетной базе &lt;a href="ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/4.0/branch"&gt;branch/4.0&lt;/a&gt;) вместо официального &lt;a href="http://altlinux.ru/enterprise/alt_linux_4.0_server.html"&gt;ALT Linux 4.0 Server&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Для запуска OpenVZ необходимо и достаточно сказать:&lt;br /&gt;&lt;pre&gt;# apt-get install kernel-image-ovz-smp vzctl&lt;/pre&gt;После перезагрузки с новым ядром можно создавать виртуальные машины (VE) следующим простым скриптом-оберткой:&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;# проверяем параметры&lt;br /&gt;if [ -z "$4" ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;echo "Usage : $0 \$VEID \$NAME \$BRANCH \$ARCH"&lt;br /&gt;&amp;nbsp;&amp;nbsp;exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;# определяем переменные&lt;br /&gt;VE_NAMESERVER="192.168.1.1"&lt;br /&gt;VE_DOMAIN="local"&lt;br /&gt;VE_NET="192.168.0."&lt;br /&gt;VE_REPO="/repo"&lt;br /&gt;HN_REPO="/lvm/distrib/free/linux/alt"&lt;br /&gt;&lt;br /&gt;# создаем VE&lt;br /&gt;vzctl create $1 --ostemplate altlinux-$3-$4&lt;br /&gt;&lt;br /&gt;# задаем дефолтные значения для VE&lt;br /&gt;vzctl set $1 --name $2 --ipadd $VE_NET$1 --hostname $2.$VE_DOMAIN \&lt;br /&gt;&amp;nbsp;&amp;nbsp;--nameserver $VE_NAMESERVER --searchdomain $VE_DOMAIN --onboot yes --save&lt;br /&gt;&lt;br /&gt;# создаем каталог с репозитарием внутри VE&lt;br /&gt;mkdir /var/lib/vz/private/$1/repo&lt;br /&gt;&lt;br /&gt;# создаем скрипт, который будет монтировать репозитарий из HN&lt;br /&gt;cat &amp;gt; /etc/vz/conf/$1.mount &amp;lt;&amp;lt;END&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;. /etc/vz/vz.conf&lt;br /&gt;&lt;br /&gt;mount -n -o bind $HN_REPO/$3 \$VE_ROOT/repo&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;# делаем скрипт исполняемым&lt;br /&gt;chmod 700 /etc/vz/conf/$1.mount&lt;br /&gt;&lt;br /&gt;# настроиваем apt&lt;br /&gt;cat &amp;gt; /var/lib/vz/private/$1/etc/apt/sources.list &amp;lt;&amp;lt;END&lt;br /&gt;rpm file:///repo/branch/ $4 classic&lt;br /&gt;rpm file:///repo/branch/ noarch classic&lt;br /&gt;END&lt;br /&gt;&lt;/pre&gt;Многое здесь прибито гвоздями: например, предполагается, что в /lvm/distrib/free/linux/alt находятся копии &lt;a href="ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/4.0/branch"&gt;branch/4.0&lt;/a&gt; и &lt;a href="ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/4.1/branch"&gt;branch/4.1&lt;/a&gt;, а в /var/lib/vz/template/cache/ - собранные из бранчей с помощью &lt;a href="http://www.altlinux.org/Hasher"&gt;Hasher&lt;/a&gt; шаблоны VE:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.0/ve/altlinux-4.0-i586.tar.gz"&gt;altlinux-4.0-i586.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.0/ve/altlinux-4.0-x86_64.tar.gz"&gt;altlinux-4.0-x86_64.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.1/ve/altlinux-4.1-i586.tar.gz"&gt;altlinux-4.1-i586.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.1/ve/altlinux-4.1-x86_64.tar.gz"&gt;altlinux-4.1-x86_64.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В шаблонах находятся basesystem, apt, sysklogd, etcnet, glibc-nss, glibc-locales, netlist, passwd, su, openssh-server, vim-console, mc, less, man и все, что было вытянуто по зависимостям.&lt;br /&gt;&lt;br /&gt;Предполагается, что свежесозданные VE будут запущены с помощью vzctl start и первоначально настроены с помощью vzctl enter (т.е. будут созданы необходимые пользователи и пароли/ключи) - далее с ними можно будет работать обычным образом по ssh, сверяясь по мере надобности с &lt;a href="http://www.altlinux.org/OpenVZ"&gt;полезными советами&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Впрочем, все это локальные хаки. Планов по опакечиванию нет, т.к. &lt;a href="http://sisyphus.ru/packager/aspsk/"&gt;Anton Protopopov&lt;/a&gt; потихоньку делает &lt;a href="http://git.altlinux.org/people/aspsk/packages/mkve.git"&gt;mkve&lt;/a&gt; - гораздо более продвинутый инструмент аналогичного назначения, которым также будет пользоваться &lt;a href="http://www.altlinux.org/Alterator"&gt;Alterator&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-5696700721171827900?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/5696700721171827900/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=5696700721171827900' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5696700721171827900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/5696700721171827900'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/11/openvz-alt-linux-lite-40.html' title='OpenVZ в ALT Linux Lite 4.0'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-6937385814863174254</id><published>2008-09-17T19:28:00.022+03:00</published><updated>2010-04-19T10:01:28.268+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='connexion'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Userspace routing policy</title><content type='html'>Задача: построить маршрутизатор, который пропускал бы хосты в некоторую сеть (например, в интернет) на основании т.н. "билетов". В билете указывается максимальный объем входящего трафика, по исчерпании которого билет изымается и доступ запрещается, однако на тот же хост через некоторое время можно выписать новый билет.&lt;br /&gt;&lt;br /&gt;Я не сомневаюсь в том, что эту задачу можно решить средствами готовых биллинговых систем - из свободных первым в голову приходит &lt;a href="http://netams.com/"&gt;NeTAMS&lt;/a&gt;. Но слишком уж все они монсторобразны для такой простой задачи. Попробуем решить ее на коленке с помощью  &lt;a href="http://www.radlinux.org/docs/static/ru/connexion.html"&gt;connexion&lt;/a&gt; по мотивам &lt;a href="http://lists.altlinux.org/pipermail/sysadmins/2007-November/012703.html"&gt;следующего примера&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Устанавливаем все необходимое:&lt;br /&gt;&lt;pre&gt;# apt-get install python-module-cxnet python-module-MySQLdb MySQL-server&lt;br /&gt;# service mysqld start&lt;/pre&gt;Создаем базу данных и таблицу, в которой будем хранить билеты, выписываем первый билет:&lt;br /&gt;&lt;pre&gt;$ mysql -u root&lt;br /&gt;...&lt;br /&gt;mysql&gt; create database cx;&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;mysql&gt; use cx;&lt;br /&gt;Database changed&lt;br /&gt;mysql&gt; create table tickets (&lt;br /&gt;-&gt;         id        serial,&lt;br /&gt;-&gt;         host      varchar(50),&lt;br /&gt;-&gt;         bytes     bigint,&lt;br /&gt;-&gt;         max_bytes bigint,&lt;br /&gt;-&gt;         enabled   boolean&lt;br /&gt;-&gt; );&lt;br /&gt;Query OK, 0 rows affected (0.01 sec)&lt;br /&gt;mysql&gt; insert into tickets(host, bytes, max_bytes, enabled) values ('192.168.100.103', 0, 100, true);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;mysql&gt; select * from tickets;&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;| id |&amp;nbsp;host&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| bytes | max_bytes | enabled |&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;|&amp;nbsp; 1 | 192.168.100.103 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 |&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;Входящие пакеты для хоста 192.168.100.103 завернем в userspace следующим образом:&lt;br /&gt;&lt;pre&gt;# modprobe ip_queue&lt;br /&gt;# iptables -A FORWARD -p icmp -d 192.168.100.103 -j QUEUE&lt;br /&gt;&lt;/pre&gt;А обрабатывать эти пакеты и решать, пропустить или нет, мы будем следующей программой, использующей один из компонентов connexion - библиотеку cxnet:&lt;br /&gt;&lt;pre&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;from cxnet.netlink.ipq import *&lt;br /&gt;from cxnet.ip4 import *&lt;br /&gt;from cxnet.utils import *&lt;br /&gt;import MySQLdb&lt;br /&gt;&lt;br /&gt;db = MySQLdb.connect(host="localhost", user="root", passwd="", db="cx")&lt;br /&gt;cursor = db.cursor()&lt;br /&gt;&lt;br /&gt;ipqs = ipq_socket()&lt;br /&gt;&lt;br /&gt;while True:&lt;br /&gt;&amp;nbsp;&amp;nbsp;(l,msg) = ipqs.recv()&lt;br /&gt;&amp;nbsp;&amp;nbsp;header = iphdr.from_address(addressof(msg.data.payload))&lt;br /&gt;&amp;nbsp;&amp;nbsp;if header.daddr&gt;0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;host = int_to_dqn(header.daddr)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size = header.tot_len&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "packet: %s:%s" % (host,size)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute("update tickets set bytes = bytes+%s where enabled = true and host = %s", (size, host))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute("update tickets set enabled = false where enabled = true and bytes &gt;= max_bytes")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cursor.execute("select count(*) from tickets where enabled = true and host = %s", host)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for record in cursor.fetchall():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print "count: %s" % record[0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if record[0] &gt; 0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ipqs.verdict(msg.data.packet_id, NF_ACCEPT)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ipqs.verdict(msg.data.packet_id, NF_DROP)&lt;br /&gt;&lt;/pre&gt;Теперь отправляем первый пинг с хоста 192.168.100.103 наружу:&lt;br /&gt;&lt;pre&gt;$ ping -c 1 192.168.1.1&lt;br /&gt;PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.&lt;br /&gt;64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.12 ms&lt;br /&gt;&lt;br /&gt;--- 192.168.1.1 ping statistics ---&lt;br /&gt;1 packets transmitted, 1 received, 0% packet loss, time 0ms&lt;br /&gt;rtt min/avg/max/mdev = 1.121/1.121/1.121/0.000 ms&lt;br /&gt;&lt;/pre&gt;При этом билет изменится следующим образом:&lt;br /&gt;&lt;pre&gt;mysql&gt; select * from tickets;&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;| id |&amp;nbsp;host&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| bytes | max_bytes | enabled |&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;|&amp;nbsp; 1 | 192.168.100.103 |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;84&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 |&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;Отправим следующий пинг:&lt;br /&gt;&lt;pre&gt;$ ping -c 1 192.168.1.1&lt;br /&gt;PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.&lt;br /&gt;&lt;br /&gt;--- 192.168.1.1 ping statistics ---&lt;br /&gt;1 packets transmitted, 0 received, 100% packet loss, time 0ms&lt;br /&gt;&lt;/pre&gt;При этом билет будет заблокирован, поскольку число принятых байт превысило лимит:&lt;br /&gt;&lt;pre&gt;mysql&gt; select * from tickets;&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;| id |&amp;nbsp;host&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| bytes | max_bytes | enabled |&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;|&amp;nbsp; 1 | 192.168.100.103 |&amp;nbsp;&amp;nbsp;&amp;nbsp;168&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0 |&lt;br /&gt;+----+-----------------+-------+-----------+---------+&lt;br /&gt;&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;Работает! Правда, тормозить должно жутко, ибо задавать кучу вопросов СУБД (пусть даже и MySQL с дефолтным хранилищем MyISAM, которое и транзакций-то не умеет) на каждый входящий пакет - удовольствие не дешевое. Но о бенчмарках в следующий раз ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-6937385814863174254?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/6937385814863174254/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=6937385814863174254' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/6937385814863174254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/6937385814863174254'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/09/userspace-routing-policy.html' title='Userspace routing policy'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-1362080485856605131</id><published>2008-09-17T19:04:00.006+03:00</published><updated>2008-11-24T22:27:47.042+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='connexion'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>Новые сборки ALT Linux 4.0 Server Lite</title><content type='html'>Обновлены сборки &lt;a href="http://admdev.blogspot.com/2008/08/alt-linux-40-server-lite.html"&gt;ALT Linux 4.0 Server Lite&lt;/a&gt;. В них добавлен &lt;a href="http://www.radlinux.org/docs/static/ru/connexion.html"&gt;connexion&lt;/a&gt; - пока (и, возможно, навсегда) все же не по дефолту, а в дополнительный репозитарий. Обратите внимание, что опакеченная документация в данный момент актуальнее той, что предлагается на официальном сайте.&lt;br /&gt;&lt;br /&gt;Также сделана специальная сборка без дополнительного репозитария для тех, кому нужен маленький iso. Он получился размером в 184M, можно и еще урезать, выкинув rescue, но мне жалко его выкидывать.&lt;br /&gt;&lt;br /&gt;Итого:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.0/iso/altlinux-server-lite-i586.iso"&gt;для i586&lt;/a&gt;&lt;br /&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.0/iso/altlinux-server-lite-x86_64.iso"&gt;для x86_64&lt;/a&gt;&lt;br /&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.0/iso/altlinux-server-lite-without-repo-i586.iso"&gt;для i586 без дополнительного репозитария&lt;/a&gt;&lt;br /&gt;&lt;a href="http://enp.itx.ru/linux/alt/4.0/iso/altlinux-server-lite-without-repo-x86_64.iso"&gt; для x86_64 без дополнительного репозитария&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-1362080485856605131?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/1362080485856605131/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=1362080485856605131' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/1362080485856605131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/1362080485856605131'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/09/alt-linux-40-server-lite.html' title='Новые сборки ALT Linux 4.0 Server Lite'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-7370925542409060649</id><published>2008-08-27T12:10:00.043+03:00</published><updated>2008-08-29T10:06:05.499+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jee'/><title type='text'>Lightweight JEE</title><content type='html'>Расскажу о том, каким образом я разрабатываю на Java серверные приложения, у которых, как правило, несложный web-интерфейс и довольно замороченная внутренняя логика, в основном из-за необходимости общаться с внешними, иногда довольно "странными" системами (отрасль - телеком, если это кому-то что-то скажет ;) ). Число активных разработчиков от 1 до 2 :) - таким образом, с одной стороны, можно представить себе масштабы проектов, а с другой стороны - разрушить миф о том, что "для разработки на Java нужно много индусов".&lt;br /&gt;&lt;br /&gt;Разумеется, я не использую тяжелые сервера приложений вроде &lt;a href="http://www.jboss.org/"&gt;JBoss&lt;/a&gt; и тем более &lt;a href="http://www.ibm.com/software/websphere/"&gt;WebSphere&lt;/a&gt; или &lt;a href="http://www.bea.com/framework.jsp?CNT=index.htm&amp;amp;FP=/content/products/weblogic"&gt;WebLogic&lt;/a&gt;. Более того, я не использую &lt;a href="http://tomcat.apache.org/"&gt;Tomcat&lt;/a&gt;. В моем случае каждое приложение живет в отдельной &lt;a href="http://ru.wikipedia.org/wiki/Java_Virtual_Machine"&gt;JVM&lt;/a&gt; - примерно так же как &lt;a href="http://www.igniterealtime.org/projects/openfire/index.jsp"&gt;OpenFire&lt;/a&gt; или &lt;a href="http://www.xwiki.org/"&gt;XWiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Исходный код минимального приложения, которое ничего не делает, а просто пишет в лог сообщения о запуске и о завершении работы, можно взять &lt;a href="http://enp.itx.ru/java/examples/ServiceApp.zip"&gt;здесь&lt;/a&gt;. Все необходимые для работы приложения библиотеки включены в проект и находятся в каталоге lib, рядом в каталоге lib-build также находятся библиотеки для сборки проекта - у вас должен быть установлен только &lt;a href="http://ru.wikipedia.org/wiki/Java_Development_Kit"&gt;JDK&lt;/a&gt;. В результате сборки получается архив, в который все включено - для запуска приложения вам потребуется только &lt;a href="http://ru.wikipedia.org/wiki/JRE"&gt;JRE&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Для тех, кому грустно тащить лишние мегабайты jar-ов, на &lt;a href="http://enp.itx.ru/java/examples/"&gt;http://enp.itx.ru/java/examples/&lt;/a&gt; рядом с каждым *App.zip лежит *App.NoLib.zip.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F"&gt;IDE&lt;/a&gt; для работы в принципе не обязательна, однако без нее навигация по коду будет сильно затрудена. Можно использовать любую IDE с поддержкой &lt;a href="http://ru.wikipedia.org/wiki/Java"&gt;Java&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt; и &lt;a href="http://ru.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt; - я использую &lt;a class="packageTitle" href="http://www.eclipse.org/downloads"&gt;Eclipse IDE for Java EE Developers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Для сборки приложения используется &lt;a href="http://ru.wikipedia.org/wiki/Apache_Ant"&gt;Ant&lt;/a&gt;, который читает инструкции из файла build.xml. На UNIX сборка запускается с помощью build.sh, на Windows - с помощью build.bat - эти файлы можно переносить из одного проекта в другой без изменений. По умолчанию при сборке выполняется цель all, которая последовательно выполняет цели clean,prepare,compile,jar,dist. Цель можно указать явно как параметр в командной строке. Можно также увидеть список целей с помощью ключа -p.&lt;br /&gt;&lt;br /&gt;При сборке генерируются стартовые скрипты statup.sh для запуска на UNIX и statup.bat для запуска на Windows, а также инит-скрипт в стиле &lt;a href="http://ru.wikipedia.org/wiki/UNIX_System_V"&gt;SysV&lt;/a&gt; для работы приложения в качестве юниксового демона. Для генерации написан специальный ant task - его исходный код &lt;a href="http://enp.itx.ru/java/examples/AntTasks.zip"&gt;здесь&lt;/a&gt;. Исходные данные для генерации (краткое и полное имя приложения, имя главного класса) берутся из build.xml.&lt;br /&gt;&lt;br /&gt;Главный и единственный класс приложения - startup.ServiceApp. Он имеет стандартную точку входа для запуска в качестве обычного java-приложения - метод main, а кроме этого реализует интерфейс org.apache.commons.daemon.Daemon из библиотеки &lt;a href="http://commons.apache.org/daemon/index.html"&gt;Jakarta Commons Daemon&lt;/a&gt; - и таким образом может быть запущен в качестве сервиса UNIX System V с помощью &lt;a href="http://commons.apache.org/daemon/jsvc.html"&gt;jsvc&lt;/a&gt; и в качестве сервиса Windows c помощью &lt;a href="http://commons.apache.org/daemon/procrun.html"&gt;procrun&lt;/a&gt;. Для реализации первой возможности и используется автоматически генерируемый при сборке инит-скрипт, который предполагает наличие установленного jsvc (в репозитариях ALT Linux эта утилита находится в одноменном пакете).&lt;br /&gt;&lt;br /&gt;Для протоколирования используются библиотеки &lt;a href="http://commons.apache.org/logging/"&gt;Commons Logging&lt;/a&gt; в качестве фасада и &lt;a href="http://logging.apache.org/log4j/1.2/index.html"&gt;Log4j&lt;/a&gt; в качестве реализации.&lt;br /&gt;&lt;br /&gt;Пока что все описанное сильно напоминает подъем солнца вручную. Т.е. можно, конечно, на этом остановиться и писать прикладную логику в виде java-классов без задействования всех преимуществ enterprise-технологий. Более того, новичкам я бы даже рекомендовал какое-то время воздержаться от их использования. Например, мы хотим, чтобы наше приложение научилось отвечать на http-запросы. Для этого мы просто задействуем &lt;a href="http://marxsoftware.blogspot.com/2008/03/suns-java-http-server.html"&gt;встроенный в Java 1.6 http-сервер&lt;/a&gt; - исходный код нового приложения можно взять &lt;a href="http://enp.itx.ru/java/examples/WebApp.zip"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;А вот теперь, после некоторой передышки, давайте задействуем &lt;a href="http://www.springframework.org/"&gt;Spring Framework&lt;/a&gt;. Если честно, я затрудняюсь объяснить в двух словах, зачем он нужен. Он умеет слишком много, но все use cases можно условно свести к двум случаям:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;упрощение взаимодействия модулей системы друг с другом с помощью таких техник, как &lt;a href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F"&gt;IoC&lt;/a&gt; и &lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D1%81%D0%BF%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"&gt;AOP&lt;/a&gt; и перенос взаимодействия в рантайм для повышения гибкости&lt;/li&gt;&lt;li&gt;упрощение работы с &lt;a href="http://ru.wikipedia.org/wiki/Java_Database_Connectivity"&gt;JDBC&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/ORM"&gt;ORM&lt;/a&gt;, &lt;a href="http://antonsaburov.narod.ru/articles/jmx.html"&gt;JMX&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/JMS"&gt;JMS&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%B1-%D1%81%D0%BB%D1%83%D0%B6%D0%B1%D0%B0"&gt;Web Services&lt;/a&gt; и прочими полезными технологиями&lt;/li&gt;&lt;/ul&gt;Исходный код простого приложения, использующего Spring, можно взять &lt;a href="http://enp.itx.ru/java/examples/SpringApp.zip"&gt;здесь&lt;/a&gt;. Главный класс startup.SpringApp инициализирует &lt;span style="font-style: italic; font-weight: bold;"&gt;контекст&lt;/span&gt; на основании файла context.xml или других файлов, указанных в командной строке при запуске приложения, и закрывает его при завершении работы приложения. &lt;span style="font-style: italic; font-weight: bold;"&gt;Контекст&lt;/span&gt; - это и есть описание модулей (&lt;a href="http://ru.wikipedia.org/wiki/JavaBeans"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;бинов&lt;/span&gt;&lt;/a&gt;) в формате xml. В нашем случае будут инициализированы бины fakeBookLoader и xmlInputStreamBookLoader, реализующие интерфейс beans.BookLoader (т.е. умеющие каким-либо способом загружать экземпляры класса beans.Book), и главный бин bookManager. Последний при инициализации получит ссылки на экземпляры beans.BookLoader, а после инициализации Spring вызовет его метод displayBooks. Подробности в &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/index.html"&gt;документации Spring&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Теперь усложним приложение по двум направлениям:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;реализуем извлечение экземпляров класса beans.Book из реляционной БД - исходный код приложения берем &lt;a href="http://enp.itx.ru/java/examples/SpringJpaApp.zip"&gt;здесь&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;реализуем web-интерфейс к фунциональности бина bookManager - а это берем &lt;a href="http://enp.itx.ru/java/examples/SpringWebApp.zip"&gt;здесь&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Первый пример использует 3 способа работы работы с СУБД (и, соответственно, 3 реализации beans.BookLoader, используемые бином bookManager):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/jdbc.html"&gt;JDBC&lt;/a&gt; без управления транзакциями (каждая операция выполняется в отдельной транзакции) - для этого в контексте определены бины dataSource (параметры подключения вынесены в отдельный файл db.properties, т.к. они же используются еще и в build.xml для  создания таблиц в БД) и jdbcBookLoader&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/orm.html#orm-jpa"&gt;JPA&lt;/a&gt; (стандарт &lt;a href="http://ru.wikipedia.org/wiki/ORM"&gt;ORM&lt;/a&gt; для Java) с ручным управлением транзакциями - для этого определены бины entityManagerFactory (&lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%B0%D1%8F_%D1%84%D0%B0%D0%B1%D1%80%D0%B8%D0%BA%D0%B0_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29"&gt;фабрика&lt;/a&gt; реализаций интерфейса javax.persistence.EntityManager, управляющих сохранением/извлечением объектов в/из БД) и jpaBookLoader&lt;/li&gt;&lt;li&gt;JPA с &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/transaction.html#transaction-declarative"&gt;автоматическим управлением транзакциями&lt;/a&gt; - для этого используются бин transactionManager, специальные тэги &amp;lt;tx:advice&amp;gt;, &amp;lt;aop:config&amp;gt; и &amp;lt;context:annotation-config&amp;gt;, а также бин jpaTransactionalBookLoader (для него при вызове каждого метода Spring автоматически создает экземпляр EntityManager, стартует транзакцию и завершает ее после выполненения метода или откатывает в том случае, если при выполнении метода возникло &lt;a href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B9"&gt;исключение&lt;/a&gt;).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Класс beans.Book &lt;a href="http://en.wikipedia.org/wiki/Java_annotation"&gt;аннотирован&lt;/a&gt; для того, чтобы EntityManager знал, каким образом его экземпляры нужно сохранять/извлекать в/из БД. Кроме того, в файле META-INF/persistence.xml описано, какой провайдер JPA и с какими параметрами будет использоваться. В данном случае используется &lt;a href="http://hibernate.org/"&gt;Hibernate&lt;/a&gt;, который помимо стандартного JPA API имеет также собственный API, пример использования можно взять  &lt;a href="http://enp.itx.ru/java/examples/SpringHibernateApp.zip"&gt;здесь&lt;/a&gt;, &lt;a href="http://enp.itx.ru/java/examples/HibernateApp.zip"&gt;рядом&lt;/a&gt; лежит более простой пример использования Hibernate без Spring, а &lt;a href="http://enp.itx.ru/java/examples/DerbyApp.zip"&gt;тут&lt;/a&gt; - пример совсем простого приложения для работы с БД без всяких фреймворков с использованием аналога спрингового уровня абстракции над JDBC - &lt;a href="http://commons.apache.org/dbutils/"&gt;Jakarta Commons DbUtils&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Теперь о приложении с web-интерфейсом для бина bookManager. Как правило, такого рода приложения пакуются в &lt;a href="http://en.wikipedia.org/wiki/WAR_%28Sun_file_format%29"&gt;WAR&lt;/a&gt; и размещаются в одном из &lt;a href="http://en.wikipedia.org/wiki/List_of_Servlet_containers"&gt;сервлет-контейнеров&lt;/a&gt;. В случае использования Spring контекст инициализируется и закрывается &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%80%D0%B2%D0%BB%D0%B5%D1%82"&gt;сервлетом&lt;/a&gt;. Такая схема представляется вполне логичной для web-ориентированных приложений, особенно в том случае, когда в одном контейнере предполагается размещать множество web-приложений.&lt;br /&gt;&lt;br /&gt;В моем случае это не так: web-часть приложения сравнительно небольшая по сравнению с основной логикой, приложение является единственным на хосте, и мне хочется конфигурировать http-сервер в том же контексте, что и все приложение. Чем, в конце концов, мои бины, бины Spring, бины дополнительных библиотек отличаются от бинов http-сервера?&lt;br /&gt;&lt;br /&gt;Если бы мне требовалась загрузка и выгрузка модулей без остановки всего приложения, я, возможно, обратил бы внимание на совсем недавно появившуюся &lt;a href="http://www.springsource.com/products/suite/applicationplatform"&gt;SpringSource Application Platform&lt;/a&gt;, которая использует стандарт &lt;a href="http://ru.wikipedia.org/wiki/OSGi"&gt;OSGi&lt;/a&gt;, однако пока это не нужно, проще описать бины http-сервера прямо в контексте.&lt;br /&gt;&lt;br /&gt;Я не пробовал встраивать Tomcat в контекст Spring, Jetty встраивается без проблем, т.к. его основные классы удовлетворяют спецификации JavaBeans (если бы это и было не так, можно было бы написать небольшую обертку), а для встроенного в Java 1.6 http-сервера такая обертка уже &lt;a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/remoting/support/SimpleHttpServerFactoryBean.html"&gt;есть&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Приложение интенсивно использует технологию &lt;a href="http://ru.wikipedia.org/wiki/AJAX"&gt;AJAX&lt;/a&gt;, которая позволяет отделить клиентскую логику от серверной - взаимодействуют они по протоколу &lt;a href="http://json-rpc.org/"&gt;JSON-RPC&lt;/a&gt;. Существует единственная полная реализация JSON-RPC для Java - &lt;a href="http://jabsorb.org/"&gt;jabsorb&lt;/a&gt;, но она использует в качестве транспорта сервлеты, не реализованные во встроенном в Java 1.6 http-сервере. Существует также              &lt;a href="http://json-lib.sourceforge.net/"&gt;JSON-lib&lt;/a&gt; для сериализации JavaBeans в &lt;a href="http://ru.wikipedia.org/wiki/JSON"&gt;JSON&lt;/a&gt;, транспорта там просто нет, но его можно реализовать по аналогии с описанным &lt;a href="http://www.rsdn.ru/forum/message/2935245.flat.aspx"&gt;здесь&lt;/a&gt; способом.&lt;br /&gt;&lt;br /&gt;Итак, в контексте приложения определен бин httpServer с двумя http-контекстами:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;staticHttpHandler - выдает статические страницы по имени файла&lt;br /&gt;&lt;/li&gt;&lt;li&gt;jsonRpcHttpHandler - отвечает на запросы JSON-RPC к бинам, перечисленным в свойстве services&lt;/li&gt;&lt;/ul&gt;Клиентов целых два: один использует для отрисовки данных стандартные теги html, другой использует библиотеку виджетов &lt;a href="http://extjs.com/products/extjs/"&gt;ExtJS&lt;/a&gt;. Для формирования запросов JSON-RPC оба используют реализацию от jabsorb.&lt;br /&gt;&lt;br /&gt;Ну и наконец итоговое приложение &lt;a href="http://enp.itx.ru/java/examples/BookManager.zip"&gt;BookManager&lt;/a&gt; - в нем объединены возможности двух предыдущих: книги сохраняются в БД и извлекаются оттуда, класс tools.JsonRpcHttpHandler переписан и поддерживает &lt;a href="http://en.wikipedia.org/wiki/Basic_access_authentication"&gt;базовую http-авторизацию&lt;/a&gt;, которая может быть использована двумя способами:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;для ограничения доступа определенных групп пользователей к сервисам&lt;/li&gt;&lt;li&gt;для получения методом сервиса информации о пользователе, который его вызвал&lt;/li&gt;&lt;/ul&gt;На этом все. Некоторые релевантные обсуждения, долго сподвигавшие и таки сподвигнувшие меня написать этот текст, можно найти здесь (там же жалкие попытки оправдать включение библиотек в состав проекта, более настойчивые попытки объяснить, зачем нужен Spring, а также некоторые уже неактуальные вещи вроде Jetty, вместо которого я сейчас использую  встроенный в Java 1.6 http-сервер):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://lists.altlinux.org/pipermail/smoke-room/2006-October/030518.html"&gt;http://lists.altlinux.org/pipermail/smoke-room/2006-October/030518.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lists.altlinux.org/pipermail/smoke-room/2007-February/031431.html"&gt;http://lists.altlinux.org/pipermail/smoke-room/2007-February/031431.html&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://lists.altlinux.org/pipermail/smoke-room/2007-February/031431.html"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-7370925542409060649?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/7370925542409060649/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=7370925542409060649' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/7370925542409060649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/7370925542409060649'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/08/lightweight-jee.html' title='Lightweight JEE'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-1299109371210166338</id><published>2008-08-27T10:18:00.010+03:00</published><updated>2010-04-19T10:05:41.729+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='callweaver'/><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='fax'/><title type='text'>Fax/SMTP gateway для CallWeaver</title><content type='html'>Задача: отправить факс путем отправки письма с вложенным ps/pdf/tif, принять факс в виде почтового сообщения с вложением. Инструменты -  &lt;a href="http://ru.wikipedia.org/wiki/CallWeaver"&gt;CallWeaver&lt;/a&gt; и  какой-то враппер для ОGI и Manager API на &lt;a href="http://ru.wikipedia.org/wiki/Python"&gt;Python&lt;/a&gt;, который я вовремя не опакетил, таская с собой, а теперь уж и забыл, откуда взял (да, я понимаю, что я неправ, но вот только сейчас руки дошли хотя бы до публикации решения). Архив со скриптами можно взять &lt;a href="http://enp.itx.ru/python/examples/fax-smtp.tar.bz2"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Работает оно следующим образом. От локального отправителя письмо с вложением получает &lt;a href="http://en.wikipedia.org/wiki/Mail_transfer_agent"&gt;MTA&lt;/a&gt; и передает его на stdin скрипту fax-send.py. Скрипт делает из файла tiff и с помощью Originate коммутирует вызываемого внешнего абонента (контекст [call-fax-send], если не дозвонились, вызывается fail-fax.py) и факс(контекст [fax-send], о результате прохождения факса отправителю сообщает check-fax.py). Параметры передаются через Variable.&lt;br /&gt;&lt;br /&gt;Упомянутые контексты описаны так:&lt;br /&gt;&lt;pre&gt;[call-fax-send]&lt;br /&gt;exten =&gt; 0,1,NoOp(Calling ${RECIPIENT} for sending fax)&lt;br /&gt;exten =&gt; 0,2,Dial(SIP/${RECIPIENT}@${PEER},25)&lt;br /&gt;exten =&gt; 0,3,NoOp(${DIALSTATUS})&lt;br /&gt;exten =&gt; 0,4,DeadOGI(fail-fax.py)&lt;br /&gt;&lt;br /&gt;[fax-send]&lt;br /&gt;exten =&gt; 0,1,NoOp(Sending file ${FILE} as fax from ${SENDER} to ${RECIPIENT}@${PEER} with NOTIFY=${NOTIFY})&lt;br /&gt;exten =&gt; 0,2,GotoIf($[${NOTIFY}=Yes]?3:6)&lt;br /&gt;exten =&gt; 0,3,Playback(fax)&lt;br /&gt;exten =&gt; 0,4,Playback(beep)&lt;br /&gt;exten =&gt; 0,5,Wait(2)&lt;br /&gt;exten =&gt; 0,6,Set(LOCALSTATIONID=CallWeaver)&lt;br /&gt;exten =&gt; 0,7,Set(LOCALHEADERINFO=CallWeaver Fax)&lt;br /&gt;exten =&gt; 0,8,TxFAX(${FILE})&lt;br /&gt;exten =&gt; h,1,NoOp(RX: REMOTESTATIONID is ${REMOTESTATIONID})&lt;br /&gt;exten =&gt; h,2,NoOp(RX: PHASEESTATUS is ${PHASEESTATUS})&lt;br /&gt;exten =&gt; h,3,NoOp(RX: PHASEESTRING is ${PHASEESTRING})&lt;br /&gt;exten =&gt; h,4,DeadOGI(check-fax.py)&lt;/pre&gt;Локальный же получатель факсов переадресует внешнего отправителя в контекст [fax-receive], там получившийся файл подбирает read-fax.py, он же сообщает о неудаче.&lt;br /&gt;&lt;br /&gt;Контекст для приема факсов:&lt;br /&gt;&lt;pre&gt;[fax-receive]&lt;br /&gt;exten =&gt; _0.,1,Set(SENDER=${CALLERID(num)})&lt;br /&gt;exten =&gt; _0.,2,Set(RECIPIENT=${EXTEN:1})&lt;br /&gt;exten =&gt; _0.,3,Set(LOCALSTATIONID=Vertol EXPO)&lt;br /&gt;exten =&gt; _0.,4,Set(LOCALHEADERINFO=Vertol EXPO Fax)&lt;br /&gt;exten =&gt; _0.,5,Set(FILE=/data/callweaver/fax-receive/${UNIQUEID}.tif)&lt;br /&gt;exten =&gt; _0.,6,RxFAX(${FILE})&lt;br /&gt;exten =&gt; h,1,NoOp(RX: REMOTESTATIONID is ${REMOTESTATIONID})&lt;br /&gt;exten =&gt; h,2,NoOp(RX: PHASEESTATUS is ${PHASEESTATUS})&lt;br /&gt;exten =&gt; h,3,NoOp(RX: PHASEESTRING is ${PHASEESTRING})&lt;br /&gt;exten =&gt; h,4,DeadOGI(read-fax.py)&lt;/pre&gt;Отлов исключений сделан только там, где без него совсем грустно (например, MTA лучше не знать, что внутри fax-send.py приключилось что-то нехорошее). В OGI невозможность удалить файл, например, ни к чему плохому не приводит.&lt;br /&gt;&lt;br /&gt;Да, о поддержке факсов в CallWeaver читать &lt;a href="http://www.callweaver.org/wiki/Faxing+With+CallWeaver"&gt;здесь&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-1299109371210166338?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/1299109371210166338/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=1299109371210166338' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/1299109371210166338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/1299109371210166338'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/08/faxsmtp-gateway-callweaver.html' title='Fax/SMTP gateway для CallWeaver'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-4991536290803639217</id><published>2008-08-27T08:44:00.022+03:00</published><updated>2010-04-19T10:13:24.046+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='callweaver'/><category scheme='http://www.blogger.com/atom/ns#' term='voip'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>CallWeaver из коробки</title><content type='html'>В дополнение к предыдущему сообщению хочу добавить, что &lt;a href="http://admdev.blogspot.com/2008/08/alt-linux-40-server-lite.html"&gt;ALT Linux 4.0 Server Lite&lt;/a&gt; - один из немногих дистрибутивов, в которых &lt;a href="http://ru.wikipedia.org/wiki/CallWeaver"&gt;CallWeaver&lt;/a&gt; работает практически из коробки и не слишком устарел (ну а если вдруг, то я его майнтейнер :) ). После установки достаточно, не вынимая установочного диска, сказать:&lt;br /&gt;&lt;pre&gt;# apt-get install callweaver callweaver-sounds freemusic-signate&lt;/pre&gt;и прочесть файл /usr/share/doc/callweaver-1.2/QUICKSTART.ru_RU.UTF-8. Процитирую, пожалуй, его содержимое:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Введение&lt;br /&gt;========&lt;br /&gt;&lt;br /&gt;CallWeaver - это IP PBX, форк проекта Asterisk, причинами создания которого послужили &lt;br /&gt;организационные (зависимость от компании Digium, двойное лицензирование) и технические &lt;br /&gt;(зависимость от zaptel, отсутствие поддержки T.38 и т.д.) проблемы последнего. Подробнее - &lt;br /&gt;http://www.callweaver.org/wiki/CallWeaver&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Описание конфигурации по умолчанию&lt;br /&gt;==================================&lt;br /&gt;&lt;br /&gt;CallWeaver реализован в виде загрузчика с минимальной функциональностью и набора модулей &lt;br /&gt;расположенных в каталоге /usr/lib/callweaver/modules, которые необходимо описать в файле &lt;br /&gt;modules.conf. В этом файле отключена автозагрузка модулей, а вместо этого явно указаны &lt;br /&gt;минимально необходимые модули.&lt;br /&gt;&lt;br /&gt;Загрузка модуля chan_sip для поддержки протокола SIP по умолчанию закомментирована. &lt;br /&gt;При загрузке модуль chan_sip читает файл sip.conf, в котором описаны:&lt;br /&gt;&lt;br /&gt;* общие настройки в секции [general]&lt;br /&gt;* собственные абоненты в секциях [101] и [102]&lt;br /&gt;* выход во внешний мир - параметры подключения к оператору sipnet.ru в секции [sipnet] &lt;br /&gt;и параметр register в секции [global] - в качестве {account} и {password} должны быть &lt;br /&gt;указаны реальные параметры, выданные оператором&lt;br /&gt;&lt;br /&gt;Правила коммутации собственных абонентов друг с другом и с внешним миром описаны в файле &lt;br /&gt;extensions.conf. Правила оформляются в виде контестов, возможно использующих друг друга &lt;br /&gt;с помощью include. В контексте [local] описан вызов процедуры Hello с проигрыванием &lt;br /&gt;звукового файла (файлы находятся в пакете callweaver-sounds) при наборе 100 и вызов &lt;br /&gt;соответствующих внутренних абонентов при наборе 1ХХ (X - любая цифра от 0 до 9). &lt;br /&gt;Абоненты были предварительно описаны в файле sip.conf, и для них был указан контекст &lt;br /&gt;[office] - это значит, что им разрешено выполнять действия, описанные в этом контексте, &lt;br /&gt;т.е. во вложенном в него [local], а также набирать XXX. (. - любое количество любых &lt;br /&gt;цифр) - при этом вызов будет выполняться c использованием [sipnet] из sip.conf. &lt;br /&gt;В контекст [incoming] на номер 100 (как указано в параметре register в sip.conf) &lt;br /&gt;поступают входящие вызова с sipnet.ru&lt;br /&gt;&lt;br /&gt;Более сложные примеры настройки доступны в пакете callweaver-docs в каталоге samples.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Как подключиться и начать использовать CallWeaver&lt;br /&gt;=================================================&lt;br /&gt;&lt;br /&gt;В ALT Linux есть несколько софтфонов, поддерживающих протокол SIP, с помощью которых &lt;br /&gt;можно подключиться к CallWeaver - ekiga, twinkle, sflphone. Для подключения необходимо &lt;br /&gt;сначала раскомментировать загрузку модуля chan_sip в modules.conf и запустить CallWeaver &lt;br /&gt;с помощью service callweaver start. В софтфонах необходимо создать учетную запись, указав &lt;br /&gt;в качестве SIP Proxy адрес сервера с запущенным CallWeaver, а в качестве имени и пароля - &lt;br /&gt;параметры из секций [101] и [102] файла sip.conf. После этого с каждого софтфона можно будет &lt;br /&gt;набрать 100 и услышать звуковой файл или набрать 101 или 102 и услышать друг друга. Если &lt;br /&gt;настроено подключение к sipnet.ru, можно позвонить во внешний мир или принять вызов снаружи &lt;br /&gt;и проиграть для него звуковой файл.&lt;br /&gt;&lt;br /&gt;Для наблюдения за работой CallWeaver можно подключится к его консоли с помощью callweaver_cli. &lt;br /&gt;То, что будет видно на консоли, нельзя протоколировать стандартным образом, но, поскольку &lt;br /&gt;для подключения к серверу CallWeaver используется UNIX-сокет, можно использовать конструкцию, &lt;br /&gt;подобную socat -u UNIX-CONNECT:/var/run/callweaver/callweaver.ctl STDOUT&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-4991536290803639217?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/4991536290803639217/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=4991536290803639217' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/4991536290803639217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/4991536290803639217'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/08/callweaver.html' title='CallWeaver из коробки'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7967939136639017593.post-8325119995573286466</id><published>2008-08-26T21:19:00.014+03:00</published><updated>2008-11-24T22:28:29.894+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='altlinux'/><title type='text'>ALT Linux 4.0 Server Lite - неофициальная сборка</title><content type='html'>Долгое время, отвечая на вопрос "а что мне лучше поставить на сервер?", я пребывал в некотором замешательстве. С одной стороны, было бы странно мне, как члену &lt;a href="http://www.altlinux.org/ALT_Linux_Team"&gt;ALT Linux Team&lt;/a&gt;, советовать что-либо отличное от &lt;a href="http://altlinux.ru/products/"&gt;дистрибутивов ALT Linux&lt;/a&gt;. С другой стороны, ни один из официальных и &lt;a href="http://www.altlinux.org/Community_%28releases%29"&gt;неофициальных &lt;/a&gt;дистрибутивов не отвечает (точнее, до сих пор не отвечал) моим собственным представлениям о том, как должен выглядеть серверный дистрибутив общего назначения.&lt;br /&gt;&lt;br /&gt;А представления мои таковы: на сервере не должно быть ничего лишнего (т.е. сервисов, которые не будут использоваться). Я не использую &lt;a href="http://www.altlinux.org/Alterator"&gt;Alterator&lt;/a&gt;, предпочитая делать все руками и скриптами, и не далеко не на всех серверах использую &lt;a href="http://ru.wikipedia.org/wiki/OpenVZ"&gt;OpenVZ&lt;/a&gt;, поэтому &lt;a href="http://altlinux.ru/enterprise/alt_linux_4.0_server.html"&gt;ALT Linux 4.0 Server&lt;/a&gt; и тем более &lt;a href="http://altlinux.ru/company_news/alt_linux_4.0_office_server_announce.html"&gt;ALT Linux 4.0 Office Server&lt;/a&gt; практически для всех моих задач требуют основательной чистки после установки.&lt;br /&gt;&lt;br /&gt;Проблема, конечно, решается изготовлением эталонного образа минимальной системы, однако для новичка, задающего вопрос "а что мне лучше поставить на сервер?", это решение несколько неудобно. Более того, мне оно тоже неудобно. Инсталлятор все же значительно лучше.&lt;br /&gt;&lt;br /&gt;И тут можно вспомнить, что вообще-то ALT Linux - это не дистрибутив, а сундук с инструментами для построения дистрибутивов. Штатным инструментом для сборки специализированных дистрибутивов в настоящее время является &lt;a href="http://www.altlinux.org/Mkimage"&gt;mkimage&lt;/a&gt;. С его помощью, а также с помощью участников рассылки &lt;a href="https://lists.altlinux.org/mailman/listinfo/devel-distro"&gt;devel-distro&lt;/a&gt; (которые совсем недавно перебрались сюда из &lt;a href="https://lists.altlinux.org/mailman/listinfo/devel"&gt;devel&lt;/a&gt; и &lt;a href="https://lists.altlinux.org/mailman/listinfo/devel-conf"&gt;devel-conf&lt;/a&gt;) и был изготовлен так называемый &lt;b&gt;ALT Linux 4.0 Server Lite&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Собран он на пакетной базе &lt;a href="ftp://ftp.altlinux.ru/pub/distributions/ALTLinux/4.0/branch"&gt;branch/4.0&lt;/a&gt;. В свежеустановленной системе отсутствуют alterator и ovz, потушен portmap (т.к. nfs нужен не всем), поднят acpid и загружен модуль button для корректного выключения системы кнопкой power (в официальном &lt;a href="http://altlinux.ru/enterprise/alt_linux_4.0_server.html"&gt;ALT Linux 4.0 Server&lt;/a&gt; эта фича уже не помню почему отсутствовала).&lt;br /&gt;&lt;br /&gt;Доступны iso для архитертур &lt;a href="http://enp.itx.ru/linux/alt/4.0/iso/altlinux-server-lite-i586.iso"&gt;i586&lt;/a&gt; и &lt;a href="http://enp.itx.ru/linux/alt/4.0/iso/altlinux-server-lite-x86_64.iso"&gt;x86_64&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Шаг выбора дополнительного ПО из инсталлера исключен, дополнительное ПО предлагается устанавливать с помощью apt уже после установки, перечень дополнительного ПО &lt;a href="http://git.altlinux.org/people/enp/packages/?p=mkimage-profile-server.git;a=blob;f=profiles/packages-lists/lite-disk;h=6bb08ee7f6b5724787016c9849b88cf50a71b159;hb=enp/lite"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Замечания и пожелания по составу ПО принимаются (уже поступила просьба добавить все, что имеет отношение к pppoe).&lt;br /&gt;&lt;br /&gt;В дальнейших планах - всерьез посмотреть на &lt;a href="http://www.radlinux.org/docs/static/ru/ncsh_usecases.html"&gt;connexion/ncsh&lt;/a&gt; и, возможно, заменить им дефолтный &lt;a href="http://www.altlinux.org/Etcnet"&gt;etcnet&lt;/a&gt;.&lt;br /&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);font-size:78%;" &gt;&lt;/span&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7967939136639017593-8325119995573286466?l=admdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://admdev.blogspot.com/feeds/8325119995573286466/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7967939136639017593&amp;postID=8325119995573286466' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/8325119995573286466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7967939136639017593/posts/default/8325119995573286466'/><link rel='alternate' type='text/html' href='http://admdev.blogspot.com/2008/08/alt-linux-40-server-lite.html' title='ALT Linux 4.0 Server Lite - неофициальная сборка'/><author><name>Eugene Prokopiev</name><uri>https://profiles.google.com/114386336628154432765</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-lydhgJ4pBds/AAAAAAAAAAI/AAAAAAAAAAA/V2VcEMhEunk/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry></feed>
