<?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; programming</title>
	<atom:link href="http://alexey.sveshnikov.ru/blog/tag/programming/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>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>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>Hint [10]</title>
		<link>http://alexey.sveshnikov.ru/blog/2006/12/23/hint-10/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2006/12/23/hint-10/#comments</comments>
		<pubDate>Sat, 23 Dec 2006 14:14:32 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[UNIX]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[SHELL]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=18</guid>
		<description><![CDATA[[10] Все мы с пеленок знаем, что &#038; значит запустить программу в фоновом режиме, но лично у меня случаи, когда такая форма запуска является оправданной встречаются редко. Хотя недавно я &#8220;открыл для себя&#8221; один из классов таких случаев &#8211; какие-либо действия с сетью, которые сами по себе не ресурсоемки, но могут выполняться долго вследствие больших [...]]]></description>
			<content:encoded><![CDATA[<p>[10] Все мы с пеленок знаем, что &#038; значит запустить программу в фоновом режиме, но лично у меня случаи, когда такая форма запуска является оправданной встречаются редко. Хотя недавно я &#8220;открыл для себя&#8221; один из классов таких случаев &#8211; какие-либо действия с сетью, которые сами по себе не ресурсоемки, но могут выполняться долго вследствие больших таймаутов.</p>
<p>Вот так я проверяю список хвостов на &#8220;пингуемость&#8221;:</p>
<p>cat proxies | (IFS=&#8221;:\n&#8221;; while read ip port; do (if ping -w 1 -c 1 -q $ip>/dev/null; then echo &#8220;$ip:$port&#8221;; else echo &#8220;bad: $ip:$port&#8221;; fi)& done;) | tee proxies_pingable</p>
<p>В данном случае я запускаю в фоне сабшелл (if ping -w 1 -c 1 -q $ip>/dev/null; then echo &#8220;$ip:$port&#8221;; else echo &#8220;bad: $ip:$port&#8221;; fi), потому скрипт приступает к пингу следующего хоста, не дожидаясь, когда завершится проверка предыдущего. Выигрыш по времени пропорционален количеству хостов &#8211; если их 100, то практически стократный!<br />
Правда, нужно быть аккуратным &#8211; если в списке 10 тысяч хостов, то это будет уже больше похоже на DoS.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2006/12/23/hint-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTTP сервер размером в 222 байта :)</title>
		<link>http://alexey.sveshnikov.ru/blog/2006/12/23/http-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80-%d1%80%d0%b0%d0%b7%d0%bc%d0%b5%d1%80%d0%be%d0%bc-%d0%b2-222-%d0%b1%d0%b0%d0%b9%d1%82%d0%b0/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2006/12/23/http-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80-%d1%80%d0%b0%d0%b7%d0%bc%d0%b5%d1%80%d0%be%d0%bc-%d0%b2-222-%d0%b1%d0%b0%d0%b9%d1%82%d0%b0/#comments</comments>
		<pubDate>Sat, 23 Dec 2006 01:30:39 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[SHELL]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[netcat]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://alexey.sveshnikov.ru/blog/?p=17</guid>
		<description><![CDATA[В продолжение предыдущей идеи с передачей файлов по HTTP. Я не удержался и написал вполне полноценный (для нужд раздачи файлов на соседний компьютер) HTTP сервер: while true; do nc -vv -l -p 8080 -c '( read a b c; file=`echo $b &#124; sed 's/[^a-z0-9.]//g'`; if [ a$file = "a" ]; then ( ls &#124; (while [...]]]></description>
			<content:encoded><![CDATA[<p>В продолжение <a href="http://alexey.sveshnikov.ru/blog/2006/12/22/hint-9-swiss-army-knife/">предыдущей идеи</a> с передачей файлов по HTTP. Я не удержался и написал вполне полноценный (для нужд раздачи файлов на соседний компьютер) HTTP сервер:</p>
<p><code>while true; do nc -vv -l -p 8080 -c '( read a b c; file=`echo $b | sed 's/[^a-z0-9.]//g'`; if [ a$file = "a" ]; then ( ls | (while read f; do echo "<a href=$f>$f</a><br />"; done) ); else cat $PWD/$file; fi )'; sleep 1; done</code></p>
<p>(все это &#8211; одна команда, должна вводиться в одну строку. Тестировалось в linux/bash 3.1.17)</p>
<p>Вот и все :) Правда, на этот раз я опять решил отказаться от заголовков ответа, т.к. это слишком усложнит &#8220;команду&#8221;, но при желании их можно взять из <a href="http://alexey.sveshnikov.ru/blog/2006/12/22/hint-9-swiss-army-knife/">предыдущего</a> примера. Этот сервер отдает все файлы, которые есть в текущем каталоге и пытается противодействовать попыткам его сменить. В случае, если запрашивается корневая директория, то управление передается своеобразному mod_index &#8211; т.е. выводится список файлов-ссылок. В конце добавлена задержка в 1 сек для того, чтобы была возможность убить его нажатием Ctrl-C.</p>
<p>Воистину, netcat одна из моих любимых программ!</p>
<p>p.s. Кто теперь осмелится заявить, что я не извращенец? :))</p>
<p><b>UPD: немного доделал его, см <a href="http://alexey.sveshnikov.ru/blog/2007/08/30/bash-httpd-2/">новую версию</a></b></p>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2006/12/23/http-%d1%81%d0%b5%d1%80%d0%b2%d0%b5%d1%80-%d1%80%d0%b0%d0%b7%d0%bc%d0%b5%d1%80%d0%be%d0%bc-%d0%b2-222-%d0%b1%d0%b0%d0%b9%d1%82%d0%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subshell в PERL</title>
		<link>http://alexey.sveshnikov.ru/blog/2006/08/09/subshell-%d0%b2-perl/</link>
		<comments>http://alexey.sveshnikov.ru/blog/2006/08/09/subshell-%d0%b2-perl/#comments</comments>
		<pubDate>Wed, 09 Aug 2006 13:49:45 +0000</pubDate>
		<dc:creator>Alexey Sveshnikov</dc:creator>
				<category><![CDATA[PERL]]></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=7</guid>
		<description><![CDATA[Моя задача сегодня &#8211; сделать так, чтобы один из скриптов имел возможность выполнять какие-либо команды на локальной или удаленной машине. Причем не просто команды, а инлайн перл- и шелл-скрипты (генерируемые на лету), причем их довольно много, а выполнять надо часто, поэтому system() и &#8220; отпадают сразу хотя бы из соображений быстродействия. Итак, в глубинах CPAN [...]]]></description>
			<content:encoded><![CDATA[<p>Моя задача сегодня &#8211; сделать так, чтобы один из скриптов имел возможность выполнять какие-либо команды на локальной или удаленной машине. Причем не просто команды, а инлайн перл- и шелл-скрипты (генерируемые на лету), причем их довольно много, а выполнять надо часто, поэтому system() и &#8220; отпадают сразу хотя бы из соображений быстродействия.</p>
<p>Итак, в глубинах CPAN отыскалось следующее:</p>
<ul>
<li><b>IPC::Open2</b>: Вроде бы получалось запускать (в режиме неблокирующего чтения), но это довольно сложно: во-первых, надо было еще обойти все глюки с буфферизацией ввода-вывода и не наплодить при этом своих, и во-вторых у меня не получилось корректно завершить процесс &#8211; хотя бы перехватить Ctrl-C</li>
<li><b>Expect.pm</b>: Практически идеальный вариант. Все программирование сводится к установке своих обработчиков на появление тех или инных сообщений от запущенной программы. В будущем я скорей всего еще воспользуюсь этим модулем, но в данном случае он не подходит, поскольку для его работы нужен отдельный pty, а этот ресурс может и не быть доступен в тех услових, в которых придется работать моей программе.</li>
<li><b>IPC::Session</b>: Это обертка вокруг IPC::Open3, которая с точки зрения пользователя ведет себя как Excpect.pm &#8211; это мой выбор! Я пока не знаю, чего я лишился, отказавшись от Excpect, который работает через отдельный pty, но пока мне это кажется самым удобным вариантом. <img src="http://www.fishingmagic.com/news/images/editors-choice.jpg" width="40" height="40" />:)</li>
<li><b>Net::SSH::Perl</b>: к сожалению, этот модуль не заработал на моей машине (FreeBSD 4.11) &#8211; зависает во время тестирования один из зависимых модулей. По идее, Net::SSH &#8211; это аналог open3, но работающий с удаленной консолью, а Net::SSH::Perl &#8211; это IPC::Session-подобный интерфейс. Количество зависимостей и размер Bundle::SSH устрашают, но, судя по документации &#8211; вполне подходящий вариант.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alexey.sveshnikov.ru/blog/2006/08/09/subshell-%d0%b2-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
