<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>sveshnikov.ru - это наилучший источник информации по теме unix perl shell и всего такого &#187; UNIX</title>
	<atom:link href="http://alexey.sveshnikov.ru/blog/tag/unix/feed/" rel="self" type="application/rss+xml" />
	<link>http://alexey.sveshnikov.ru/blog</link>
	<description>bookmarks-on-tranquilizers</description>
	<lastBuildDate>Tue, 25 May 2010 20:30:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Debian-пакеты с человеческим лицом на примере Zabbix 1.8</title>
		<link>http://alexey.sveshnikov.ru/blog/2010/03/29/zabbix-debianization/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2010/03/29/zabbix-debianization/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 23:46:44 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[cdbs]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[debuild]]></category>
		<category><![CDATA[zabbix]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=150</guid>
		<description><![CDATA[Несколько задержавшийся кросс-пост с хабрахабра, в котором я описываю пример сборки debian-пакета с использованием CDBS. Написать эту статью меня заставили две вещи: во-первых, вышел zabbix 1.8 &#8211; замечательной системы мониторинга, в которой, судя по новостям, наконец-то занялись проблемами юзабилити админского интерфейса. Во-вторых, появилось стойкое ощущение, что после статей &#8220;делаем debian-пакет на коленке&#8221;, большинство хабравчан утвердятся [...]]]></description>
			<content:encoded><![CDATA[<p><em>Несколько задержавшийся кросс-пост с хабрахабра, в котором я описываю пример сборки debian-пакета с использованием CDBS.</em></p>
<p>Написать эту статью меня заставили две вещи: во-первых, вышел zabbix 1.8 &#8211; замечательной системы мониторинга, в которой, судя по новостям, наконец-то занялись проблемами юзабилити админского интерфейса. Во-вторых, появилось стойкое ощущение, что после статей &#8220;делаем debian-пакет на коленке&#8221;, большинство хабравчан утвердятся во мнении, что debian-пакеты придумали извращенцы для извращенцев. </p>
<p>Связывает два этих события то, что zabbix 1.8 пока нет в репозиториях убунты, и когда появится не понятно, а компилить и ставить из исходников что-то на продакшн-серверах, это, конечно, недостойное джентльмена занятие. В общем, появился хороший повод продемонстрировать, что debian-пакеты &#8211; это не страшно.</p>
<p>Итак, приступим:<br />
<code><br />
apt-get install dh-make devscripts cdbs libmysqlclient-dev libcurl4-gnutls-dev<br />
wget http://sunet.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/1.8/<br />
tar zxvf zabbix-1.8.1.tar.gz<br />
cd zabbix-1.8.1<br />
dh_make --createorig --cdbs<br />
</code></p>
<p>Между делом, если бы мы пакетировали не zabbix, а более простую программу, которая обычно ставится с помощью ./configure; make; make install, то на этом создание пакета заканчивается. Осталось бы только собрать пакет с помощью команды <del datetime="2009-12-12T16:59:47+00:00">ar</del> debuild.</p>
<p>Но мы продолжим: откроем файл debian/control и пропишем себя, любимого, в качестве создателя пакета, и укажем, какие пакеты должны приехать на сервер вместе с установкой zabbix. Для этого нужно найти строку &#8216;Depends&#8217; и добавить в ее конец следующее: &#8220;fping, adduser, apache2, php5, php5-mysql, php5-gd&#8221;.</p>
<p>Обычно скрипт configure можно вызывать без параметров и он сгенерирует жизнеспособный конфиг, но для zabbix это не так &#8211; нужно отдельными опциями включать компиляцию серверной части и агента. Так как агент из репозитория ubuntu меня полностью устраивает, ограничимся сборкой только сервера. Для этого нужно дописать в конец файла debian/rules следующую строку:<br />
<code><br />
DEB_CONFIGURE_USER_FLAGS := --enable-server --with-mysql --with-libcurl<br />
</code></p>
<p>Сборка пакета осуществляется следующим образом: создается временная директория (debian/zabbix), в которую копируется содержимое пакета. Затем эта директория упаковывается в архив, добавляются метаданные, и все &#8211; пакет готов. Это очень грубое, но пока достаточное описание процесса. Бинарные файлы попадут в директорию debian/zabbix/usr/bin сами собой (CDBS запустит команду make install DESTDIR=debian/zabbix), а файлы php-интерфейса нам нужно туда поместить вручную. Для этого перечислим их в файле debian/install вот каким образом:<br />
<code><br />
frontends/php/* usr/share/zabbix/<br />
misc/conf/zabbix_server.conf etc/zabbix<br />
</code></p>
<p>Кроме того, для нормальной работы заббиксу нужны еще и директории для лог-файлов и локов. Они тоже являются частью пакета, поэтому создать их нужно прямо в той временной директории. Стандартный способ создания пустых директорий &#8211; перечисление их в файле debian/dirs:<br />
<code><br />
/var/log/zabbix-server<br />
/var/run/zabbix-server<br />
</code></p>
<p>Теперь дело за инит-скриптом. В комплекте с заббиксом идет инит-сктипт (misc/init.d/debian/zabbix-server), но без обработки напильником он работать не будет. Поэтому лучше его заменить скриптом из убунты (http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/karmic/zabbix/karmic/annotate/head%3A/debian/zabbix-server-mysql.zabbix-server.init), который нужно сохранить под именем debian/init.</p>
<p>Совсем не лишним было бы настроить logrotate:<br />
<code><br />
cat > debian/logrotate<br />
/var/log/zabbix-server/zabbix_server.log {<br />
    daily<br />
    rotate 7<br />
    compress<br />
    missingok<br />
    notifempty<br />
    create 0640 zabbix zabbix<br />
    sharedscripts<br />
}<br />
^D<br />
</code></p>
<p>Раз пакет мы собираем не для кого угодно, а только для себя, то почему бы и не положить конфиг апача рядом с заббикксом:<br />
<code><br />
mkdir misc/apache2-vhosts<br />
cat > misc/apache2-vhosts/zabbix<br />
<VirtualHost *><br />
        ServerName zabbix.example.com<br />
        ServerAdmin admin@example.com<br />
        DocumentRoot /usr/share/zabbix<br />
        CustomLog /var/log/apache2/zabbix_access.log combined<br />
        ErrorLog  /var/log/apache2/zabbix_error_log<br />
</VirtualHost><br />
^D<br />
echo "misc/apache2-vhosts/zabbix etc/apache2/sites-available" >> debian/install<br />
</code></p>
<p>Иногда недостаточно просто разложить файлики по файловой системе, чтобы настроить среду для исполнения программы. В таких случаях на помощь приходят preinst, postinst, prerm и postrm скрипты, которые выполняются уже на сервере, куда пакет устанавливается. Названия у них вполне понятные, пояcнить нужно только то, что &#8216;inst&#8217;, и &#8216;rm&#8217; &#8211; это фактическая распаковка или удаление содежимого пакета (все той же временной директории debian/zabbix, в нашем случае), кроме того &#8211; каждый из этих скриптов может вызываться с разными аргументами в зависимости от ситуации. Нам интересен скрипт postinst, вызывающийся с аргументом configure &#8211; нужное место скрипта можно легко найти в шаблоне postinst.ex. Приступим:</p>
<p><code><br />
cd debian<br />
mv postinst.ex postinst<br />
vim postinst<br />
</code></p>
<p>После строки configure) нужно вставить следующий код:<br />
<code><br />
          # Создадим пользователя<br />
          useradd zabbix || echo "User zabbix was not added"</p>
<p>          # Установим права на рабочие директории<br />
          chown zabbix:zabbix /var/log/zabbix-server /var/run/zabbix-server</p>
<p>          # В этой директории веб-интерфейс пытается сохранить конфиг-файл, дадим ему на это права:<br />
          chown www-data /usr/share/zabbix/conf<br />
          chmod 775 /usr/share/zabbix/conf</p>
<p>          # Настроим автозапуск сервера:<br />
          update-rc.d zabbix-server defaults</p>
<p>          # Включим новый virtualhost и перезапустим апач:<br />
          a2ensite zabbix<br />
          invoke-rc.d apache2 reload</p>
<p>      ;;</p>
<p>      abort-upgrade|abort-remove|abort-deconfigure)<br />
</code></p>
<p>Осталась одна деталь: при стандартных настройках PHP интерфейс заббикса не заведется, нужно править max_execution_time и еще несколько параметров. Если бы мы готовили пакет для домашнего сервера-торрентокачалки, то, конечно, проще было бы поправить php.ini напрямую. Но идеологически более правильно (и это очевидно при коллективной разработке, когда роли админа и разработчика разделены) поместить эти настройки тоже в пакет. Сделать это можно так:</p>
<p><code><br />
mkdir misc/php.conf<br />
cat > misc/php.conf/zabbix.ini<br />
post_max_size = 16M<br />
max_execution_time = 300<br />
mbstring.func_overload = 2<br />
^D<br />
echo "misc/php.conf/zabbix.ini   etc/php5/conf.d" >> debian/install<br />
</code></p>
<p>На этом все, можно собрать пакет с помощью команды debuild, поставить его с помощью dpkg -i
<package.deb> и apt-get install -f.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2010/03/29/zabbix-debianization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP сервер в одну строку: версия 2.0</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/08/30/bash-httpd-2/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/08/30/bash-httpd-2/#comments</comments>
		<pubDate>Wed, 29 Aug 2007 20:00:11 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[netcat]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2007/08/30/http-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80-%d0%b2-%d0%be%d0%b4%d0%bd%d1%83-%d1%81%d1%82%d1%80%d0%be%d0%ba%d1%83-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d1%8f-20/</guid>
		<description><![CDATA[Идея с HTTP сервером на bash мне не дает покоя. Вернуться к ней меня побудила.. попытка воспользоваться старой версией: получалсь не очень :) Поэтому решил довести его до ума. Что-то дописал, что-то выкинул, полчилось следующее: :;while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;z=$r;while [ ${#z} -gt 2 ];do $r z;done;f=`$e [...]]]></description>
			<content:encoded><![CDATA[<p>Идея с <a href="http://alexey.sveshnikov.ru/blog/2006/12/23/http-сервер-размером-в-222-байта/">HTTP сервером на bash</a> мне не дает покоя.</p>
<p>Вернуться к ней меня побудила.. попытка воспользоваться старой версией: получалсь не  очень :)</p>
<p>Поэтому решил довести его до ума. Что-то дописал, что-то выкинул, полчилось следующее:<br />
<code>:;while [ $? -eq 0 ];do nc -vlp 8080 -c'(r=read;e=echo;$r a b c;z=$r;while [ ${#z} -gt 2 ];do $r z;done;f=`$e $b|sed 's/[^a-z0-9_.-]//gi'`;h="HTTP/1.0";o="$h 200 OK\r\n";c="Content";if [ -z $f ];then($e $o;ls|(while $r n;do if [ -f "$n" ]; then $e "&lt;a href=\"/$n\"&gt;`ls -gh $n`&lt;/a&gt;&lt;br&gt;";fi;done););elif [ -f $f ];then $e "$o$c-Type: `file -ib $f`\n$c-Length: `stat -c%s $f`";$e;cat $f;else $e -e "$h 404 Not Found\n\n404\n";fi)';done</code></p>
<p>Теперь по URL http://ваш_ip:8080/ можно получить доступ ко всем файлам, находящимся в текущим каталоге. Очевидных и прямолинейных способов сменить каталог нет. Как и раньше, протестировано и работает под Linux, bash 3.2.13, и с хоббитовским netcat v1.10 с поддержкой опции -с (запустите netcat -h и посмотрите. Как минимум в Ubuntu, Debian и Fedora Core такая опция есть).</p>
<p>Теперь строка занимает 434 байт,  что на 212 больше, чем прошлая версия. И мне кажется, что я с толком потратил эти байты: новый сервер обрабатывает ошибку 404, кроме того, теперь он работает без задержки, которая раньше требовалась для того, чтобы была возможность его остановить с помощью Ctrl-C. Для успешных запросов сервер отдает нормальные заголовки, с размером файла и даже с его MIME-типом. Например:</p>
<p><code>dainichi@fujitsu:~/backup$ echo "GET /6.1-RELEASE-i386-disc1.iso HTTP/1.1" | nc localhost 8080 | head -n3<br />
HTTP/1.x 200 OK<br />
Content-Type: application/x-iso9660<br />
Content-Length: 529784832</code></p>
<p>Для удобства можно сохранить его в файл и написать в .bash_profile примерно следующее:<code>alias share='sh ~/bash_httpd.sh'</code></p>
<p>Да, были попытки его еще уменьшить, но они не увенчались успехом. Есть такой вариант, но он даже больше:<br />
<code>w=while;d=done;e=echo;r=read;echo "true; $w [ @? -eq 0 ];do nc -vlp 8080 -c'($r a b c;f={$e @b|sed 's/[^a-z0-9_.-]//gi'{;h=}HTTP/1.x};o=}@h 200 OK#};c=}Content};if [ -z @f ];then($e @o;ls|(while $r n;do $e }<a href=\}/@n\}>@n</a><br />};done));elif [ -f @f ];then $e }@o@c-Type: {file -ib @f{#@c-Length: {stat -c%s @f{#};cat @f;else $e }@h 404 Not Found##404#};fi)';done"|tr "@{}#" '$`"<br />
'|sh</code> Оставил его, потому что выглядит страшно, детей пугать &#8211; самое то :)</p>
<p>Если у вас получится сэкономить еще пару байтов, то милости просим в комментаторскую :)</p>
<p><b>UPD: 03.09.2007:</b> Код обновлен, в него вошли <a href="http://sovety.blogspot.com/2007/08/21.html">исправления</a>, которые сделал тов. jetxee, за которые ему большое спасибо.</p>
<p><b>UPD: 03.09.2007:</b> Я удивлен тому факту, что эта заметка <a href="http://news2.ru/story/54417/"> попала в топ news2</a>, спасибо <a href="http://dikiy.com/blog/">dik&#8217;у</a> за то, что добавил ее. Я рад, что она многим показалась интересной.</p>
<p><b>UPD: 07.09.2007:</b> Товарищ Ed очень здорово прооптимизировал код. Вот, что у него вышло:<br />
<code>while :;do nc -p8080 -vnlc'r=read;e="echo -e";$r a b c;while [ -n "`$e $a|tr -d "\r\n"`" ];do $r a;done;f=`$e $b|sed s/.//`;h="HTTP/1.0";z="404 Not Found\n";[ -z $f ]&#038;&#038;(ls|while $r n;do [ -f $n ]&#038;&#038;$e "<a>$n</a>";done)||([ -f $f ]&#038;&#038;($e "$h 200 OK\r\nContent-Type: `file -ib $f`\n";cat $f)||$e "$h $z\n$z")';done</code></p>
<p>Работоспособность проверялась автором на таблетке Nokia N800, а у меня в Kubuntu 7.04 что-то не заработало. Сегодня вечером буду разбираться :)</p>
<p>p.s. Мне теперь стыдно из-за того, что сам не догадался использовать &#038;&#038; и || вместо if..then. :(</p>
<p>p.p.s. stay <a href="http://feeds.feedburner.com/Bookmarks-on-tranquilizers">tuned</a>!</p>
<p><b>UPD 18.08.2008:</b> О, <a href="http://habrahabr.ru/blogs/crazydev/37245/">написали</a> про это безобразие на Хабре, назвали меня извращенцем. Хулиганьё!! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/08/30/bash-httpd-2/feed/</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>Что получится, если скрестить fuse и ssh? &#x202E;[файловая система sshfs]</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/08/29/sshfs/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/08/29/sshfs/#comments</comments>
		<pubDate>Tue, 28 Aug 2007 20:58:03 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[fuse]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2007/08/29/%d1%87%d1%82%d0%be-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d1%82%d1%81%d1%8f-%d0%b5%d1%81%d0%bb%d0%b8-%d1%81%d0%ba%d1%80%d0%b5%d1%81%d1%82%d0%b8%d1%82%d1%8c-fuse-%d0%b8-ssh-%d1%84%d0%b0%d0%b9/</guid>
		<description><![CDATA[А получится sshfs. sshfs позволит вам монтировать каталоги на удаленных машинах по протоколу SFTP; пользоваться им настолько просто, что даже рассказать в этой заметке практически нечего: ни тебе интрижки с накладыванием патчей и сборкой пакета, ни тебе объектного языка конфигурационных файлов. Тоска, одним словом. Но для sshfs это, вобщем-то, плюс. Итак, начнем с установки пакета [...]]]></description>
			<content:encoded><![CDATA[<p>А получится <a href="http://fuse.sourceforge.net/sshfs.html">sshfs</a>.<br />
sshfs позволит вам монтировать каталоги на удаленных машинах по протоколу SFTP; пользоваться им настолько просто, что даже рассказать в этой заметке практически нечего: ни тебе интрижки с накладыванием патчей и сборкой пакета, ни тебе объектного языка конфигурационных файлов. Тоска, одним словом.</p>
<p>Но для sshfs это, вобщем-то, плюс. Итак, начнем с установки пакета и добавления себя в группу fuse, делается это так:<br />
<code>apt-get install sshfs<br />
sudo adduser your_name fuse<br />
</code></p>
<p>Команда adduser в таком контексте ничего, кроме добавления уже существующего пользователя в группу не делает, так что не нужно смущаться от ее неожиданного выхода на сцену. После этого нам нужно перелогиниться, чтобы изменения в /etc/group вступили силу.</p>
<p>Мне пришлось выполнить еще одну операцию: сменить группу у устройства /dev/fuse. Я думаю, это особенность лично моего дистрибутива, но если у вас тоже попытки монтирования будут завершаться ошибкой &#8220;что-то там permission denied&#8221;, то вот вам команда:<br />
<code>chgrp fuse /dev/fuse<br />
</code>По-хорошему, ее надо прописать куда-нибудь в автозагрузку, например, в /etc/rc.local.</p>
<p>Теперь все готово для монтирования:<br />
<code>mkdir mount_point<br />
sshfs remoteuser@remotehost:/some/folder ~/mount_point<br />
ls mount_point<br />
</code></p>
<p>Ну вот, собственно, и все, можно работать.</p>
<p>Теперь настало время рассказать об одном ограничении: кроме нас, никто в системе не сможет воспользоваться примонтированным каталогом. Сама возможность пустить туда других пользователей есть, но корректность операций записи не гарантируется (могут быть повреждены атрибуты файла &#8211; владелец и пр.). Поэтому перед тем, как открывать доступ к важным данным лучше все-таки поставить эксперимент на копии. Также несколько странные результаты будет выдавать команды du и df, но по-моему, это я уже придираюсь :)</p>
<p>В итоге, мы имеем отличную замену scp/sftp или fish (встроенная в mc и konqueror оболчка для sftp) для случаев, когда нужно выполнить действия посложнее, чем копирование.</p>
<p>Дальнейшее чтение: <a href="http://fuse.sourceforge.net/wiki/index.php/SshfsFaq">FAQ по sshfs</a>, <a href="http://fuse.sourceforge.net/wiki/index.php/FileSystems">Другие основанные на fuse файловые системы</a></p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/08/29/sshfs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Программерские загогулины [2]</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/08/23/zagogulina2/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/08/23/zagogulina2/#comments</comments>
		<pubDate>Thu, 23 Aug 2007 16:51:12 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[загогулины]]></category>
		<category><![CDATA[общее]]></category>
		<category><![CDATA[quiz]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=23</guid>
		<description><![CDATA[Очередная программерская загогулина, на этот раз решение сразу не дам :) Допустим, надо выполнить какую-либо команду на нескольких хостах, перечисленных в файле. Пишу: cat file &#124; ( while read host; do ssh user@$host "command" done ) Ошибка, однако! В чем? Кто сможет разобраться в уме, не запуская код, тому респект и уважуха :) UPD: Решил [...]]]></description>
			<content:encoded><![CDATA[<p>Очередная программерская загогулина, на этот раз решение сразу не дам :)</p>
<p>Допустим, надо выполнить какую-либо команду на нескольких хостах, перечисленных в файле. Пишу:</p>
<p><code>cat file | (<br />
   while read host; do<br />
      ssh user@$host "command"<br />
   done<br />
)</code></p>
<p>Ошибка, однако! В чем?<br />
Кто сможет разобраться в уме, не запуская код, тому респект и уважуха :)</p>
<p><b>UPD: </b></p>
<p>Решил человек, скрывающийся под ником gds:</p>
<blockquote><p>поток из “cat file” будет выкушан только первой запущенной командой “ssh …”?</p></blockquote>
<p>gds, респект тебе уважуха  :)</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/08/23/zagogulina2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Удаленный рабочий стол. UNIX-way :)</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/08/06/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%80%d0%b0%d0%b1%d0%be%d1%87%d0%b8%d0%b9-%d1%81%d1%82%d0%be%d0%bb-unix-way/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/08/06/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%80%d0%b0%d0%b1%d0%be%d1%87%d0%b8%d0%b9-%d1%81%d1%82%d0%be%d0%bb-unix-way/#comments</comments>
		<pubDate>Mon, 06 Aug 2007 13:56:11 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[общее]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[x]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=31</guid>
		<description><![CDATA[Как всегда, существует уйма способов запускать графические программы удаленно. Не все из них основаны на туннелинге X-трафика, но именно с ним играться интересней всего. Приступим :) Собственно, на практике страшная фраза &#8220;сделать туннелинг Х-протокола&#8221; обозначает, что нужно добавить опцию X к ssh. Получается, что в простейшем случае запустить удаленную графическую программу можно так: ssh -X [...]]]></description>
			<content:encoded><![CDATA[<p>Как всегда, существует уйма способов запускать графические программы удаленно. Не все из них основаны на туннелинге X-трафика, но именно с ним играться интересней всего.</p>
<p>Приступим :)</p>
<p>Собственно, на практике страшная фраза &#8220;сделать туннелинг Х-протокола&#8221; обозначает, что нужно добавить опцию X к ssh. Получается, что в простейшем случае запустить удаленную графическую программу можно так:<br />
<code>ssh -X user@host firefox </code></p>
<p>Kdesktop от других программ ничем не отличается:<br />
<code>ssh -X user@host kdesktop </code></p>
<p><img src='http://alexey.sveshnikov.ru/blog/wp-content/uploads/2007/09/qtdesignersmall.png' alt='Удаленный или локальный десктоп? Вот в чем вопрос.'  align="right"/><br />
Неудобство последней команды как способа удаленного входа заключается в том, что в случае, если какая-либо оболочка уже запущена, то неизбежны конфликты и долгие раздумья на тему принадлежности какого-нибудь окошка удаленной или локальной машине. Поэтому все что нужно сделать &#8211; это использовать подобную команду <b>вместо</b> оболочки.</p>
<p>Я это сделал так:<br />
<code>xinit /usr/bin/ssh -X user@host startkde -- :1</code><br />
Набирать команду следует из обычной, неиксовой консоли (Ctrl-Alt-F1), и работать она будет только в случае, если на удаленной машине уже лежит наш публичный ключик, т.к. не будет возможности ввести пароль. (<a href="http://www.yandex.ru/yandsearch?text=ssh+%EF%F3%E1%EB%E8%F7%ED%FB%E9+%EA%EB%FE%F7">что такое публичный ключ</a>). Полный путь к ssh на некоторых дистрибутивах обязателен.</p>
<p>Теперь сочетанием клавиш Ctrl-Alt-F7 и Ctrl-Alt-F9 можно переключаться между локальным и удаленным рабочим столом (хотя F9 для удаленной машины &#8211; это лично у меня, у вас может быть также F8 или F10). Да, и делать это лучше только если соединение между машинами быстрое, иначе нервных расстройств не избежать :)</p>
<p>Этот пост написан с рабочего десктопа, но через ноутбучную оперу :)</p>
<p>А что интересного с помощью ssh удавалось сделать вам?</p>
<p><i>UPD через 20 мин: Отправил ноутбук в ребут и через некоторое время понял, что работаю на удаленной машине. 5 секунд паники, 10 &#8211; на сохранение и минута чтобы понять, что я ошибся :) Вобщем, для людей со слабым сердцем не рекомендую так работать, а сам я теперь осторожен, как сапер на минном поле :) </i></p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/08/06/%d1%83%d0%b4%d0%b0%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%80%d0%b0%d0%b1%d0%be%d1%87%d0%b8%d0%b9-%d1%81%d1%82%d0%be%d0%bb-unix-way/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Perl и фиксированные ключи в хеше.</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/07/05/%d0%bf%d1%80%d0%be-%d1%82%d0%be-%d0%ba%d0%b0%d0%ba-perl-%d0%b7%d0%b0%d0%b1%d0%be%d1%82%d0%b8%d1%82%d1%81%d1%8f-%d0%be-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b5/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/07/05/%d0%bf%d1%80%d0%be-%d1%82%d0%be-%d0%ba%d0%b0%d0%ba-perl-%d0%b7%d0%b0%d0%b1%d0%be%d1%82%d0%b8%d1%82%d1%81%d1%8f-%d0%be-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b5/#comments</comments>
		<pubDate>Wed, 04 Jul 2007 20:29:20 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[PERL]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[общее]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=29</guid>
		<description><![CDATA[Некоторое время назад мне приходилось писать довольно большой проект на PHP. Тогда очень хотелось от хешей возможности зафиксировать множество ключей, чтобы не отлавливать по десяткам файлов опечатки в названиях полей сложных многоуровневых структур данных. Тогда решения не нашлось. И сейчас PHP для меня лично уходит потихоньку в прошлое, т.к. в perl нахожу все больше интересных [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторое время назад мне приходилось писать довольно большой проект на PHP. Тогда очень хотелось от хешей возможности зафиксировать множество ключей, чтобы не отлавливать по десяткам файлов опечатки в названиях полей сложных многоуровневых структур данных.</p>
<p>Тогда решения не нашлось. И сейчас PHP для меня лично уходит потихоньку в прошлое, т.к. в perl нахожу все больше интересных возможностей, которых раньше не хватало.<br />
Так вот, по поводу фиксированного набора ключей, вот пример объекта на основе такого хеша:</p>
<p><code>package some;</p>
<p>use warnings;<br />
use strict;<br />
use Hash::Util qw{lock_keys};</p>
<p>sub new<br />
    {<br />
    my $class = shift;<br />
    my %hash;<br />
    my @keys = ("one", "two", "three", "four", "five");<br />
    my $self = bless \%hash, $class;<br />
    lock_keys %hash, @keys;<br />
    return $self;<br />
    }</p>
<p>1;</code></p>
<p>Теперь при выполнении инструкция $some->{&#8216;there&#8217;} произойдет ошибка:<br />
<code>Attempt to access disallowed key 'there' in a restricted hash at ./test.pl line 11.</code></p>
<p>Причем сделано это не через Tie, чего я сначала опасался, а собственными средствами компилятора, т.е. должно работать очень быстро.</p>
<p>Но вообще-то, в каждой книге по ООП-прогрммированию обязателно замолвят слово о том, что открытые свойства класса это не очень хорошо, и что их значения предпочтительней изменять с помощью методов. А ведь их лень писать для каждой переменной!! Но хорошие языки тем и отличаются, что на них вовсе не сложно писать красиво и правильно. Смотрим, что предлагает Perl (пример из документации):</p>
<p><code><br />
package Foo;<br />
    use base qw(Class::Accessor);<br />
    Foo->mk_accessors('foo'); # или mk_ro_accessors(qw{ one two three }) для read-only полей</p>
<p>    my $obj = Class->new({ foo => 42 });<br />
    print $obj->foo;    # 42<br />
    $obj->foo("24");<br />
    print $obj->foo;    # 24<br />
</code></p>
<p>Ну вот и все! Теперь если захочется изменить поведение объекта таким образом, чтобы при изменении свойства foo, менялось также значение bar, достаточно реализовать самостоятельно нужную функцию, а править использующий класс код не нужно.</p>
<p>Все-таки perl язык великий и могучий, этого у него не отнять!</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/07/05/%d0%bf%d1%80%d0%be-%d1%82%d0%be-%d0%ba%d0%b0%d0%ba-perl-%d0%b7%d0%b0%d0%b1%d0%be%d1%82%d0%b8%d1%82%d1%81%d1%8f-%d0%be-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%81%d1%82%d0%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>codepage horror</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/06/29/codepage-horror/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/06/29/codepage-horror/#comments</comments>
		<pubDate>Thu, 28 Jun 2007 20:01:54 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[загогулины]]></category>
		<category><![CDATA[общее]]></category>
		<category><![CDATA[SHELL]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=27</guid>
		<description><![CDATA[Иногда мне снятся сны. Бывает, что кошмары. Что такое кошмар для админа? Это когда видишь свой сайт &#8211; все работает, все грузится, но кодирЛЮХВ КВЯНЕК ЗИЕОЕИВ!!! На работе сегодня этот кошмар воплотился: вселился бес в базу и попутал все кодировки. Попутал на славу, так что первый дамп пришлось расшифровать в два приема: utf8->koi и cp1251->koi, [...]]]></description>
			<content:encoded><![CDATA[<p>Иногда мне снятся сны. Бывает, что кошмары. Что такое кошмар для админа? Это когда видишь свой сайт &#8211; все работает, все грузится, но кодирЛЮХВ КВЯНЕК ЗИЕОЕИВ!!!</p>
<p>На работе сегодня этот кошмар воплотился: вселился бес в базу и попутал все кодировки. Попутал на славу, так что первый дамп пришлось расшифровать в два приема: utf8->koi и cp1251->koi, а со вторым развлечение было поизощреннее. С каждой перестановкой буквы прыгали издевательски с места на место, подмигивали и смеялись, доводя мой <s>ЙЛЗХ</s>моск до кипения. Но битву они все-так проиграли. После пятой перекодировки cp1251->koi8r из поганцев сгинул злой дух и оборотились они текстом складным и залился дамп в базу и вернулись: юзерам &#8211; счастье, а админу &#8211; крепкий сон :)</p>
<p>p.s.</p>
<p>А на #freebsd народ показал такой фокус:</p>
<p><code><br />
#str="трали-вали"; for((i=0; $i<20; i++)); do str=`echo "$str" | iconv -f CP1251 -t KOI8-R`; done;<br />
#echo $str<br />
трали-вали<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/06/29/codepage-horror/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>return 0;</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/06/27/im-back/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/06/27/im-back/#comments</comments>
		<pubDate>Wed, 27 Jun 2007 19:45:17 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[PERL]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[загогулины]]></category>
		<category><![CDATA[quiz]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=26</guid>
		<description><![CDATA[Я вернулся :) За время учебного отпуска нагулял отличное рабочее настроение! В первый рабочий день обратил внимание на небольшой юбилей: 1 год и 4 дня исполнилось моему процессу screen, запущенному на работе, которым я активно пользуюсь по 40 часов в неделю. Слава героям!! Попутно веду свою маленькую коллекцию программерских загогулин, вот очередной экземпляр: #!/usr/bin/perl $var1 [...]]]></description>
			<content:encoded><![CDATA[<p>Я вернулся :)<br />
За время учебного отпуска нагулял отличное рабочее настроение!</p>
<p>В первый рабочий день обратил внимание на небольшой юбилей: 1 год и 4 дня исполнилось моему процессу screen, запущенному на работе, которым я активно пользуюсь по 40 часов в неделю. Слава героям!!</p>
<p>Попутно веду свою маленькую коллекцию программерских загогулин, вот очередной экземпляр:</p>
<p><code><br />
#!/usr/bin/perl<br />
$var1 = "one|two|three";<br />
$var2 = join('|', split ('|', $var1));<br />
</code></p>
<p>Опрос знакомых программистов показал, что предполагаемым значением $var2 является исходная строка  ($var1). PERL думает иначе.</p>
<p>Вся мощь перла с его реально перегруженными функциями именно в этом моменте дала слабину: split в качестве первого аргумента принимает _только_ регулярное выражение, и, соответственно, символ &#8216;|&#8217; воспринимается как логическое &#8220;или&#8221;.. Таким образом, в var2 будет &#8220;o|n|e||t|w|o&#8221;&#8230;</p>
<p>Пусть такое поведение и является документированным, меня оно все равно расстраивает..</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/06/27/im-back/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kubuntu 7.04</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/05/17/kubuntu-704/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/05/17/kubuntu-704/#comments</comments>
		<pubDate>Wed, 16 May 2007 20:00:14 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[kubuntu]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=25</guid>
		<description><![CDATA[В новом Kubuntu появилась интереснейшая вещь, которой раньше очень не хватало: маленький апплет, с помощью которого можно быстро сконфигурировть сетевые интерфейсы. Вдвойне приятно, что WiFi и Bluetooth заработали сами по себе, не требуя к себе внимания (это был камень в огород Fedora Core :) Ubuntu &#8211; офигенный дистрибутив!]]></description>
			<content:encoded><![CDATA[<p><a href="http://alexey.sveshnikov.ru/blog/wp-content/uploads/2007/05/knetworkmanager.png"><img src='http://alexey.sveshnikov.ru/blog/wp-content/uploads/2007/05/knetworkmanager.png' title='KNetworkManager screenshot' alt='KNetworkManager screenshot' align="right" width="250" /></a>В новом Kubuntu появилась интереснейшая вещь, которой раньше очень не хватало: маленький апплет, с помощью которого можно быстро сконфигурировть сетевые интерфейсы.</p>
<p>Вдвойне приятно, что WiFi и Bluetooth заработали сами по себе, не требуя к себе внимания (это был камень в огород Fedora Core :)</p>
<p>Ubuntu &#8211; офигенный дистрибутив!</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/05/17/kubuntu-704/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feodora Core</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/03/03/feodora-core/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/03/03/feodora-core/#comments</comments>
		<pubDate>Sat, 03 Mar 2007 14:15:54 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[fedora]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=20</guid>
		<description><![CDATA[Недавно linux на моем ноутбуке упал. Зря я доверился ext2: корневая система рухнула после грубого выключения системы (причем сразу же после загрузки). Это стало поводом для продолжения экспериментов, на этот раз подопытным кроликом стала Feodora Core 6. После Kubuntu новых впечатлений &#8211; масса!! Во-первых, это GNOME, c которым я раньше особо и не сталкивался &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно linux на моем ноутбуке упал. Зря я доверился ext2: корневая система рухнула после грубого выключения системы (причем сразу же после загрузки). Это стало поводом для продолжения экспериментов, на этот раз подопытным кроликом стала Feodora Core 6.<br />
После Kubuntu новых впечатлений &#8211; масса!!<br />
Во-первых, это GNOME, c которым я раньше особо и не сталкивался &#8211; я, конечно, его снесу через какое-то время, но что-то в нем все-таки есть, по крайней мере я начинаю понимать людей, которые с ним работают.<br />
Во-вторых, все очень быстро. Пока не понимаю, как такое может быть, но по ощущениям Open Office грузится в полтора-два раза быстрее.<br />
В-третьих, я еще не гуру линукса, для меня довольно важное значение имеет автоопределние оборудования и дефолтная конфигурация: BeryL из коробки &#8211; это клево!! И потом, наконец-то заработала функция перехода в спящий режим при закрывании крышки ноутбука!</p>
<p>Но есть и минусы: yum после apt-get &#8211; штука очень тормозная. Может секунд 20 выполнять поисковый запрос и еще минуту &#8211; проверять зависимости (это при том, что у меня довольно быстрый компьютер). И еще, похоже, что тулзу для понижения тактовой частоты процессора придется искать самостоятельно &#8211; при полной зарядке аккумулятора прогнозируемое время работы &#8211; полтора часа, что в полтора раза меньше времени работы из-под ubuntu.</p>
<p>Эх!</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/03/03/feodora-core/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
