<?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>JL&#039;s blog</title>
	<atom:link href="http://john.5070.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://john.5070.info</link>
	<description>:-)</description>
	<lastBuildDate>Sun, 06 Dec 2009 17:11:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Всё своё ношу с собой</title>
		<link>http://john.5070.info/2009/12/%d0%b2%d1%81%d1%91-%d1%81%d0%b2%d0%be%d1%91-%d0%bd%d0%be%d1%88%d1%83-%d1%81-%d1%81%d0%be%d0%b1%d0%be%d0%b9/</link>
		<comments>http://john.5070.info/2009/12/%d0%b2%d1%81%d1%91-%d1%81%d0%b2%d0%be%d1%91-%d0%bd%d0%be%d1%88%d1%83-%d1%81-%d1%81%d0%be%d0%b1%d0%be%d0%b9/#comments</comments>
		<pubDate>Sun, 06 Dec 2009 17:11:56 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[жизнь]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=222</guid>
		<description><![CDATA[Отвлечёмся от IT-тем :-) Что-то я себе Анатолия Вассермана в миниатюре стал напоминать. По количеству носимых с собой вещей.
Куртка:

Левый карман: левая тонкая флисовая перчатка, кедровая шишка для поедания
Правый карман: пара к перчатке, жевательная резинка, шапка (&#8221;уши&#8221;), сигареты
Внутренний карман: телефон (*), mp3-плеер (*), зажигалка

Джинсы:

Левый карман: немного денег
Правый карман: ключи, 2-я зажигалка. В маленьком кармане справа до [...]]]></description>
			<content:encoded><![CDATA[<p>Отвлечёмся от IT-тем :-) Что-то я себе Анатолия Вассермана в миниатюре стал напоминать. По количеству носимых с собой вещей.</p>
<p>Куртка:</p>
<ul>
<li>Левый карман: левая тонкая флисовая перчатка, кедровая шишка для поедания</li>
<li>Правый карман: пара к перчатке, жевательная резинка, шапка (&#8221;уши&#8221;), сигареты</li>
<li>Внутренний карман: телефон (*), mp3-плеер (*), зажигалка</li>
</ul>
<p>Джинсы:</p>
<ul>
<li>Левый карман: немного денег</li>
<li>Правый карман: ключи, 2-я зажигалка. В маленьком кармане справа до сих пор периодически обнаруживаю резинки для волос</li>
</ul>
<p>Рюкзак:</p>
<ul>
<li>Большое отделение: ноутбук с блоком питания, мышка, веб-камера, внешний HDD с блоком питания, флейта, иногда различные документы, иногда флиска</li>
<li>Малое отделение: запас полиэтиленовых мешков, минимальная велоаптечка (заплатки, клей, многоразмерный ключ, выжимка для цепи), книжка с рассказами Рэя Бредбери (уже 2 месяца не могу дочитать), иногда скалолазная обвязка, мешочек с магнезией и скальные тапки</li>
<li>Большой карман: флешка, USB bluetooth, спички одного формата, спички другого формата, 3-я зажигалка, фонарик(*), деньги, петарды ( :-) ), ручка, карандаш, маркер, кредитка, паспорт, маленькая записная книжка (надо купить новую), блок питания к телефону, переходник USB-microUSB, варган, иногда губная гармошка</li>
<li>Малый карман №1: минимальная аптечка (пластырь, бинт, йодный карандаш и по мелочи)</li>
<li>Малый карман №2: наушники для компьютера, иногда совсем не понятная мелочь.</li>
</ul>
<p>(*) — удалено в связи с покупкой правильного смартфона.</p>
<p>Так вот, самое отчаяние наступает, когда надо рюкзак временно освободить под другие нужды…</p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/12/%d0%b2%d1%81%d1%91-%d1%81%d0%b2%d0%be%d1%91-%d0%bd%d0%be%d1%88%d1%83-%d1%81-%d1%81%d0%be%d0%b1%d0%be%d0%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>сумасшедший алгоритм</title>
		<link>http://john.5070.info/2009/11/%d1%81%d1%83%d0%bc%d0%b0%d1%81%d1%88%d0%b5%d0%b4%d1%88%d0%b8%d0%b9-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc/</link>
		<comments>http://john.5070.info/2009/11/%d1%81%d1%83%d0%bc%d0%b0%d1%81%d1%88%d0%b5%d0%b4%d1%88%d0%b8%d0%b9-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 16:37:40 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Performance]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[алгоритмы]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=220</guid>
		<description><![CDATA[Уже 3-й день размышляю над алгоритмом следующей задачки.
Дано:

Есть кластер. В кластере живёт несколько узлов. В узле живёт несколько веб-серверов. В веб-сервере живёт несколько аккаунтов. В аккаунте живёт несколько сайтов.
Для каждого сайта известна текущая нагрузка. Соответственно, известна нагрузка для каждого из аккаунтов.
Известно количество сайтов в каждом из аккаунтов.
Для каждого аккаунта сказано, на скольких минимум узлах (не [...]]]></description>
			<content:encoded><![CDATA[<p>Уже 3-й день размышляю над алгоритмом следующей задачки.</p>
<p>Дано:</p>
<ol>
<li>Есть кластер. В кластере живёт несколько узлов. В узле живёт несколько веб-серверов. В веб-сервере живёт несколько аккаунтов. В аккаунте живёт несколько сайтов.</li>
<li>Для каждого сайта известна текущая нагрузка. Соответственно, известна нагрузка для каждого из аккаунтов.</li>
<li>Известно количество сайтов в каждом из аккаунтов.</li>
<li>Для каждого аккаунта сказано, на скольких <em>минимум</em> узлах (не веб-серверах) он должен присутствовать. Пусть это будет <strong>μ</strong>.</li>
<li>Для каждого аккаунта известно, какие веб-серверы обрабатывают его в данный момент.</li>
</ol>
<p>Задача состоит в том, чтобы перераспределить аккаунты по веб-серверам так, чтобы</p>
<ol>
<li>Аккаунты с максимальной нагрузкой присутствовали на максимальном числе узлов. Ну и соразмерно все остальные.</li>
<li>Каждый аккаунт представлен минимум на <strong>μ</strong> узлах.</li>
<li>В пределах одного узла каждый аккаунт представлен лишь один раз.</li>
<li>Текущая нагрузка наиболее равномерно распределена между всеми узлами (или с каким-то коэффициентом — не суть).</li>
<li>Сайты максимально равномерно распределены между всеми веб-серверами, чтобы минимизировать объём памяти каждого из процессов веб-серверов.</li>
<li>Сделать это всё так, чтобы изменения коснулись по возможности минимального количества веб-серверов, чтобы затем минимум их пришлось заставить перечитывать конфиг.</li>
<li>Делать это каким-то хитрым алгоритмом т.к. простой перебор на потенциальные десятки тысяч сайтов может отожрать немало проца и памяти&#8230;</li>
</ol>
<p>Понятно, что идеально соблюсти все условия не получится. Соответственно, надо либо расставить приоритеты условиям, либо ввести коэффициент максимальной допустимой погрешности решения. Решение вырастает весьма объёмным даже для простого перебора. Мне страшно представить о часе, когда надо будет искать более изящные решения.</p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/11/%d1%81%d1%83%d0%bc%d0%b0%d1%81%d1%88%d0%b5%d0%b4%d1%88%d0%b8%d0%b9-%d0%b0%d0%bb%d0%b3%d0%be%d1%80%d0%b8%d1%82%d0%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>… И получился GFS :)</title>
		<link>http://john.5070.info/2009/10/%e2%80%a6-%d0%b8-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d0%bb%d1%81%d1%8f-gfs/</link>
		<comments>http://john.5070.info/2009/10/%e2%80%a6-%d0%b8-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d0%bb%d1%81%d1%8f-gfs/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 06:17:27 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[программирование]]></category>
		<category><![CDATA[ayatku]]></category>
		<category><![CDATA[Ocaml]]></category>
		<category><![CDATA[функтор]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=208</guid>
		<description><![CDATA[Доделал «сырую» реализацию тех самых функторов из предыдущего поста. Умеем хранить элементы размером до  эксабайт. Максимальное количество элементов точно не определено, но примерно равно  и изменением буквально десятка байт кода может быть увеличена до примерно . Правда, при этом увеличивается фактический размер ключей и чуть-чуть падает скорость.
Реализованы функторы: Sized (заодно храним фактический размер [...]]]></description>
			<content:encoded><![CDATA[<p>Доделал «сырую» реализацию тех самых функторов из предыдущего поста. Умеем хранить элементы размером до <img src="http://l.wordpress.com/latex.php?latex=2%5E%7B62%7D%20%3D%204611686018427387904%20%3D%204&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="2^{62} = 4611686018427387904 = 4" style="vertical-align:-20%;" class="tex" alt="2^{62} = 4611686018427387904 = 4" /> эксабайт. Максимальное количество элементов точно не определено, но примерно равно <img src="http://l.wordpress.com/latex.php?latex=2%5E%7B200%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="2^{200}" style="vertical-align:-20%;" class="tex" alt="2^{200}" /> и изменением буквально десятка байт кода может быть увеличена до примерно <img src="http://l.wordpress.com/latex.php?latex=2%5E%7B450%7D&#038;bg=FFFFFF&#038;fg=000000&#038;s=0" title="2^{450}" style="vertical-align:-20%;" class="tex" alt="2^{450}" />. Правда, при этом увеличивается фактический размер ключей и чуть-чуть падает скорость.</p>
<p>Реализованы функторы: Sized (заодно храним фактический размер записи), Splitted (правильнее было бы назвать Striped), Distributed (записи раскидываются по нескольким нижележащим хранилищам), COW (обеспечение почти полной атомарности для всяких сложных хранилищ, типа Splitted, за счёт copy-on-write).</p>
<p>Каким-то сумасшедшим performance пока похвастаться не могу (около 12000 килобайтных выборок в секунду, в случае использования хранилища FileSystem), реализация всё-таки ещё сырая.</p>
<p>Коллега на работе сказанул: «Google BigTable что ли сделал?». Я подумал, и решил, что нет, это Google FS :)</p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/10/%e2%80%a6-%d0%b8-%d0%bf%d0%be%d0%bb%d1%83%d1%87%d0%b8%d0%bb%d1%81%d1%8f-gfs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функционалы против классов</title>
		<link>http://john.5070.info/2009/10/%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8b-%d0%bf%d1%80%d0%be%d1%82%d0%b8%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2/</link>
		<comments>http://john.5070.info/2009/10/%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8b-%d0%bf%d1%80%d0%be%d1%82%d0%b8%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 16:57:30 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Ocaml]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[LWT]]></category>
		<category><![CDATA[функтор]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=203</guid>
		<description><![CDATA[Товарищ (RedChrom) задал вопрос, что я использую больше при разработке на Окамле. Не особо задумываясь ответил, что фифти-фифти. Потом сделал простой grep на свои исходники, и выяснил, что на 80% всё-таки модули и функторы. Причём, объекты и классы по большей части в очень старых исходниках. Сейчас 100% функторы.
Сейчас развлекаюсь написанием универсального интерфейса к разным хранилищам [...]]]></description>
			<content:encoded><![CDATA[<p>Товарищ (RedChrom) задал вопрос, что я использую больше при разработке на Окамле. Не особо задумываясь ответил, что фифти-фифти. Потом сделал простой grep на свои исходники, и выяснил, что на 80% всё-таки модули и функторы. Причём, объекты и классы по большей части в очень старых исходниках. Сейчас 100% функторы.</p>
<p><span id="more-203"></span>Сейчас развлекаюсь написанием универсального интерфейса к разным хранилищам (в первую очередь, это FS, memcached, memcachedb) с записями вида key+value. В качестве основы, создал универсальный интерфейс:</p>

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">module</span> <span style="color: #06c; font-weight: bold;">type</span> STORAGE <span style="color: #a52a2a;">=</span>
        <span style="color: #06c; font-weight: bold;">sig</span>
                <span style="color: #06c; font-weight: bold;">type</span> t
                <span style="color: #06c; font-weight: bold;">type</span> storage_descr_t
&nbsp;
                <span style="color: #06c; font-weight: bold;">val</span> init<span style="color: #a52a2a;">:</span> storage_descr_t <span style="color: #a52a2a;">-&gt;</span> t init_result
&nbsp;
                <span style="color: #06c; font-weight: bold;">val</span> get<span style="color: #a52a2a;">:</span> t <span style="color: #a52a2a;">-&gt;</span> Key<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span> <span style="color: #a52a2a;">-&gt;</span> get_result Lwt<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span>
                <span style="color: #06c; font-weight: bold;">val</span> get_list<span style="color: #a52a2a;">:</span> t <span style="color: #a52a2a;">-&gt;</span> Key<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span> list <span style="color: #a52a2a;">-&gt;</span> get_result Lwt<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span> list
&nbsp;
                <span style="color: #06c; font-weight: bold;">val</span> delete<span style="color: #a52a2a;">:</span> t <span style="color: #a52a2a;">-&gt;</span> Key<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span> <span style="color: #a52a2a;">-&gt;</span> delete_result Lwt<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span>
&nbsp;
                <span style="color: #06c; font-weight: bold;">val</span> set<span style="color: #a52a2a;">:</span> t <span style="color: #a52a2a;">-&gt;</span> Key<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span> <span style="color: #a52a2a;">-&gt;</span> ?value_size<span style="color: #a52a2a;">:</span>value_size <span style="color: #a52a2a;">-&gt;</span> value <span style="color: #a52a2a;">-&gt;</span> set_result Lwt<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span>
                <span style="color: #06c; font-weight: bold;">val</span> add<span style="color: #a52a2a;">:</span> t <span style="color: #a52a2a;">-&gt;</span> Key<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span> <span style="color: #a52a2a;">-&gt;</span> ?value_size<span style="color: #a52a2a;">:</span>value_size <span style="color: #a52a2a;">-&gt;</span> value <span style="color: #a52a2a;">-&gt;</span> add_result Lwt<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span>
                <span style="color: #06c; font-weight: bold;">val</span> replace<span style="color: #a52a2a;">:</span> t <span style="color: #a52a2a;">-&gt;</span> Key<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span> <span style="color: #a52a2a;">-&gt;</span> ?value_size<span style="color: #a52a2a;">:</span>value_size <span style="color: #a52a2a;">-&gt;</span> value <span style="color: #a52a2a;">-&gt;</span> replace_result Lwt<span style="color: #a52a2a;">.</span><span style="color: #060;">t</span>
        <span style="color: #06c; font-weight: bold;">end</span></pre></div></div>

<p>Написал модуль FileSystem, реализующий такой интерфейс. Поскольку файлы могут быть (условно) бесконечного размера, это стало самой простой реализацией интерфейса. Но не всё в жизни так легко. Например, memcached имеет максимальный размер пары key+value где-то в районе 64KB. А хочется в нём хранить побольше. Да и файловые системы бывают дурные. Напрмер, не позволяют создавать файлы больше 512MB. Поэтому на основе FileSystem (ключевое слово import) был написан маленький модуль FileSystemSized, который помимо value пишет в файлик размер value. Штука, на первый взгляд, бесполезная. Но идём дальше. Создаём функтор Splitted, который принимает модуль с интерфейсом STORAGE и делает модули с тем же уже знакомым нам интерфейсом STORAGE. Этот функтор хитрый: он знает, какого максимум размера value может хранить переданный ему модуль. Если в одну запись не влазит — он бьёт value на кусочки, для каждого кусочка генерит свой уникальный ключ, и таким образом пишет. В первом кусочке он сохраняет реальный размер всего value. Вот зачем нам нужен был модуль FileSystemSized. На основе этого функтора получается чудесный модуль FileSystemSplitted. По образу и подобию можно сделать MemcachedSplitted. Или даже FileSystemSplitted_and_again_Splitted, только я не придумал зачем :)</p>
<p>Мыслим вперёд. Ключ у нас — строчка строгой длины, с равной вероятностью имеющая в первом/втором/третьем/&#8230; байте любое из значений 0..255. На основе первого байта ключа, мы можем раскидать пары key+value на 256 физических хранилищ (ну, или меньше, как захочется). Назовём такой функтор Distributed, и он тоже будет создавать модули с интерфейсом STORAGE. Получается изумительная картинка:</p>

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #5d478b; font-style: italic;">(* Создаём уже знакомый нам модуль для хранения больших значений
   в маленьких файлах.
*)</span>
<span style="color: #06c; font-weight: bold;">module</span> FileSystemSplitted <span style="color: #a52a2a;">=</span> Splitted<span style="color: #6c6;">&#40;</span>FileSystemSized<span style="color: #6c6;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">(* Каждое значение хранится в одном файлике, но файлики раскидываются
   по разным директориям.
*)</span>
<span style="color: #06c; font-weight: bold;">module</span> FileSystemDistributed <span style="color: #a52a2a;">=</span> Distributed<span style="color: #6c6;">&#40;</span>FileSystemSized<span style="color: #6c6;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">(* Каждое значение пилится на части, части раскидываются по разным директориям.
   С remote mount, получаем хранилище бесконечного размера для почти
   бесконечного количества значений.
*)</span>
<span style="color: #06c; font-weight: bold;">module</span> FileSystemDistributedSplitted <span style="color: #a52a2a;">=</span> Splitted<span style="color: #6c6;">&#40;</span>FileSystemDistributed<span style="color: #6c6;">&#41;</span>
&nbsp;
<span style="color: #5d478b; font-style: italic;">(* Каждое значение хранится в одной директории, но там оно пилится на части.
   Директорий для хранения может быть несколько. Хранилище получается тоже
   бесконечным, но наполняется не так равномерно.
 *)</span>
<span style="color: #06c; font-weight: bold;">module</span> FileSystemSplittedDistributed <span style="color: #a52a2a;">=</span> Distributed<span style="color: #6c6;">&#40;</span>FileSystemSplitted<span style="color: #6c6;">&#41;</span></pre></div></div>

<p>Как видите, с помощью фактически одного интерфейса и двух функторов, получаем невероятное, лютое количество вариантов хранилища. Даже круче, чем в GlusterFS или GNU Hurd. А ведь мысль можно продолжить ещё дальше, дописав функторы Raid0 (писать значение в несколько хранилищ), Clustered (создаётся на основе списка хранилищ, умеющих только читать и списка хранилищ, умеющих изменять), Flock (за счёт некоторого performace degradation, делать exclusive lock на записи)&#8230; чем я и занимаюсь :) Замечу, что всё это в функционально чисто, без side-effects (они есть только на уровне хранилища) и безумно типобезопасно.</p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/10/%d1%84%d1%83%d0%bd%d0%ba%d1%86%d0%b8%d0%be%d0%bd%d0%b0%d0%bb%d1%8b-%d0%bf%d1%80%d0%be%d1%82%d0%b8%d0%b2-%d0%ba%d0%bb%d0%b0%d1%81%d1%81%d0%be%d0%b2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>О материальности мыслей</title>
		<link>http://john.5070.info/2009/10/%d0%be-%d0%bc%d0%b0%d1%82%d0%b5%d1%80%d0%b8%d0%b0%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%bc%d1%8b%d1%81%d0%bb%d0%b5%d0%b9/</link>
		<comments>http://john.5070.info/2009/10/%d0%be-%d0%bc%d0%b0%d1%82%d0%b5%d1%80%d0%b8%d0%b0%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%bc%d1%8b%d1%81%d0%bb%d0%b5%d0%b9/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 05:31:48 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Туризм и спорт]]></category>
		<category><![CDATA[жизнь]]></category>
		<category><![CDATA[туризм]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=200</guid>
		<description><![CDATA[Год бредил идеей съездить куда-нибудь в заполярье. И вот, буквально за 3 дня поступили предложения:

Летом на великах по Скандинавии
Пешком по Норвегии
Весной дикарями на полярный Урал смотреть северное сияние
На новый год на машинах до г.Мирного (Якутия). Но тут я больше сам напрашиваюсь.

]]></description>
			<content:encoded><![CDATA[<p>Год бредил идеей съездить куда-нибудь в заполярье. И вот, буквально за 3 дня поступили предложения:</p>
<ul>
<li>Летом на великах по Скандинавии</li>
<li>Пешком по Норвегии</li>
<li>Весной дикарями на полярный Урал смотреть северное сияние</li>
<li>На новый год на машинах до г.Мирного (Якутия). Но тут я больше сам напрашиваюсь.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/10/%d0%be-%d0%bc%d0%b0%d1%82%d0%b5%d1%80%d0%b8%d0%b0%d0%bb%d1%8c%d0%bd%d0%be%d1%81%d1%82%d0%b8-%d0%bc%d1%8b%d1%81%d0%bb%d0%b5%d0%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript: безопасный код</title>
		<link>http://john.5070.info/2009/10/javascript-%d0%b1%d0%b5%d0%b7%d0%be%d0%bf%d0%b0%d1%81%d0%bd%d1%8b%d0%b9-%d0%ba%d0%be%d0%b4/</link>
		<comments>http://john.5070.info/2009/10/javascript-%d0%b1%d0%b5%d0%b7%d0%be%d0%bf%d0%b0%d1%81%d0%bd%d1%8b%d0%b9-%d0%ba%d0%be%d0%b4/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 03:00:56 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Ocaml]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[O'Browser]]></category>
		<category><![CDATA[ocamljs]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=193</guid>
		<description><![CDATA[Давно собирался написать нечто подобное, да всё руки не доходили. Толчком послужил краткий пост на аналогичную тему у моего знакомого.
Как известно, JavaScript — язык c динамической (для классов с утиной) типизацией, с очень плохо развитой системой типов. Стандартный интерпретатор даже в браузерах Mozilla с расширениями разработчика отлавливает минимум ошибок. Практически все эти ошибки — синтаксические. [...]]]></description>
			<content:encoded><![CDATA[<p>Давно собирался написать нечто подобное, да всё руки не доходили. Толчком послужил краткий пост на аналогичную тему у моего знакомого.</p>
<p>Как известно, JavaScript — язык c динамической (для классов с утиной) типизацией, с очень плохо развитой системой типов. Стандартный интерпретатор даже в браузерах Mozilla с расширениями разработчика отлавливает минимум ошибок. Практически все эти ошибки — синтаксические. В результате, писать надёжный код на JavaScript предельно сложно. Положение усугубляет фактическая невозможность запуска программы без использования браузера, т.е. нет никакой песочницы для тестов.</p>
<p>В этой статье я попытаюсь описать некоторые технологии, которые помогут знакомому с Ocaml человеку существенно сократить время написания безопасного, стабильного и более-менее компактного JS-кода. Впрочем, описываемые техники есть и для некоторых других языков с развитой системой типов (например, Haskell).</p>
<p><span id="more-193"></span></p>
<h1>Ocamljs: компилятор Ocaml ⇒ JavaScript</h1>
<p>Скачать: <a href="http://code.google.com/p/ocamljs/">http://code.google.com/p/ocamljs/</a></p>
<p>Всё просто: вы пишете client-side код вашего сайта на Ocaml, а с помощью этого компилятора получаете готовый для использования в браузере JavaScript. Для обеспечения работы, непосредственно к вашему скрипту дописывается около 40KB дополнительного кода. Например. Ни к чему не обязывающий код:</p>

<div class="wp_syntax"><div class="code"><pre class="ocaml" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">type</span> tree <span style="color: #a52a2a;">=</span>
	<span style="color: #a52a2a;">|</span> Leaf <span style="color: #06c; font-weight: bold;">of</span> int
	<span style="color: #a52a2a;">|</span> Node <span style="color: #06c; font-weight: bold;">of</span> tree list
&nbsp;
<span style="color: #06c; font-weight: bold;">let</span> l <span style="color: #a52a2a;">:</span> tree list <span style="color: #a52a2a;">=</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span>
&nbsp;
<span style="color: #06c; font-weight: bold;">let</span> _ <span style="color: #a52a2a;">=</span>
	<span style="color: #06c; font-weight: bold;">match</span> l <span style="color: #06c; font-weight: bold;">with</span>
	<span style="color: #a52a2a;">|</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">-&gt;</span> Dom<span style="color: #a52a2a;">.</span><span style="color: #060;">window</span><span style="color: #a52a2a;">#</span>alert <span style="color: #3cb371;">&quot;empty list&quot;</span>
	<span style="color: #a52a2a;">|</span> a <span style="color: #a52a2a;">::</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span>
	<span style="color: #a52a2a;">|</span> a <span style="color: #a52a2a;">::</span> b <span style="color: #a52a2a;">::</span> <span style="color: #6c6;">&#91;</span><span style="color: #6c6;">&#93;</span> <span style="color: #a52a2a;">-&gt;</span> <span style="color: #6c6;">&#40;</span><span style="color: #6c6;">&#41;</span>
	<span style="color: #a52a2a;">|</span> _ <span style="color: #a52a2a;">-&gt;</span> Dom<span style="color: #a52a2a;">.</span><span style="color: #060;">window</span><span style="color: #a52a2a;">#</span>alert <span style="color: #3cb371;">&quot;unexpected list&quot;</span></pre></div></div>

<p>Компилируем:</p>
<pre>ocamljs -o test.js -I /usr/local/lib/ocaml/3.10.2/dom/ dom.cmjsa test.ml</pre>
<p>Получаем вот такой код:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// .....</span>
<span style="color: #003366; font-weight: bold;">var</span> oc$Dom$ <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #003366; font-weight: bold;">var</span> window$<span style="color: #CC0000;">717</span> <span style="color: #339933;">=</span> window<span style="color: #339933;">;</span>
                            <span style="color: #003366; font-weight: bold;">var</span> document$<span style="color: #CC0000;">718</span> <span style="color: #339933;">=</span> document<span style="color: #339933;">;</span>
                            <span style="color: #000066; font-weight: bold;">return</span> $<span style="color: #009900;">&#40;</span>window$<span style="color: #CC0000;">717</span><span style="color: #339933;">,</span> document$<span style="color: #CC0000;">718</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> oc$<span style="color: #CC0000;">1</span>$ <span style="color: #339933;">=</span>
  <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> l$<span style="color: #CC0000;">63</span> <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>l$<span style="color: #CC0000;">63</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #003366; font-weight: bold;">var</span> match$<span style="color: #CC0000;">71</span> <span style="color: #339933;">=</span> l$<span style="color: #CC0000;">63</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>match$<span style="color: #CC0000;">71</span><span style="color: #009900;">&#41;</span>
      <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>match$<span style="color: #CC0000;">71</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #003366; font-weight: bold;">var</span> v$<span style="color: #CC0000;">74</span> <span style="color: #339933;">=</span> oc$Dom$<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                                      <span style="color: #000066; font-weight: bold;">return</span> _m<span style="color: #009900;">&#40;</span>v$74.<span style="color: #000066;">alert</span><span style="color: #339933;">,</span> v$<span style="color: #CC0000;">74</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;unexpected list&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #003366; font-weight: bold;">var</span> v$<span style="color: #CC0000;">73</span> <span style="color: #339933;">=</span> oc$Dom$<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                        <span style="color: #000066; font-weight: bold;">return</span> _m<span style="color: #009900;">&#40;</span>v$73.<span style="color: #000066;">alert</span><span style="color: #339933;">,</span> v$<span style="color: #CC0000;">73</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;empty list&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> $<span style="color: #009900;">&#40;</span>l$<span style="color: #CC0000;">63</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> oc$Std_exit$ <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>_<span style="color: #009900;">&#40;</span>oc$Pervasives$<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">80</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> $<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">return</span> caml_named_value<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>JavaScript compressor</h2>
<p>Как я уже сказал, код получается достаточно объёмным. Частично эту проблему решает gzip (при условии, что и сервер, и браузер имеют его поддержку). Однако, код можно существенно сократить за счёт оптимизации по размеру. Для этого есть ряд готовых online-утилит. Используемые техники:</p>
<ul>
<li>Удаление комментариев</li>
<li>Удаление не несущих синтаксической нагрузки пробелов и переносов строк</li>
<li>Назначение локальным переменным функций более коротких имён</li>
<li>Вынесение длинных повторяющихся констант в переменную с коротким именем</li>
</ul>
<p>Наилучшие результаты показывает Packer (<a href="http://dean.edwards.name/packer/">http://dean.edwards.name/packer/</a>), однако ocamljs компилирует не полностью корректный код — иногда забывает точки с запятой — поэтому Packer генерирует не работающий код. С учётом некорректности оригинального кода, наилучший результат показал Dojo ShrinkSafe (<a href="http://www.dojotoolkit.org/docs/shrinksafe">http://www.dojotoolkit.org/docs/shrinksafe</a>). Рекомендую прогнать код через валидатор (<a href="http://jslint.com/">http://jslint.com/</a>), это в любом случае неплохая идея. Пример кода, получающегося с помощью Dojo ShrinkSafe:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// .....</span>
<span style="color: #003366; font-weight: bold;">var</span> _213<span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #003366; font-weight: bold;">var</span> l$<span style="color: #CC0000;">63</span><span style="color: #339933;">=</span><span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>l$<span style="color: #CC0000;">63</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #003366; font-weight: bold;">var</span> _215<span style="color: #339933;">=</span>l$<span style="color: #CC0000;">63</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>_215<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>_215<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #003366; font-weight: bold;">var</span> v$<span style="color: #CC0000;">74</span><span style="color: #339933;">=</span>_210<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">return</span> _m<span style="color: #009900;">&#40;</span>v$74.<span style="color: #000066;">alert</span><span style="color: #339933;">,</span>v$<span style="color: #CC0000;">74</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;unexpected list&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #000066; font-weight: bold;">else</span><span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #003366; font-weight: bold;">var</span> v$<span style="color: #CC0000;">73</span><span style="color: #339933;">=</span>_210<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">return</span> _m<span style="color: #009900;">&#40;</span>v$73.<span style="color: #000066;">alert</span><span style="color: #339933;">,</span>v$<span style="color: #CC0000;">73</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;empty list&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000066; font-weight: bold;">return</span> $<span style="color: #009900;">&#40;</span>l$<span style="color: #CC0000;">63</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> _218<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>_<span style="color: #009900;">&#40;</span>_106<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">80</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>$<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">return</span> _9d<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Код получается практически не читаемым, зато размер сокращается в 2-4 раза.</p>
<p>Быстро сравнить различные компрессоры можно на сайте: <a href="http://compressorrater.thruhere.net/">http://compressorrater.thruhere.net/</a></p>
<h1>O&#8217;Browser: виртуальная машина на JavaScript</h1>
<p>Скачать: <a href="http://ocsigen.org/obrowser/">http://ocsigen.org/obrowser/</a></p>
<p>Ваш код будет скомпилирован в байт-код, закодированный в UUE. Для вызова кода, достаточно вызвать его в виртуальной машине:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">&lt;script src=&quot;vm.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
  <span style="color: #009966; font-style: italic;">/* &lt;![CDATA[ */</span>
    window.<span style="color: #000066;">onload</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      exec_caml <span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;tutorial.exe.uue&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009966; font-style: italic;">/* ]]&gt; */</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Байт-код получается достаточно объёмным, да и сжатию поддаётся только за счёт слоя gzip. Впрочем, код самой виртуальной машины вполне поддаётся обработке JavaScript компрессоров. Валидность кода получается даже выше, чем у ocamljs. Декомпиляция байт-кода в нормальный JavaScript становится нерешаемой проблемой :)</p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/10/javascript-%d0%b1%d0%b5%d0%b7%d0%be%d0%bf%d0%b0%d1%81%d0%bd%d1%8b%d0%b9-%d0%ba%d0%be%d0%b4/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Цинично о посещении Шевчука</title>
		<link>http://john.5070.info/2009/10/%d1%86%d0%b8%d0%bd%d0%b8%d1%87%d0%bd%d0%be-%d0%be-%d0%bf%d0%be%d1%81%d0%b5%d1%89%d0%b5%d0%bd%d0%b8%d0%b8-%d1%88%d0%b5%d0%b2%d1%87%d1%83%d0%ba%d0%b0/</link>
		<comments>http://john.5070.info/2009/10/%d1%86%d0%b8%d0%bd%d0%b8%d1%87%d0%bd%d0%be-%d0%be-%d0%bf%d0%be%d1%81%d0%b5%d1%89%d0%b5%d0%bd%d0%b8%d0%b8-%d1%88%d0%b5%d0%b2%d1%87%d1%83%d0%ba%d0%b0/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 01:16:16 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ДДТ]]></category>
		<category><![CDATA[музыка]]></category>
		<category><![CDATA[Шевчук]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=191</guid>
		<description><![CDATA[Сходил на ДДТ. Впервые в жизни был на выступлении лирической группы. Если на Soulfly океан драйва (и соответствующий отрыв), на Пикнике достаточно много интеллекта (пафосно хлопаем после каждой песни), то тут я совсем не понял, как развлекаться. По заявлениям множества участников, драйва было много. Но, видимо, не для любителя &#8220;чего-нибудь потяжелее&#8221; :) Для себя сделал [...]]]></description>
			<content:encoded><![CDATA[<p>Сходил на ДДТ. Впервые в жизни был на выступлении лирической группы. Если на Soulfly океан драйва (и соответствующий отрыв), на Пикнике достаточно много интеллекта (пафосно хлопаем после каждой песни), то тут я совсем не понял, как развлекаться. По заявлениям множества участников, драйва было много. Но, видимо, не для любителя &#8220;чего-нибудь потяжелее&#8221; :) Для себя сделал вывод, что Шевчука надо слушать либо в наушниках, либо узким кругом.</p>
<p>Вероятно, многие видели, как на выступлениях подобных групп над залом горят зажигалки. Так вот, это оптическая иллюзия. На самом деле, это экранчики фотоаппаратов! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/10/%d1%86%d0%b8%d0%bd%d0%b8%d1%87%d0%bd%d0%be-%d0%be-%d0%bf%d0%be%d1%81%d0%b5%d1%89%d0%b5%d0%bd%d0%b8%d0%b8-%d1%88%d0%b5%d0%b2%d1%87%d1%83%d0%ba%d0%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Губительный телефон — 03</title>
		<link>http://john.5070.info/2009/10/%d0%b3%d1%83%d0%b1%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d1%82%d0%b5%d0%bb%d0%b5%d1%84%d0%be%d0%bd-%e2%80%94-03/</link>
		<comments>http://john.5070.info/2009/10/%d0%b3%d1%83%d0%b1%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d1%82%d0%b5%d0%bb%d0%b5%d1%84%d0%be%d0%bd-%e2%80%94-03/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 01:33:44 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[жизнь в России]]></category>
		<category><![CDATA[жизнь]]></category>
		<category><![CDATA[карма]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=189</guid>
		<description><![CDATA[Возвращаюсь с тренировки. Вечер, роща, темно. Лежит мужик. Не откликается. Дай, думаю, карму себе поправлю, скорую вызову.
Как с сотового набрать 03 я не знаю, позвонил в МЧС (112). Там мне моментально вежливо ответили, что надо набрать 03*. Позвонил.
— Здравствуйте, в роще между Студгородком и Университетским какой-то мужик лежит, ни на что не реагирует.
— Скажите адрес.
— [...]]]></description>
			<content:encoded><![CDATA[<p>Возвращаюсь с тренировки. Вечер, роща, темно. Лежит мужик. Не откликается. Дай, думаю, карму себе поправлю, скорую вызову.</p>
<p><span id="more-189"></span>Как с сотового набрать 03 я не знаю, позвонил в МЧС (112). Там мне моментально вежливо ответили, что надо набрать 03*. Позвонил.</p>
<p>— Здравствуйте, в роще между Студгородком и Университетским какой-то мужик лежит, ни на что не реагирует.</p>
<p>— Скажите адрес.</p>
<p>— Это роща, у неё нет адреса.</p>
<p>— Ну тогда скажите как доехать.</p>
<p>— [бла-бла-бла]</p>
<p>— Не понимаю&#8230;</p>
<p>— У вас карта под рукой?</p>
<p>— Да, ещё раз скажите как доехать.</p>
<p>— [бла-бла-бла]</p>
<p>— Всё равно не понимаю. Оставьте ваш телефон, не занимайте его.</p>
<p>— 223-322-333</p>
<p>Проходит 10 минут, я уже в километре оттуда. Звонок:</p>
<p>— Вы скорую вызывали?</p>
<p>— Да.</p>
<p>— Как доехать?</p>
<p>(устало, в третий раз) — Остановку Политех знаете? — Да. — Трамвайное кольцо знаете? — Да. — Воот, от остановки едете мимо трамвайного кольца до самого верха, до улицы, на которой военкомат расположен. Как доедете до верха, сразу перед вами роща начнётся. Вот по ней пройдёте немного и увидите, прямо на дороге он лежит.</p>
<p>— Назовите юридический адрес.</p>
<p>— Юридический адрес рощи?</p>
<p>— А куда нам ехать?! Скажите юридический адрес!</p>
<p>(начинаю злиться) — Вы сами подумайте, какой юридический адрес может быть <strong>у рощи</strong>?!</p>
<p>— Тогда ждите нас!</p>
<p>— Извините, но я уже далеко оттуда.</p>
<p>— Тогда идите назад и ждите! Вы понимаете, что несёте юридическую ответственность за вызов? Как мы там в темноте его искать будем?</p>
<p>— Я не понял, это вы скорая, или я? Почему у меня с собой фонарик есть, а у вас нет? Почему вы не можете разобраться в двух улицах, если у вас даже карта перед глазами есть?</p>
<p>— Вы несёте юридическую ответственность за вызов! Ждите нас!</p>
<p>— Если я через 15 минут подойду — вас устроит?</p>
<p>— Да.</p>
<p>— Досвидания.</p>
<p>Пошёл обратно. По пути (по прошествии получаса-то!) обнаружил, что мужика уже нет. То ли прохожие какие унесли, то ли сам очухался. Лежал лицом вниз. Перезваниваю на 03:</p>
<p>— Здравствуйте, делал вызов в рощу рядом с Политехом, пострадавший покинул место.</p>
<p>— Вызов отменяем?</p>
<p>— Да.</p>
<p>И тут я услышал первое вежливое слово от достопочтимой скорой:</p>
<p>— Спасибо большое за ваш звонок.</p>
<p>Видимо, обрадовались, что вызов всё-таки отменён. Отсюда мораль: то ли скорая у нас хреновая, то ли карма у меня уже раскачана до максимального уровня, дальше прокачать уже нельзя :)</p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/10/%d0%b3%d1%83%d0%b1%d0%b8%d1%82%d0%b5%d0%bb%d1%8c%d0%bd%d1%8b%d0%b9-%d1%82%d0%b5%d0%bb%d0%b5%d1%84%d0%be%d0%bd-%e2%80%94-03/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Накаячились!</title>
		<link>http://john.5070.info/2009/09/%d0%bd%d0%b0%d0%ba%d0%b0%d1%8f%d1%87%d0%b8%d0%bb%d0%b8%d1%81%d1%8c/</link>
		<comments>http://john.5070.info/2009/09/%d0%bd%d0%b0%d0%ba%d0%b0%d1%8f%d1%87%d0%b8%d0%bb%d0%b8%d1%81%d1%8c/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 15:31:24 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[Туризм и спорт]]></category>
		<category><![CDATA[видео]]></category>
		<category><![CDATA[каяк]]></category>
		<category><![CDATA[туризм]]></category>
		<category><![CDATA[Хамар-Дабан]]></category>
		<category><![CDATA[Хара-Мурин]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=180</guid>
		<description><![CDATA[Видео с кипящими чайниками на борту каяков. Мероприятие состоялось на р.Хара-Мурин, порог Лангутайский.

То же, но в хорошем качестве: kayak2009.avi
]]></description>
			<content:encoded><![CDATA[<p>Видео с кипящими чайниками на борту каяков. Мероприятие состоялось на р.Хара-Мурин, порог Лангутайский.</p>
<p><img src="http://john.5070.info/wp-content/plugins/flash-video-player/default_video_player.gif" /></p>
<p>То же, но в хорошем качестве: <a href="http://john.5070.info/wp-content/uploads//kayak2009.avi">kayak2009.avi</a></p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/09/%d0%bd%d0%b0%d0%ba%d0%b0%d1%8f%d1%87%d0%b8%d0%bb%d0%b8%d1%81%d1%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://john.5070.info/wp-content/uploads//kayak2009.avi" length="230477210" type="video/x-msvideo" />
		</item>
		<item>
		<title>Про офис ISPsystem</title>
		<link>http://john.5070.info/2009/09/%d0%bf%d1%80%d0%be-%d0%be%d1%84%d0%b8%d1%81-ispsystem/</link>
		<comments>http://john.5070.info/2009/09/%d0%bf%d1%80%d0%be-%d0%be%d1%84%d0%b8%d1%81-ispsystem/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 10:23:58 +0000</pubDate>
		<dc:creator>John Lepikhin</dc:creator>
				<category><![CDATA[жизнь в России]]></category>
		<category><![CDATA[ISPsystem]]></category>
		<category><![CDATA[жизнь]]></category>

		<guid isPermaLink="false">http://john.5070.info/?p=178</guid>
		<description><![CDATA[Уже давно собирался описать весь тот бардак, который у нас происходит, да всё руки не доходили. И вот, это сделали за меня! Как миним треть сказанного по этой ссылке можно приписать к нам: http://x.lenta.ru/facts/
]]></description>
			<content:encoded><![CDATA[<p>Уже давно собирался описать весь тот бардак, который у нас происходит, да всё руки не доходили. И вот, это сделали за меня! Как миним треть сказанного по этой ссылке можно приписать к нам: <a href="http://x.lenta.ru/facts/">http://x.lenta.ru/facts/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://john.5070.info/2009/09/%d0%bf%d1%80%d0%be-%d0%be%d1%84%d0%b8%d1%81-ispsystem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

