<?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; tech</title>
	<atom:link href="http://alexey.sveshnikov.ru/blog/tag/tech/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>Загадка!</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/10/19/%d0%b7%d0%b0%d0%b3%d0%b0%d0%b4%d0%ba%d0%b0/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/10/19/%d0%b7%d0%b0%d0%b3%d0%b0%d0%b4%d0%ba%d0%b0/#comments</comments>
		<pubDate>Fri, 19 Oct 2007 11:40:43 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[загогулины]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[zagogulina]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2007/10/19/%d0%b7%d0%b0%d0%b3%d0%b0%d0%b4%d0%ba%d0%b0/</guid>
		<description><![CDATA[&#8220;Если достаточно долго лазить по карманам своих курток, можно найти практически любую сумму денег&#8221; (народная мудрость). Вот и с задачками примерно такая же ситуация &#8211; вспомнил весьма любопытную. Приятно, знаете ли, иногда посмотреть как люди мучаются над задачками, которые когда-то серьезно озаботили тебя самого :) Итак, есть следующий код: #!/bin/sh get_size() { if [ "`uname`" [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Если достаточно долго лазить по карманам своих курток, можно найти практически любую сумму денег&#8221; (народная мудрость). Вот и с задачками примерно такая же ситуация &#8211; вспомнил весьма любопытную.<br />
Приятно, знаете ли, иногда посмотреть как люди мучаются над задачками, которые когда-то серьезно озаботили тебя самого :)</p>
<p>Итак, есть следующий код:</p>
<p><code>#!/bin/sh</p>
<p>get_size() {<br />
    if [ "`uname`" = "FreeBSD" ]; then<br />
        r=`stat -f %z $1`<br />
    else<br />
        r=`stat -c %s $1`<br />
    fi<br />
    return $r<br />
}</p>
<p>if [ -z $1 ]; then<br />
    echo "usage: print_size <file_name>";<br />
else<br />
    get_size $1;<br />
    echo $?<br />
fi<br />
</code></p>
<p>Вот результат работы скрипта:<br />
<code>asveshnikov@fe08a023fb1cc27a:~/tmp$ ls -la<br />
total 112<br />
drwxr-xr-x  2 asveshnikov asveshnikov  4096 2007-10-19 15:38 .<br />
drwxr-xr-x 85 asveshnikov asveshnikov  8192 2007-10-19 13:15 ..<br />
-rw-r--r--  1 asveshnikov asveshnikov 39781 2007-08-29 15:22 DSC02473.jpg<br />
-rw-r--r--  1 asveshnikov asveshnikov 49553 2007-08-31 17:41 DSC02481.jpg<br />
-rwxr-xr-x  1 asveshnikov asveshnikov   231 2007-10-19 15:27 print_size.sh<br />
asveshnikov@fe08a023fb1cc27a:~/tmp$ ./print_size.sh print_size.sh<br />
231<br />
asveshnikov@fe08a023fb1cc27a:~/tmp$ ./print_size.sh DSC02473.jpg<br />
39781</code></p>
<p>Как видите, абсолютно рабочий код, проверялся в Linux и FreeBSD.<br />
При этом он имеет просто ужасную.. нет, <b>чудовищную</b> проблему переносимости, которую при некоторых обстоятельствах крайне сложно обнаружить в скриптах несколько большего размера &#8211; какую?</p>
<p>p.s. угадавший первым будет умничкой :)</p>
<p>UPD: </p>
<p>Уже двое человек указали на то, что `uname` желательно взять еще и в кавычки. Вобщем, предлагаю не мелочиться, здесь проблема если и есть, то явно не &#8220;чудовищная&#8221;. Чтобы больше никого не смущать этим, подправил код. </p>
<p>Решено!</p>
<p>Михаил достаточно подробно описал проблему:</p>
<blockquote><p>Если не брать в голову отсутствие кавычек вокруг $1, а также неполный способ определения размера файла (под солярой нет stat, например), то мне кажется основная проблема в возврате значения из функции. На самом деле таким образом можно вернуть только целое, причем очень ограниченное, так как по сути возвращается код завершения функции (если не изменяет память &#8211; максимум &#8211; 256). таким образом на больших файлах получим неверное значение.</p>
<p>Решением может служить использование для возврата глобальное переменной, либо через echo.</p></blockquote>
<p>С моей стороны осталось лишь пояснить, почему проблема является &#8220;чудовищной&#8221; &#8211; она запросто может привести к порче данных, так как никакие сообщения об ошибках выводиться не будут. Ну и выглядит внешне этот код вполне надежным, так что отлавливать такой баг может быть задачей не из легких.</p>
<p>Собственно, основные проблемы возникают при портировании скрипта с sh на bash:</p>
<p><code>asveshnikov@fe08a023fb1cc27a:~/tmp$ ls -al DSC02473.jpg<br />
-rw-r--r-- 1 asveshnikov asveshnikov 39781 2007-08-29 15:22 DSC02473.jpg<br />
asveshnikov@fe08a023fb1cc27a:~/tmp$ bash print_size.sh DSC02473.jpg<br />
101</code></p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/10/19/%d0%b7%d0%b0%d0%b3%d0%b0%d0%b4%d0%ba%d0%b0/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Kubuntu 7.10 &amp;&amp; Enlightenment 0.17</title>
		<link>http://alexey.sveshnikov.ru/blog/2007/10/19/710/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2007/10/19/710/#comments</comments>
		<pubDate>Thu, 18 Oct 2007 21:03:09 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[wm]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/2007/10/19/710/</guid>
		<description><![CDATA[Смешанные чувства: нет эйфории, которая была с 7.04: просто прервал работу на полчаса, поставил новую систему, добавил с десяток нужных мне пакетов и продолжил работу. И уже в процессе работы стал натыкаться на приятные мелочи: dolphin, который действительно мне показался шагом вперед в плане юзабельности, KNetworkManager, в котором появилось окошко статуса, strigi &#8211; служба полнотекстового [...]]]></description>
			<content:encoded><![CDATA[<p>Смешанные чувства: нет эйфории, которая была с 7.04: просто прервал работу на полчаса, поставил новую систему, добавил с десяток нужных мне пакетов и продолжил работу.</p>
<p>И уже в процессе работы стал натыкаться на приятные мелочи: dolphin, который действительно мне показался шагом вперед в плане юзабельности, KNetworkManager, в котором появилось окошко статуса, strigi &#8211; служба полнотекстового поиска по локальным файлам, и еще опера, которая теперь доступна из &#8216;Canonical partner&#8217; &#8211; репозитория.</p>
<p>Хм. Да вроде бы и все.</p>
<p>Куда больше интересного произошло на работе: нам выдали по второму монитору и видеокарте, и я пару часов потратил на приятнейшие хлопоты с подключением-настройкой всего этого добра. Выяснилось, правда, что по-нормальному со вторым монитором (в режиме xinerama) не работает ни одна из привычных мне систем: в KDE просто не получилось на него вывести никакой полезной информации, в enlightenment 0.16 обнаружился неприятный глюк &#8211; смазывался текст при манипуляциях с окнами. Наверняка все заработало бы в режиме TwinView или MergedFB, но у меня вторая видеокарта &#8211; старая ATI под слот PCI, поэтому другого варианта не было.</p>
<p><img src="http://enlightenment.sourceforge.net/Enlightenment/DR17/images/_images/DR17_shot.png" align="right" alt="скриншот с офсайта"><br />
Искать счастья я стал в e17, и.. нашел!! Я в полном восторге от нее! Все, чем мне нравился e16 там осталось, но как плюс &#8211; красивые темы, полноценная панель управления, гениальнейший диалог быстрого запуска, плагины и сносная поддержка xinerarma.</p>
<p>Недочеты следующие: во-первых, никогда нельзя с уверенностью сказать, на каком мониторе откроется новое приложение, и во-вторых, виртуальные десктопы не общие, а свой набор для каждого монитора. Как оказалось, жизнь это не сильно портит.</p>
<p>Все равно, в итоге я от самых простых вещей теперь тащусь, как удав по стекловате!! </p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2007/10/19/710/feed/</wfw:commentRss>
		<slash:comments>2</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>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>
