<?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:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_10_thread_34255"  />
<title>rulinux.net - Форум - Talks - Никто случайно не хочет Эрланг поизучать,</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Talks - Никто случайно не хочет Эрланг поизучать,</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re: Никто случайно не хочет Эрланг поизучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=2#102812</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=2#102812</guid>
<pubDate>Fri, 09 Sep 2011 14:12:57 +0400</pubDate>
<description><![CDATA[<p>Наконец-то зарелизили второй мойшевеб. Поздравляю всех эрлангеров. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=2#102811</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=2#102811</guid>
<pubDate>Sat, 20 Aug 2011 09:23:30 +0400</pubDate>
<description><![CDATA[<p><i>> Возьми мойшевеб  &nbsp;<a href="https://github.com/mochi/mochiweb">https://github.com/mochi/mochiweb</a> </i><br><i>> Присоединяюсь, похоже это лучший выбор на данный момент.</i><br> Спасибо.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=2#102810</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=2#102810</guid>
<pubDate>Fri, 19 Aug 2011 08:14:43 +0400</pubDate>
<description><![CDATA[<p><i>> Возьми мойшевеб  &nbsp;<a href="https://github.com/mochi/mochiweb">https://github.com/mochi/mochiweb</a></i><br> Присоединяюсь, похоже это лучший выбор на данный момент.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=2#102809</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=2#102809</guid>
<pubDate>Fri, 19 Aug 2011 04:23:42 +0400</pubDate>
<description><![CDATA[<p>Возьми мойшевеб &nbsp;<a href="https://github.com/mochi/mochiweb">https://github.com/mochi/mochiweb</a></p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=2#102808</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=2#102808</guid>
<pubDate>Thu, 18 Aug 2011 16:47:18 +0400</pubDate>
<description><![CDATA[<p>Хочу себе HTTP сервер запилить на ерланге, с ламбда исчислением и рекурсиями. Цель - обрабатывать  POST-запросы клиента, и выдавать в ответ файлы или XML контент. Какой сервер, или библиотеки вы мне посоветуйте? </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=2#102807</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=2#102807</guid>
<pubDate>Thu, 18 Aug 2011 14:37:43 +0400</pubDate>
<description><![CDATA[<p>Судя по количеству комитовмойшу пилят активно. Насколько я понял вебсервер на эрланге по дефолту,  фактически уже считается мойша.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102806</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102806</guid>
<pubDate>Thu, 18 Aug 2011 14:34:38 +0400</pubDate>
<description><![CDATA[<p><i>> не используешь gen_server?</i><br> Как я писал это результат распаривания Мойши. Я просто упрастил немого код и отвязал от своего сокета Мойши. Пул акцеторов в мойше точно такой же. </p><p> Почему не ген_сервер? А зачем генсервер? процессы акцепторов полностью констролируются процесом сервера. Патерн генсервера предполагает насколько я понял, что его жизнью и смертью занимается супервизор причем использую примитивный алгоритм "упало=поднял". Здесь такой компот не пойдет, алгоритм совсем другой другой.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102805</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102805</guid>
<pubDate>Tue, 16 Aug 2011 20:50:12 +0400</pubDate>
<description><![CDATA[<p>Да и вообще, задумался переходить ли на мойшевеб с yaws или забить, какие подводные камни? Последний стабильный мойша 1.5.2, а что слышно про релиз 2.0, тот что активно пилят? </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102804</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102804</guid>
<pubDate>Tue, 16 Aug 2011 20:41:12 +0400</pubDate>
<description><![CDATA[<p>Вроде нормально написано, только почему здесь</p><p><fieldset><legend>erlang</legend><code><br />
<br />
<span style="color: #666666; font-style: italic;">%% Запуск процесса акцептора</span><br />
<br />
&nbsp;start_<span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Server</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Listen</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Loop</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
<br />
&nbsp; &nbsp; &nbsp;<a href="http://erlang.org/doc/man/proc_lib.html"><span style="color: #ff4e18;">proc_lib</span></a>:<span style="color: #fa6fff;">spawn_link</span><span style="color: #109ab8;">&#40;</span>?<span style="color: #6941fd;">MODULE</span><span style="color: #6bb810;">,</span> init<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Server</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Listen</span><span style="color: #6bb810;">,</span><br />
<br />
&nbsp;</code></fieldset></p><p>не используешь gen_server?</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102803</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102803</guid>
<pubDate>Sat, 13 Aug 2011 20:05:37 +0400</pubDate>
<description><![CDATA[<p><fieldset><legend>erlang</legend><code><br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>tcp_acceptor<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<span style="color: #666666; font-style: italic;">%% Акцептор для применения с tcp_server</span><br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>start_link<span style="color: #014ea4;">/</span><span style="color: #ff9600;">3</span><span style="color: #6bb810;">,</span> init<span style="color: #014ea4;">/</span><span style="color: #ff9600;">3</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #666666; font-style: italic;">%% Запуск процесса акцептора</span><br />
start_<span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Server</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Listen</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Loop</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <a href="http://erlang.org/doc/man/proc_lib.html"><span style="color: #ff4e18;">proc_lib</span></a>:<span style="color: #fa6fff;">spawn_link</span><span style="color: #109ab8;">&#40;</span>?<span style="color: #6941fd;">MODULE</span><span style="color: #6bb810;">,</span> init<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Server</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Listen</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Loop</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #666666; font-style: italic;">%% Инициализация процесса акцептора</span><br />
<span style="color: #ff3c00;">init</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Server</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Payload</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <span style="color: #186895;">catch</span> <a href="http://erlang.org/doc/man/gen_tcp.html"><span style="color: #ff4e18;">gen_tcp</span></a>:<span style="color: #ff3c00;">accept</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">LSocket</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Socket</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% Уведомляю, что акцептор принял подключение</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://erlang.org/doc/man/gen_server.html"><span style="color: #ff4e18;">gen_server</span></a>:<span style="color: #ff3c00;">cast</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Server</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>accepted<span style="color: #6bb810;">,</span> <span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #186895;">case</span> <span style="color: #45b3e6;">Payload</span> <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Module</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Function</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Args</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% модуль:функция с параметром</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://erlang.org/doc/man/erlang.html"><span style="color: #ff4e18;">erlang</span></a>:<span style="color: #fa6fff;">apply</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Module</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Function</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Socket</span> | <span style="color: #45b3e6;">Args</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Module</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Function</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% модуль:функция</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">Module</span>:<span style="color: #006600;">F</span><span style="color: #ff3c00;">unction</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Function</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% функция</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">F</span><span style="color: #ff3c00;">unction</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #109ab8;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>error<span style="color: #6bb810;">,</span> closed<span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> &nbsp;<span style="color: #666666; font-style: italic;">%% LSocket закрылся</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #fa6fff;">exit</span><span style="color: #109ab8;">&#40;</span>normal<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>error<span style="color: #6bb810;">,</span> timeout<span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% таймаут</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff3c00;">init</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Server</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Payload</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">Reson</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% Ошибка</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #fa6fff;">exit</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#123;</span>accepting_error<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Reson</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span><br />
&nbsp;</code></fieldset></p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102802</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102802</guid>
<pubDate>Sat, 13 Aug 2011 20:04:50 +0400</pubDate>
<description><![CDATA[<p><fieldset><legend>erlang</legend><code><br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>tcp_server<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<span style="color: #666666; font-style: italic;">%% Асинхронный OTP/Erlang TCP сервер</span><br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>start_link<span style="color: #014ea4;">/</span><span style="color: #ff9600;">2</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<span style="color: #666666; font-style: italic;">%% Использую поведение get_server</span><br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>init<span style="color: #014ea4;">/</span>1<span style="color: #6bb810;">,</span> terminate<span style="color: #014ea4;">/</span>2<span style="color: #6bb810;">,</span> code_change<span style="color: #014ea4;">/</span>3<span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;handle_call<span style="color: #014ea4;">/</span>3<span style="color: #6bb810;">,</span> handle_cast<span style="color: #014ea4;">/</span>2<span style="color: #6bb810;">,</span> handle_info<span style="color: #014ea4;">/</span>2<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">define</span><span style="color: #109ab8;">&#40;</span><span style="color: #6941fd;">TCP_OPTIONS</span><span style="color: #6bb810;">,</span> <span style="color: #666666; font-style: italic;">%% Параметры TCP</span><br />
&nbsp; &nbsp; <span style="color: #109ab8;">&#91;</span><span style="color: #fa6fff;">binary</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>packet<span style="color: #6bb810;">,</span> 0<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>active<span style="color: #6bb810;">,</span> false<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>reuseaddr<span style="color: #6bb810;">,</span> true<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">record</span><span style="color: #109ab8;">&#40;</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span> <span style="color: #666666; font-style: italic;">%% Параметры и состояние сервера</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% параметры</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; name<span style="color: #6bb810;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Имя процесса сервера</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ip<span style="color: #6bb810;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% IP адрес</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; port<span style="color: #6bb810;">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Номер порт</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; payload<span style="color: #6bb810;">,</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">%% Функция реализующая серверный протокол</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pool_size<span style="color: #6bb810;">,</span> &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">%% Кол-во акцепторов ожидающих акцепторов</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% состояние</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; lsocket<span style="color: #6bb810;">,</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">%% Серверный &quot;слушающий&quot; сокет</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; acceptors<span style="color: #6bb810;">,</span> &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">%% Пул акцепторов ожидающих входящих подключений</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; client_count<span style="color: #014ea4;">=</span><span style="color: #ff9600;">0</span> &nbsp;<span style="color: #666666; font-style: italic;">%% Количество текущих клиентских подключений</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<br />
<br />
<span style="color: #666666; font-style: italic;">%% Запуск сервера</span><br />
<span style="color: #666666; font-style: italic;">%% Options - список параметров заданных как кортеж {Key, Value}</span><br />
<span style="color: #666666; font-style: italic;">%% Функция реализующая серверный протокол принимающая параметром сокет</span><br />
start_<span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Options</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Payload</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">State</span> <span style="color: #014ea4;">=</span> #<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span> <span style="color: #666666; font-style: italic;">%% параметры по умалчиванию</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ip<span style="color: #014ea4;">=</span><span style="color: #109ab8;">&#123;</span>127<span style="color: #6bb810;">,</span>0<span style="color: #6bb810;">,</span>0<span style="color: #6bb810;">,</span>1<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> port<span style="color: #014ea4;">=</span>5007<span style="color: #6bb810;">,</span> pool_size<span style="color: #014ea4;">=</span>16<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <br />
&nbsp; &nbsp; <span style="color: #45b3e6;">NewState</span> <span style="color: #014ea4;">=</span> <span style="color: #ff3c00;">parse_options</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Options</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>payload<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Payload</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Запускаю серверный процесс как gen_server с параметром ReadyState</span><br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <span style="color: #45b3e6;">NewState</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">.</span>name <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; undefined <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% запуск процесса без имени</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://erlang.org/doc/man/gen_server.html"><span style="color: #ff4e18;">gen_server</span></a>:<span style="color: #006600;">start_</span><span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span>?<span style="color: #6941fd;">MODULE</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NewState</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">_</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% запуск процесса с заданным именем</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://erlang.org/doc/man/gen_server.html"><span style="color: #ff4e18;">gen_server</span></a>:<span style="color: #006600;">start_</span><span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">NewState</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">.</span>name<span style="color: #6bb810;">,</span> ?<span style="color: #6941fd;">MODULE</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NewState</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span><br />
&nbsp; &nbsp; <br />
<br />
<span style="color: #666666; font-style: italic;">%% Разбор параметров запуска сервера</span><br />
<span style="color: #ff3c00;">parse_options</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Key</span><span style="color: #6bb810;">,</span><span style="color: #45b3e6;">Value</span><span style="color: #109ab8;">&#125;</span>|Rest<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Разбираю ведущий элемент списка параметров</span><br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <span style="color: #45b3e6;">Key</span> <span style="color: #186895;">of</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; name &nbsp;<span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">parse_options</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Rest</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>name<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Value</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ip &nbsp;<span style="color: #6bb810;">-&gt;</span> &nbsp; <span style="color: #ff3c00;">parse_options</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Rest</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>ip<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Value</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; port &nbsp;<span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">parse_options</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Rest</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>port<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Value</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">_</span> <span style="color: #6bb810;">-&gt;</span> &nbsp; &nbsp; <span style="color: #ff3c00;">parse_options</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Rest</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">;</span><br />
<span style="color: #ff3c00;">parse_options</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% разбор параметров закончен</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">State</span><span style="color: #6bb810;">.</span><br />
<br />
<br />
<span style="color: #666666; font-style: italic;">%% Инициализация процесса сервера</span><br />
<span style="color: #ff3c00;">init</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% будем контролировать завершение бочерних процессов</span><br />
&nbsp; &nbsp; <span style="color: #fa6fff;">process_flag</span><span style="color: #109ab8;">&#40;</span>trap_exit<span style="color: #6bb810;">,</span> true<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Параметры создания серверного TCP сокета тривиальные</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">Opts</span> <span style="color: #014ea4;">=</span> <span style="color: #109ab8;">&#91;</span><span style="color: #fa6fff;">binary</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>packet<span style="color: #6bb810;">,</span> <span style="color: #ff9600;">0</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>active<span style="color: #6bb810;">,</span> false<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>reuseaddr<span style="color: #6bb810;">,</span> true<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Создаю серверный сокет </span><br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <a href="http://erlang.org/doc/man/gen_tcp.html"><span style="color: #ff4e18;">gen_tcp</span></a>:<span style="color: #ff3c00;">listen</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">.</span>port<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Opts</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LSocket</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% Если все хорошо создаю пул акцепторов</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #ff3c00;">create_acceptors</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>lsocket<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">LSocket</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>error<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Reason</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #109ab8;">&#123;</span>stop<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Reason</span><span style="color: #109ab8;">&#125;</span> <span style="color: #666666; font-style: italic;">%% Завершение с выдачей ошибки</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span><br />
<br />
<br />
<span style="color: #666666; font-style: italic;">%% Завершение процесса сервера</span><br />
<span style="color: #ff3c00;">terminate</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">_Reason</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <a href="http://erlang.org/doc/man/gen_tcp.html"><span style="color: #ff4e18;">gen_tcp</span></a>:<span style="color: #ff3c00;">close</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">.</span>lsocket<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<br />
<br />
<span style="color: #666666; font-style: italic;">%% Создаю пул акцепторов</span><br />
<span style="color: #ff3c00;">create_acceptors</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #014ea4;">=</span>#<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>pool_size<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Cnt</span><span style="color: #6bb810;">,</span> lsocket<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> payload<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Payload</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Новый state с проинициализированным набором для пула акцепторов</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">NewState</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>acceptors<span style="color: #014ea4;">=</span><a href="http://erlang.org/doc/man/sets.html"><span style="color: #ff4e18;">sets</span></a>:<span style="color: #ff3c00;">new</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> &nbsp;<br />
&nbsp; &nbsp; <span style="color: #ff3c00;">create_acceptors</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Cnt</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Payload</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NewState</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<span style="color: #666666; font-style: italic;">%% Рекурсивная часть формирует пул акцепторов</span><br />
<span style="color: #ff3c00;">create_acceptors</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Cnt</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Payload</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #014ea4;">=</span>#<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>acceptors<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Pool</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <span style="color: #45b3e6;">Cnt</span> <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; 0 <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">State</span><span style="color: #6bb810;">;</span> <span style="color: #666666; font-style: italic;">%% Формирование пула закончено</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">_</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% создаю процесс акцептора</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">Pid</span> <span style="color: #014ea4;">=</span> tcp_acceptor:<span style="color: #006600;">start_</span><span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Payload</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% формирую из старого новый пул содержащий Pid созданного процесса</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">NewPool</span> <span style="color: #014ea4;">=</span> <a href="http://erlang.org/doc/man/sets.html"><span style="color: #ff4e18;">sets</span></a>:<span style="color: #006600;">add_</span><span style="color: #fa6fff;">element</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pool</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% возвращаю состояние с новым пулом акцепторов</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff3c00;">create_acceptors</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Cnt</span><span style="color: #014ea4;">-</span>1<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Payload</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>acceptors<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">NewPool</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span><br />
<br />
&nbsp; &nbsp; <br />
<span style="color: #666666; font-style: italic;">%% Заменяет заданный Pid на новый в пуле акцепторов</span><br />
<span style="color: #ff3c00;">replace_acceptor</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">OldPid</span><span style="color: #6bb810;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #45b3e6;">State</span><span style="color: #014ea4;">=</span>#<span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>acceptors<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Pool</span><span style="color: #6bb810;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lsocket<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> payload<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">Payload</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <a href="http://erlang.org/doc/man/sets.html"><span style="color: #ff4e18;">sets</span></a>:<span style="color: #006600;">is_</span><span style="color: #fa6fff;">element</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">OldPid</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pool</span><span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; true <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% создаю процесс нового акцептора</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">Pid</span> <span style="color: #014ea4;">=</span> tcp_acceptor:<span style="color: #006600;">start_</span><span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #fa6fff;">self</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LSocket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Payload</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">NewPool</span> <span style="color: #014ea4;">=</span> <a href="http://erlang.org/doc/man/sets.html"><span style="color: #ff4e18;">sets</span></a>:<span style="color: #006600;">add_</span><span style="color: #fa6fff;">element</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <a href="http://erlang.org/doc/man/sets.html"><span style="color: #ff4e18;">sets</span></a>:<span style="color: #006600;">del_</span><span style="color: #fa6fff;">element</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">OldPid</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pool</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>acceptors<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">NewPool</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; false <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">State</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #666666; font-style: italic;">%% Увеличивает счетчик клиентских подключений</span><br />
<span style="color: #ff3c00;">increment_client_count</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">ClientCount</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">.</span>client_count<span style="color: #014ea4;">+</span>1<span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>client_count<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">ClientCount</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #666666; font-style: italic;">%% Уменьшает счетчик клиентских подключений</span><br />
<span style="color: #ff3c00;">decrement_client_count</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">ClientCount</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #6bb810;">.</span>client_count<span style="color: #014ea4;">-</span>1<span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">State</span><span style="color: #ff9600;">#</span><span style="color: #d400ed;">state</span><span style="color: #109ab8;">&#123;</span>client_count<span style="color: #014ea4;">=</span><span style="color: #45b3e6;">ClientCount</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span><br />
<br />
<br />
<span style="color: #666666; font-style: italic;">%% Асинхронный вызов</span><br />
<span style="color: #ff3c00;">handle_cast</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Request</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <span style="color: #45b3e6;">Request</span> <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>accepted<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pid</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> &nbsp;<span style="color: #666666; font-style: italic;">%% Акцептор принял подключение</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% заменяем его в пуле на новый и увеличиваю счетчик подключений</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>noreply<span style="color: #6bb810;">,</span> <span style="color: #ff3c00;">replace_acceptor</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <span style="color: #ff3c00;">increment_client_count</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">_</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% другие вызовы не обрабатываем</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>noreply<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #666666; font-style: italic;">%% Информационное сообщение</span><br />
<span style="color: #ff3c00;">handle_info</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Info</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <span style="color: #45b3e6;">Info</span> <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span><span style="">'EXIT'</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_Pid</span><span style="color: #6bb810;">,</span> normal<span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> &nbsp; <span style="color: #666666; font-style: italic;">%% Процесс акцептора завершился</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>noreply<span style="color: #6bb810;">,</span> <span style="color: #ff3c00;">decrement_client_count</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Процесс акцептора завершился c ошибкой accepting_error</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span><span style="">'EXIT'</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>accepting_error<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Reason</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://erlang.org/doc/man/error_logger.html"><span style="color: #ff4e18;">error_logger</span></a>:<span style="color: #ff3c00;">error_report</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> accepting_error<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Reason</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>noreply<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">%% Процесс акцептора завершился c ошибкой</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span><span style="">'EXIT'</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Reason</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://erlang.org/doc/man/error_logger.html"><span style="color: #ff4e18;">error_logger</span></a>:<span style="color: #ff3c00;">error_report</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Pid</span><span style="color: #6bb810;">,</span> payload_error<span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Reason</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>noreply<span style="color: #6bb810;">,</span> <span style="color: #ff3c00;">decrement_client_count</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #45b3e6;">_</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #666666; font-style: italic;">%% другие сообщения не обрабатываем</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>noreply<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span><br />
<br />
<br />
<span style="color: #666666; font-style: italic;">%% Синхронный вызов</span><br />
<span style="color: #ff3c00;">handle_call</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">_Request</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_From</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <br />
&nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>noreply<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span> <span style="color: #666666; font-style: italic;">%% не используем</span><br />
<br />
<span style="color: #666666; font-style: italic;">%% Уведомление о изменении кода</span><br />
<span style="color: #ff3c00;">code_change</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">_OldVsn</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_Extra</span><span style="color: #109ab8;">&#41;</span> <br />
&nbsp; &nbsp; <span style="color: #6bb810;">-&gt;</span> <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">State</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">.</span><br />
<br />
&nbsp;</code></fieldset></p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102801</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102801</guid>
<pubDate>Sat, 13 Aug 2011 20:03:19 +0400</pubDate>
<description><![CDATA[<p>В общем выкладываю результат двухнедельного изучения Эрланга. Если кто распарсил что это и готов конструктивно покидаться тапочками (покритиковать код), с удовольствием буду отмахиваться (давать пояснения).)))</p><p><fieldset><legend>erlang</legend><code><br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>echoserver<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<span style="color: #666666; font-style: italic;">%% Пример Echo сервера с применением асинхронного OTP/Erlang TCP сервера</span><br />
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>start<span style="color: #014ea4;">/</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> payload<span style="color: #014ea4;">/</span><span style="color: #ff9600;">1</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #666666; font-style: italic;">%% Запуск Echo сервера</span><br />
<span style="color: #ff3c00;">start</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #45b3e6;">Options</span> <span style="color: #014ea4;">=</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span>name<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>local<span style="color: #6bb810;">,</span> ?<span style="color: #6941fd;">MODULE</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>port<span style="color: #6bb810;">,</span> 7000<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; tcp_server:<span style="color: #006600;">start_</span><span style="color: #fa6fff;">link</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Options</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span>?<span style="color: #6941fd;">MODULE</span><span style="color: #6bb810;">,</span> payload<span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span><br />
<br />
<span style="color: #666666; font-style: italic;">%% Реализация протокола Echo</span><br />
<span style="color: #ff3c00;">payload</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; <span style="color: #186895;">case</span> <a href="http://erlang.org/doc/man/gen_tcp.html"><span style="color: #ff4e18;">gen_tcp</span></a>:<span style="color: #ff3c00;">recv</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> 0<span style="color: #109ab8;">&#41;</span> <span style="color: #186895;">of</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>ok<span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://erlang.org/doc/man/gen_tcp.html"><span style="color: #ff4e18;">gen_tcp</span></a>:<span style="color: #ff3c00;">send</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Data</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff3c00;">payload</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Socket</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #109ab8;">&#123;</span>error<span style="color: #6bb810;">,</span> closed<span style="color: #109ab8;">&#125;</span> <span style="color: #6bb810;">-&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #006600;">ok</span><br />
&nbsp; &nbsp; <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span><br />
&nbsp;</code></fieldset></p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102800</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102800</guid>
<pubDate>Thu, 11 Aug 2011 11:59:24 +0400</pubDate>
<description><![CDATA[<p><i>>уже ищут на работу кошек  &nbsp;<a href="http://juick.com/dmz/1352705#18">http://juick.com/dmz/1352705#18</a></i><br> Только про зарплату - тишина. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102799</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102799</guid>
<pubDate>Thu, 11 Aug 2011 11:58:58 +0400</pubDate>
<description><![CDATA[<p><i>> уже ищут на работу кошек  &nbsp;<a href="http://juick.com/dmz/1352705#18">http://juick.com/dmz/1352705#18</a></i><br></p><p>Зря они кстати вилку не пишут, я вот например даже задумываться над отсылкой им резюме не стал. А была бы вилка, кто его знает, может мы всё жизнь друг друга искали.)))</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102798</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102798</guid>
<pubDate>Thu, 11 Aug 2011 10:39:47 +0400</pubDate>
<description><![CDATA[<p>уже ищут на работу кошек &nbsp;<a href="http://juick.com/dmz/1352705#18">http://juick.com/dmz/1352705#18</a></p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102797</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102797</guid>
<pubDate>Thu, 11 Aug 2011 10:36:43 +0400</pubDate>
<description><![CDATA[<p><i>>Позволяет, более того я представляю себе как это использовать и для чего. Просто мы вроде бы обсуждали можно ли в принципе дать определение понятное среднему программисту. Или ты уже забыл в чем предмет дискуссии.</i><br> Можно, только определение будет длиной в монадный туториал. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102796</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102796</guid>
<pubDate>Thu, 11 Aug 2011 10:33:35 +0400</pubDate>
<description><![CDATA[<p><i>>Если кому интересно - распишу подробно код комментариями, кое чего поправлю и закину сюда.</i><br> Закидывай, конечно. Может свое поделие перепишу по-нормальному. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102795</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102795</guid>
<pubDate>Thu, 11 Aug 2011 10:23:31 +0400</pubDate>
<description><![CDATA[<p><i>> Тебе религия не позволяет поставить хаскелль или erlng+erlando и ввести примеры?</i><br></p><p>Позволяет, более того я представляю себе как это использовать и для чего. Просто мы вроде бы обсуждали можно ли в принципе дать определение понятное среднему программисту. Или ты уже забыл в чем предмет дискуссии.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102794</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102794</guid>
<pubDate>Thu, 11 Aug 2011 10:14:53 +0400</pubDate>
<description><![CDATA[<p><i>>Монада набор связанных функции, для которой можно определить алгоритм вычисления, который может изменять параметры и последовательность вызова функций в наборе в зависимости от результата вызова предыдущей функции или начальных параметров.</i><br> Слова вроде-бы все понятные, а в итоге получился какой-то мутный поток сознания. Самый лучший способ разобраться в том что это такое с программистской точки зрения - попробовать монады на практике. Тебе религия не позволяет поставить хаскелль или erlng+erlando и ввести примеры?  </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102793</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102793</guid>
<pubDate>Thu, 11 Aug 2011 09:59:40 +0400</pubDate>
<description><![CDATA[<p>Кстати, вроде получилось написать <u>асинхронный OTP TCP сервер</u> и даже echoсервер с его использованием заработал. </p><p>Из плюсов: <ul> <li>&nbsp;не используются "левые приёмы" как в примере &nbsp;<a href="http://habrahabr.ru/blogs/erlang/111268/">http://habrahabr.ru/blogs/erlang/111268/</a> <li>&nbsp;используется патерн "pool of acceptor processes" рекомендованный здесь &nbsp;<a href="http://www.erlang.org/doc/man/gen_tcp.html#accept-1">http://www.erlang.org/doc/man/gen_tcp.html#accept-1</a> <li>&nbsp;вроде как нет косяков за которые закидали тапками автора в &nbsp;<a href="http://habrahabr.ru/blogs/erlang/120815/">http://habrahabr.ru/blogs/erlang/120815/</a> <li>&nbsp;получилось просто и наглядно как в &nbsp;<a href="http://20bits.com/articles/erlang-a-generalized-tcp-server/">http://20bits.com/articles/erlang-a-generalized-tcp-server/</a></ul></p><p>Реализацию конечно не придумана мной, а выдрано в творческом парсинге кодов мойшевеба. Но так как упрощена, то легко читается. Если кому интересно - распишу подробно код комментариями, кое чего поправлю и закину сюда. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102792</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102792</guid>
<pubDate>Thu, 11 Aug 2011 09:35:06 +0400</pubDate>
<description><![CDATA[<p><i>>> Дад, а зачем мне этот контейнер? </i><br><i>> Для вычислений с обработкой отсутствующих значений, вычислений с несколькими результатами, для последовательных вычислений и вычислений с побочными эффектами, реализации парсеров, оптимизации.</i><br></p><p>Ну вот уже ближе к телу.))) Итак попробуем дать определение:</p><p> Монада набор связанных функции, для которой можно определить алгоритм вычисления, который может изменять параметры и последовательность вызова функций в наборе в зависимости от результата вызова предыдущей функции или начальных параметров.</p><p> Ну как, пойдет? Или бред?</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102791</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102791</guid>
<pubDate>Thu, 11 Aug 2011 07:29:34 +0400</pubDate>
<description><![CDATA[<p><i>>Дад, а зачем мне этот контейнер?</i><br> Для вычислений с обработкой отсутствующих значений, вычислений с несколькими результатами, для последовательных вычислений и вычислений с побочными эффектами, реализации парсеров, оптимизации.</p><p>Конкретные примеры приводятся выше и я еще давал ссылку про монады в эрланге, там довольно простые примеры. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102790</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102790</guid>
<pubDate>Thu, 11 Aug 2011 05:22:48 +0400</pubDate>
<description><![CDATA[<p><i>>> В общем ты признал, что объяснить популярно что такое монада ты не состоянии. ? </i><br><i>> Я уже приводил популярное объяснение выше:</i><br> <i>>> С точки зрения программиста монада это абстрактный контейнер с тремя функциями. map - ... unit - ... join - ... </i><br><i>> Что тебе непонятно? </i><br></p><p>Дад, а зачем мне этот контейнер?</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102789</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102789</guid>
<pubDate>Wed, 10 Aug 2011 23:00:34 +0400</pubDate>
<description><![CDATA[<p><i>>В общем ты признал, что объяснить популярно что такое монада ты не состоянии. ?</i><br><i>>Насчет "проще открыть книжку...", понимаешь прежде чем открыть книгу я хотел бы </i><br><i>>понять в общих чертах что это и нужно ли мне это вообще.</i><br> Я уже приводил популярное объяснение выше: </p><p><i>>С точки зрения программиста монада это абстрактный контейнер с тремя функциями.</i><br><i>>map - ...</i><br><i>>unit - ...</i><br><i>>join - ...</i><br> Что тебе непонятно? Ты не знаешь что такое коробка, гвоздь и шуруп? Непонятно что такое int и float?</p><p><i>>А ты предлагаешь мне вспомнить матан, изучить дискретную математику и хаскель, </i><br><i>>что бы понять, что такое монады и сделать вывод нужны ли мне они в повседневной </i><br><i>>практике?</i><br> Могу тебя заверить, что для использования монад в повседневной практике их глубокое понимание совсем не обязатяльно.  </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102788</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102788</guid>
<pubDate>Wed, 10 Aug 2011 19:34:34 +0400</pubDate>
<description><![CDATA[<p><i>> Гораздо быстрее и проще открыть книжку по дискретной математике и прочитать несколько глав.</i><br></p><p>В общем ты признал, что объяснить популярно что такое монада ты не состоянии. Насчет "проще открыть книжку...", понимаешь прежде чем открыть книгу я хотел бы понять в общих чертах что это и нужно ли мне это вообще.</p><p> А ты предлагаешь мне вспомнить матан, изучить дискретную математику и хаскель, что бы понять, что такое монады и сделать вывод нужны ли мне они в повседневной практике?</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102787</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102787</guid>
<pubDate>Mon, 08 Aug 2011 23:08:10 +0400</pubDate>
<description><![CDATA[<p>Это я к тому, что вполне можно спаять усилитель, ничего не зная о работе его компонентов. Вполне можно использовать монады, понятия не имея о том как они работают.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102786</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102786</guid>
<pubDate>Mon, 08 Aug 2011 22:58:08 +0400</pubDate>
<description><![CDATA[<p><i>>Пока еще не прочитал вдумчиво, но утверждение что тот кто не знает матана не сможет спроектировать усилитель - бля, нам как бэ намекает. Афтор сноб живущий в своем собственном сферическом вакууме, делающий выводы об окружающей его среде только на основе своих мыслеветвлений.) Есть умный термин такого мировоззрения, но сейчас не припомню.</i><br> Рассуждать можно много и долго о ненужности всяких знаний. Гораздо быстрее и проще открыть книжку по дискретной математике и прочитать несколько глав. Не надо даже ходить в магазин, достаточно зайти на gen.lib.rus.ec или lib.homelinux.org. Там есть даже книжка О'Доннелла (два в одном) - основы дискретной математики и хаскелль. И да, там где учат специалистов по электронике и электротехнике матан и дискретку преподают, инфа 100%. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102785</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102785</guid>
<pubDate>Mon, 08 Aug 2011 11:57:18 +0400</pubDate>
<description><![CDATA[<p>"Монады — это живые, духообразные единицы, из которых все состоит и кроме которых ничего в мире нет" (педивикия). Как - то так махарадж тролил бы топик стартера, изведя его на говно. Ибо истину глаголит Лейпниц - отец, порадивший сына монадологию, и куда без духа святого - философии, аминь, блеать.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102784</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102784</guid>
<pubDate>Mon, 08 Aug 2011 11:21:05 +0400</pubDate>
<description><![CDATA[<p><i>> Сегодня на швабрашвабре опубликовали неплохую статью о монадах:  &nbsp;<a href="http://habrahabr.ru/blogs/programming/125782/">http://habrahabr.ru/blogs/programming/125782/</a></i><br></p><p>Пока еще не прочитал вдумчиво, но утверждение что тот кто не знает матана не сможет спроектировать усилитель - бля, нам как бэ намекает. Афтор сноб живущий в своем собственном сферическом вакууме, делающий выводы об окружающей его среде только на основе своих мыслеветвлений.) Есть умный термин такого мировоззрения, но сейчас не припомню. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102783</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102783</guid>
<pubDate>Sun, 07 Aug 2011 05:33:40 +0400</pubDate>
<description><![CDATA[<p>Сегодня на швабрашвабре опубликовали неплохую статью о монадах: &nbsp;<a href="http://habrahabr.ru/blogs/programming/125782/">http://habrahabr.ru/blogs/programming/125782/</a></p><p> </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102782</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102782</guid>
<pubDate>Sun, 07 Aug 2011 05:03:07 +0400</pubDate>
<description><![CDATA[<p><i>>Если у тебя получиться объяснить монаду, то можешь считать что ты многое сделал для популизации функцирнальщины.)))</i><br> Собственно, что такое монада объясняется в первых четырех параграфах. Все остальное - это примеры и необязательные сведения. Чтобы начать использование монад на практике, приведенного материала вполне достаточно. Также могу посоветовать познакомиться с хаскелем. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102781</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102781</guid>
<pubDate>Sat, 06 Aug 2011 16:44:11 +0400</pubDate>
<description><![CDATA[<p><i>>> Математический и физический смысл производной описывается одним предложением. </i><br> <i>> Я тоже могу сказать, что монада это эндофунктор и два естественных преобразования. Или, например, что монада это моноид в категории эндофункторов.</i><br> Аха, понятно. А извините, что такое эндофунктатор и естественное преобразование? :)</p><p> Я конечно понимаю, что смысл производной практически невозможно объяснить неграмотному пастуху. Но его можно объяснить, человеку получившему начальное среднее образование. Поэтому логично ввести категорию человека, которому надо объяснить, что такое монада. </p><p> Пусть это будет программист сносно владеющий Си. Например понятное для него определение функции высшего порядка: "Функция принимающая в качестве параметра и/или возвращающая в результате другую функцию".</p><p> Если у тебя получиться объяснить монаду, то можешь считать что ты многое сделал для популизации функцирнальщины.)))</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102780</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102780</guid>
<pubDate>Sat, 06 Aug 2011 15:53:36 +0400</pubDate>
<description><![CDATA[<p><i>>Математический и физический смысл производной описывается одним предложением.</i><br> Я тоже могу сказать, что монада это эндофунктор и два естественных преобразования. Или, например, что монада это моноид в категории эндофункторов.</p><p><i>>А запощенная сюда попытка дать определение термину монада на овер 500 строк вряд ли можно назвать популярным объяснением.)))</i><br> Приведенное объяснение в самом деле популярное и адекватное, однако требует некоторого знакомства с языком Haskell. Что именно непонятно?</p><p>Более сложное определение с кратким введением в теорию категорий приводится в статье Стэфана Клингера, ссылку на которую я дал выше.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102779</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102779</guid>
<pubDate>Sat, 06 Aug 2011 14:30:34 +0400</pubDate>
<description><![CDATA[<p><i>>  и вуаля: производные находит ученик 10-го класса. </i><br> Математический и физический смысл производной описывается одним предложением. А запощенная сюда попытка дать определение термину монада на овер 500 строк вряд ли можно назвать популярным объяснением.)))</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102778</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102778</guid>
<pubDate>Sat, 06 Aug 2011 14:25:30 +0400</pubDate>
<description><![CDATA[<p><i>>  Если есть интерес, то могу запилить перевод, но статья очень просто и понятно написана.</i><br> Не отказался бы прочитать.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102777</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102777</guid>
<pubDate>Sat, 06 Aug 2011 09:16:30 +0400</pubDate>
<description><![CDATA[<p><i>> С точки зрения программиста монада это абстрактный контейнер с тремя функциями.</i><br>...</p><p><i>> Да и вообще, в интернетах over9000 всяких монадных блогпостов, однако понимать их практически невозможно — не стоит даже и пытаться. Все что можно из них извлечь — это странные продукты подсознания автора монадного тьюториала и его детские страхи.</i><br> <i>> Вот, например, годная статья про монады, где рассказывается про монады с точки зрения теории категорий.:  &nbsp;<a href="http://stefan-klinger.de/files/monadGuide.pdf">http://stefan-klinger.de/files/monadGuide.pdf</a> Если есть интерес, то могу запилить перевод, но статья очень просто и понятно написана. </i><br> Большое спасибо за информацию.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102776</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102776</guid>
<pubDate>Sat, 06 Aug 2011 04:35:36 +0400</pubDate>
<description><![CDATA[<p>Да и вообще, в интернетах over9000 всяких монадных блогпостов, однако понимать их практически невозможно — не стоит даже и пытаться. Все что можно из них извлечь — это странные продукты подсознания автора монадного тьюториала и его детские страхи.</p><p>Вот, например, годная статья про монады, где рассказывается про монады с точки зрения теории категорий.: &nbsp;<a href="http://stefan-klinger.de/files/monadGuide.pdf">http://stefan-klinger.de/files/monadGuide.pdf</a> Если есть интерес, то могу запилить перевод, но статья очень просто и понятно написана. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102775</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102775</guid>
<pubDate>Sat, 06 Aug 2011 04:15:20 +0400</pubDate>
<description><![CDATA[<p>С точки зрения программиста монада это абстрактный контейнер с тремя функциями.</p><p>map — заменяет содержимое контейнера без изменения самого контейнера. Заменяем каждый гвоздь в коробке шурупом, каждый int в массиве float-ом — так map и работает. </p><p>unit — берет элемент и возвращает контейнер с одним этим элементом. Делаем из гвоздя коробку с одним гвоздем. Делаем из int массив из одного int.</p><p>join — уменьшает вложенность контейнеров — из коробки коробок гвоздей делает коробку с гвоздями (из массива массивов int-ов — массив int-ов). Ну или из коробки коробок коробок гвоздей делаем коробку коробок гвоздей. Это уже сложная концепция, доступная только программистам и более абстрактно развитым товарищам; обычный человек будет обескуражен тем, как в одну коробку могли поместиться несколько точно таких-же коробок. Впрочем, простая замена коробок коробок на мешки мешков или пакеты пакетов позволяет совершить абстрактно-теоретико-категориальный прорыв.</p><p>Необязательные сведения: мы имеем иерархию абстрактных контейнеров, которые эти функции наследуют так:</p><p><fieldset><legend>haskell</legend><code><br />
&nbsp;функтор<span style="color: green;">&#40;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a><span style="color: green;">&#41;</span> ← pointed functor <span style="color: green;">&#40;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a><span style="color: #339933; font-weight: bold;">,</span> unit<span style="color: green;">&#41;</span> ← монада <span style="color: green;">&#40;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a><span style="color: #339933; font-weight: bold;">,</span> unit<span style="color: #339933; font-weight: bold;">,</span> join<span style="color: green;">&#41;</span><span style="color: #339933; font-weight: bold;">.</span><br />
&nbsp;</code></fieldset></p><p>Еще более необязательная информация: между pointed functor и монадой в этой иерархии аппликативный функтор. Также можно добавить к монаде ноль — пустую коробку и плюс — берем две коробки (эти две коробки сами не в коробке!) и складываем их содержимое в одну такую же коробку. Ноль, естественно, для этого плюса будет нейтральным элементом.</p><p>Представьте, что у нас есть функция f, которая что-то делает с двумя значениями, объектами. Эти два объекта мы можем получать разными способами. Допустим, что мы ищем их в некоем хранилище, базе данных, коллекции, т.е. они результат поиска, запроса. Можем найти, а можем и не найти. <fieldset><legend>csharp</legend><code><br />
X x <span style="color: #008000;">=</span> FindX<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
Y y <span style="color: #008000;">=</span> FindY<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>x.<span style="color: #0000FF;">NotNull</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> y.<span style="color: #0000FF;">NotNull</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #008080; font-style: italic;">// если нужные нам значения получены</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">return</span> f<span style="color: #000000;">&#40;</span>x, y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// вычисляем результат</span><br />
<span style="color: #0600FF;">else</span><br />
&nbsp; &nbsp;<span style="color: #0600FF;">return</span> null<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// результат получить не можем, возвращаем ничего</span><br />
&nbsp;</code></fieldset></p><p>Тут логика перепутана с проверкой возвращаемых значений, да и проверки реализуются для каждого использования поиска, по месту. </p><p>Разделяется и повторно используется она монадой Maybe <fieldset><legend>haskell</legend><code><br />
<span style="color: #06c; font-weight: bold;">do</span> <span style="color: green;">&#123;</span><br />
&nbsp; &nbsp; x ← FindX<span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>;<br />
&nbsp; &nbsp; y ← FindY<span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>;<br />
&nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:return"><span style="font-weight: bold;">return</span></a> f <span style="color: green;">&#40;</span>x<span style="color: #339933; font-weight: bold;">,</span> y<span style="color: green;">&#41;</span>;<br />
<span style="color: green;">&#125;</span><br />
&nbsp;</code></fieldset> все, теперь проверки где-то за кадром, пишутся они один раз и потом работают.</p><p>Допустим, мы хотим получить результаты f для некоего набора значений. Проверить, например, функцию f на ее области определения или для каких-то особых случаев. <fieldset><legend>csharp</legend><code><br />
List result <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> List<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #0600FF;">for</span><span style="color: #000000;">&#40;</span>X x <span style="color: #0600FF;">in</span> xs<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0600FF;">for</span><span style="color: #000000;">&#40;</span>Y y <span style="color: #0600FF;">in</span> ys<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; result.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>f<span style="color: #000000;">&#40;</span>x, y<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000;">&#125;</span><br />
<span style="color: #000000;">&#125;</span><br />
&nbsp;</code></fieldset></p><p>  Проход по наборам иксов и игреков также можно отделить от логики. <fieldset><legend>haskell</legend><code><br />
List result <span style="color: #339933; font-weight: bold;">=</span> <span style="color: #06c; font-weight: bold;">do</span> <span style="color: green;">&#123;</span><br />
&nbsp; &nbsp; x ← xs;<br />
&nbsp; &nbsp; y ← ys;<br />
&nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:return"><span style="font-weight: bold;">return</span></a> f<span style="color: green;">&#40;</span>x<span style="color: #339933; font-weight: bold;">,</span> y<span style="color: green;">&#41;</span>;<br />
<span style="color: green;">&#125;</span><br />
&nbsp;</code></fieldset></p><p>  Похоже на декартово произведение, записанное в нотации для множеств, что собственно нам и надо.  Разумеется, одна реализация интерфейса-монады для списка позволит писать и так <fieldset><legend>haskell</legend><code><br />
<span style="color: #06c; font-weight: bold;">do</span> <span style="color: green;">&#123;</span><br />
&nbsp; &nbsp; a ← alist;<br />
&nbsp; &nbsp; b ← blist;<br />
&nbsp; &nbsp; c ← clist;<br />
&nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:return"><span style="font-weight: bold;">return</span></a> foo<span style="color: green;">&#40;</span>a<span style="color: #339933; font-weight: bold;">,</span>b<span style="color: #339933; font-weight: bold;">,</span>c<span style="color: green;">&#41;</span>;<br />
<span style="color: green;">&#125;</span><br />
&nbsp;</code></fieldset></p><p>  т.е. за кулисами нашей монады могут быть циклы любой вложенности, каждый раз реализовывать работу с несколькими списками по месту нам больше не понадобится.  Точно также все будет работать и для других монад:  Парсим строку, получаем значения x и y, возращем результат применения f. Если x и y не распарсились — возвращаем ошибку парсинга. <fieldset><legend>haskell</legend><code><br />
<span style="color: #06c; font-weight: bold;">do</span> <span style="color: green;">&#123;</span><br />
&nbsp; &nbsp; x ← ParseX<span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>;<br />
&nbsp; &nbsp; y ← ParseY<span style="color: green;">&#40;</span><span style="color: green;">&#41;</span>;<br />
&nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:return"><span style="font-weight: bold;">return</span></a> f <span style="color: green;">&#40;</span>x<span style="color: #339933; font-weight: bold;">,</span> y<span style="color: green;">&#41;</span>;<br />
<span style="color: green;">&#125;</span><br />
&nbsp;</code></fieldset></p><p>  Получаем значения по сети, ждем, пока придут оба, потом возвращаем результат применения f. <fieldset><legend>haskell</legend><code><br />
<span style="color: #06c; font-weight: bold;">do</span> <span style="color: green;">&#123;</span><br />
&nbsp; &nbsp; x ← Get<span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;www.x.org&quot;</span><span style="color: green;">&#41;</span>;<br />
&nbsp; &nbsp; y ← Get<span style="color: green;">&#40;</span><span style="background-color: #3cb371;">&quot;www.y.net&quot;</span><span style="color: green;">&#41;</span>;<br />
&nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:return"><span style="font-weight: bold;">return</span></a> f <span style="color: green;">&#40;</span>x<span style="color: #339933; font-weight: bold;">,</span> y<span style="color: green;">&#41;</span>;<br />
<span style="color: green;">&#125;</span><br />
&nbsp;</code></fieldset></p><p>  И так далее.  Более того, для монады можно реализовать функции, "поднимающие" другие функции в монады. <fieldset><legend>haskell</legend><code><br />
Parser parser <span style="color: #339933; font-weight: bold;">=</span> ParserMonad<span style="color: #339933; font-weight: bold;">.</span>Lift<span style="color: green;">&#40;</span>f<span style="color: green;">&#41;</span>;<br />
&nbsp;</code></fieldset></p><p>  Все, теперь мы превратили функцию f в парсер. Даже  <fieldset><legend>haskell</legend><code><br />
<span style="color: #06c; font-weight: bold;">do</span> <span style="color: green;">&#123;</span> ← ← <span style="color: #339933; font-weight: bold;">...</span> ← <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:return"><span style="font-weight: bold;">return</span></a> <span style="color: green;">&#125;</span> <br />
&nbsp;</code></fieldset></p><p>писать не обязательно.  Необязательные свдения — для этих примеров достаточно аппликативного функтора — возможности монад несколько шире.</p><p> Все мы изучали в школе свойства сложения, умножения, тригонометрических функций и т.д. Они позволяли упростить некоторое громоздкое выражение и решить задачу.   Программирование — это решение задач. Упрощение там может пригодится, а может пригодится усложнение — оптимизация, но упрощение и усложнение, всякое преобразование кода в программировании это путь по минному полю. Мы можем думать, что отрефактореный код делает то же самое, но это не обязательно так. Как не покрывай код тестами, но покрытие это статистическое и баг может проскочить. Ну и проскакивает. В школе было проще, выражения равны, это доказано "багу" взяться неоткуда.</p><p><fieldset><legend>haskell</legend><code><br />
a<span style="color: #339933; font-weight: bold;">*</span>c <span style="color: #339933; font-weight: bold;">+</span> b<span style="color: #339933; font-weight: bold;">*</span>c <span style="color: #339933; font-weight: bold;">==</span> c<span style="color: #339933; font-weight: bold;">*</span><span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">+</span> b<span style="color: green;">&#41;</span><br />
&nbsp;</code></fieldset></p><p>  Это оптимизация. Мы заменили одну простую операцию и две сложных на одну простую и одну сложную.  Функторы, монады, моноиды и т.д. приводят школьную простоту и железную надежность доказательства в программирование. Если мы гарантируем выполнение простых свойств, то и сложные преобразования больших объемов кода с соблюдением этих простых правил будут корректны.</p><p><fieldset><legend>haskell</legend><code><br />
<a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a> f <span style="color: #339933; font-weight: bold;">.</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a> g <span style="color: #339933; font-weight: bold;">==</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a> f <span style="color: #339933; font-weight: bold;">.</span> g<br />
&nbsp;</code></fieldset></p><p>  Это свойство функтора (а следовательно и монады) и тоже оптимизация. Мы заменили работу со списком в два прохода эквивалентной работой в один проход.  До этого я писал, в основном, о монадах и функторах, а вопрос был еще и про стрелки. Тут у нас есть стрелки-функции (да, функция это стрелка) и комбинация этих стрелок: <fieldset><legend>haskell</legend><code><br />
f <span style="color: #339933; font-weight: bold;">.</span> g <span style="color: #339933; font-weight: bold;">==</span> x <span style="color: #339933; font-weight: bold;">|</span>→ g<span style="color: green;">&#40;</span>f<span style="color: green;">&#40;</span>x<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">==</span> fun <span style="color: green;">&#40;</span>x<span style="color: green;">&#41;</span> <span style="color: green;">&#123;</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:return"><span style="font-weight: bold;">return</span></a> g<span style="color: green;">&#40;</span>f<span style="color: green;">&#40;</span>x<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span>; <span style="color: green;">&#125;</span><br />
<span style="color: #339933; font-weight: bold;">//</span>комбинация функций дает нам новую функцию<span style="color: #339933; font-weight: bold;">.</span><br />
<a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:id"><span style="font-weight: bold;">id</span></a> <span style="color: #339933; font-weight: bold;">.</span> f <span style="color: #339933; font-weight: bold;">==</span> f<br />
<span style="color: #339933; font-weight: bold;">//</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:id"><span style="font-weight: bold;">id</span></a> <span style="color: #339933; font-weight: bold;">-</span> нейтральный элемент для <span style="color: #339933; font-weight: bold;">.,</span> как <span style="color: red;">0</span> нейтральный элемент для <span style="color: #339933; font-weight: bold;">+,</span> а <span style="color: red;">1</span> для <span style="color: #339933; font-weight: bold;">*</span>:<br />
<br />
<span style="color: red;">0</span> <span style="color: #339933; font-weight: bold;">+</span> x <span style="color: #339933; font-weight: bold;">==</span> x<br />
<span style="color: red;">1</span> <span style="color: #339933; font-weight: bold;">*</span> x <span style="color: #339933; font-weight: bold;">==</span> x<br />
&nbsp;</code></fieldset></p><p>  Если у нас есть <fieldset><legend>haskell</legend><code><br />
<span style="color: red;">0</span> <span style="color: #339933; font-weight: bold;">*</span> ОченьСложноеВычисление<br />
&nbsp;</code></fieldset></p><p>  то нет смысла делать сложное вычисление — мы уже знаем ответ. Для map тоже есть значение, "отношения" операции map с которым похожи на отношение операции умножения с нулем. это id — функция, которая дает результат равный принимаемому значению.</p><p><fieldset><legend>haskell</legend><code><br />
<a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:id"><span style="font-weight: bold;">id</span></a> огромныйСписок <span style="color: #339933; font-weight: bold;">==</span> <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:id"><span style="font-weight: bold;">id</span></a> огромныйСписок <span style="color: #339933; font-weight: bold;">==</span> огромныйСписок<br />
&nbsp;</code></fieldset></p><p>  нет смысла проходить по огромному списку — он не изменится. "Какой-то бред", может подумать читатель "откуда у нас вдруг возьмется функция, которая ничего не делает?". Легко возмется. Есть множество пар действий, которые будучи сгруппированы (мы ведь упрощаем программу-выражение) дадут ничего не делающую функцию. Папример, поворот изображения по часовой стрелке в комбинации с поворотом изображения против часовой стрелки не делает ничего. есть также операции, которые становятся ничего не делающими при повторном применении, в комбинации с самими собой — зеркальное отражение изображения, например.  Другие свойства монад: <fieldset><legend>haskell</legend><code><br />
<a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a> f <span style="color: #339933; font-weight: bold;">.</span> unit <span style="color: #339933; font-weight: bold;">==</span> unit <span style="color: #339933; font-weight: bold;">.</span> f<br />
&nbsp;</code></fieldset></p><p>  Для того, чтобы собирать из монад конструкции из первой части, нам нужны специальные операции, которые монады соединяют.  Самая простая из них — рыбка (>=>).  Рыбка, как и . комбинирует стрелки, но не всякие, а стрелки Клейсли, т.е. функции, которые упаковывают значение (предмет) в монаду (коробку). Одну стрелку клейсли мы уже упоминали — это unit. Unit нейтральный элемент для рыбки, как id для . и 0 для +: <fieldset><legend>haskell</legend><code><br />
unit <span style="color: #339933; font-weight: bold;">&gt;=&gt;</span> f <span style="color: #339933; font-weight: bold;">==</span> f<br />
f <span style="color: #339933; font-weight: bold;">&gt;=&gt;</span> unit <span style="color: #339933; font-weight: bold;">==</span> f<br />
&nbsp;</code></fieldset></p><p>  Рыбка ассоциативна, как и + и *: <fieldset><legend>haskell</legend><code><br />
<span style="color: green;">&#40;</span>a <span style="color: #339933; font-weight: bold;">&gt;=&gt;</span> b<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&gt;=&gt;</span> c <span style="color: #339933; font-weight: bold;">==</span> a <span style="color: #339933; font-weight: bold;">&gt;=&gt;</span> <span style="color: green;">&#40;</span>b <span style="color: #339933; font-weight: bold;">&gt;=&gt;</span> c<span style="color: green;">&#41;</span><br />
<span style="color: green;">&#40;</span>x <span style="color: #339933; font-weight: bold;">+</span> y<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">+</span> z <span style="color: #339933; font-weight: bold;">==</span> x <span style="color: #339933; font-weight: bold;">+</span> <span style="color: green;">&#40;</span>y <span style="color: #339933; font-weight: bold;">+</span> z<span style="color: green;">&#41;</span><br />
&nbsp;</code></fieldset></p><p>  Самая известная из них — bind (>>=), это когда мы сначала делаем map стрелкой Клейсли, а потом уменьшаем вложенность монад операцией join </p><p><fieldset><legend>haskell</legend><code><br />
m <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> f <span style="color: #339933; font-weight: bold;">=</span> join <span style="color: green;">&#40;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a> <span style="color: green;">&#40;</span>f<span style="color: #339933; font-weight: bold;">,</span> m<span style="color: green;">&#41;</span><span style="color: green;">&#41;</span><br />
<br />
unit<span style="color: green;">&#40;</span>a<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> f <span style="color: #339933; font-weight: bold;">==</span> f<span style="color: green;">&#40;</span>a<span style="color: green;">&#41;</span><br />
&nbsp;</code></fieldset></p><p>  кладем a в коробку  <fieldset><legend>haskell</legend><code><br />
<span style="color: green;">&#91;</span>a<span style="color: green;">&#93;</span><br />
&nbsp;</code></fieldset></p><p>  применяем к внутренностям коробки функцию f  <fieldset><legend>haskell</legend><code><br />
<span style="color: green;">&#91;</span>f<span style="color: green;">&#40;</span>a<span style="color: green;">&#41;</span><span style="color: green;">&#93;</span><br />
&nbsp;</code></fieldset></p><p>  f это стрелка Клейсли, она кладет свой результат в коробку <fieldset><legend>haskell</legend><code><br />
<span style="color: green;">&#91;</span><span style="color: green;">&#91;</span>b<span style="color: green;">&#93;</span><span style="color: green;">&#93;</span><br />
&nbsp;</code></fieldset></p><p>  а теперь джойним коробки <fieldset><legend>haskell</legend><code><br />
<span style="color: green;">&#91;</span>b<span style="color: green;">&#93;</span><br />
&nbsp;</code></fieldset></p><p>  готово, то же что и просто  <fieldset><legend>haskell</legend><code><br />
f<span style="color: green;">&#40;</span>a<span style="color: green;">&#41;</span> → <span style="color: green;">&#91;</span>b<span style="color: green;">&#93;</span><br />
&nbsp;</code></fieldset></p><p><fieldset><legend>haskell</legend><code><br />
m <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> unit <span style="color: #339933; font-weight: bold;">==</span> m<br />
&nbsp;</code></fieldset></p><p>  тут все понятно, упаковываем содержимое коробки в коробку, добавляя вложенность коробок, а потом убираем лишнюю вложенность коробок — бессмысленное занятие. <fieldset><legend>haskell</legend><code><br />
m <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> <span style="color: green;">&#40;</span>x <span style="color: #339933; font-weight: bold;">|</span>→ k x <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> h<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">=</span> <span style="color: green;">&#40;</span>m <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> k<span style="color: green;">&#41;</span> <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> h<br />
&nbsp;</code></fieldset></p><p>  Это уже совсем не так весело, вот потому-то и начинать объяснение монад с bind — это ошибка. Смотрите лучше на join и рыбок.</p><p><fieldset><legend>haskell</legend><code><br />
<a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:map"><span style="font-weight: bold;">map</span></a> f m <span style="color: #339933; font-weight: bold;">=</span> m <span style="color: #339933; font-weight: bold;">&gt;&gt;=</span> unit <span style="color: #339933; font-weight: bold;">.</span> f<br />
&nbsp;</code></fieldset></p><p> выражаем map через bind — упаковывая результат функции f в коробку.</p><p>Используя такой вот "алгебраический подход", можно рефакторить программы с обоснованной корректностью преобразования при условии выполнении свойств, а также писать, например, наивную реализацию, которую легко придумать и понять, а потом так же корректно трансформировать в реализацию эффективную, но, возможно, неочевидную и плохо читаемую. Пример таких преобразований на небольшой программе продемонстрирован в этой презентации, но материал не простой, не для первого чтения, потому как слайды в презентации перевернуты, ну а что поделать? В equational reasoning царской дороги нет. Также требуется знание синтаскиса и семантики языка haskell, что, конечно, не так сложно, как переворачивание слайдов, но, тем не менее, не совсем легко.</p><p>Резюмируя. Фактически, это аналог того процесса, который произошел гораздо раньше в физике. Два тысячелетия философы спорили о том, летит стрела Зенона или не летит, но вот составили набор простых правил и вуаля: производные находит ученик 10-го класса. Т.е. молодое ремесло "программирование" выпускается из детского сада и идет в школу с перспективой поступить в институт, получить диплом и стать обычной инженерной деятельностью. Вроде самолетостроения. Надеюсь, что на этот раз тысячелетий не понадобится. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102774</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102774</guid>
<pubDate>Sat, 06 Aug 2011 02:09:51 +0400</pubDate>
<description><![CDATA[<p><i>> Эрланг-трэд стартует здесь.</i><br> ОМГ! Закрепили. ОК, обещаю запостить сюда статью "Как сделать на Эрлаге асинхронный TCP сервер без костылей и в рамках ОТP". Если конечно всё будет хорошо.)))</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102773</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102773</guid>
<pubDate>Sat, 06 Aug 2011 01:56:11 +0400</pubDate>
<description><![CDATA[<p><i>> Не теряя функциональной чистоты можно использовать монады</i><br> Блять, объясните мне кто-нибудь популярно, что такое монада и с чем её едят. Плиз!</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102772</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102772</guid>
<pubDate>Sat, 06 Aug 2011 01:41:20 +0400</pubDate>
<description><![CDATA[<p><i>>Без императивщины реальной проги всё равно не сделаешь.</i><br> Не теряя функциональной чистоты можно использовать монады. Их и к эрлангу приделали, например. &nbsp;<a href="http://erlanger.ru/page/1574/monady-i-srezy-v-erlang-e-erlando">http://erlanger.ru/page/1574/monady-i-srezy-v-erlang-e-erlando</a> </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102771</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102771</guid>
<pubDate>Sat, 06 Aug 2011 01:36:14 +0400</pubDate>
<description><![CDATA[<p>Эрланг-трэд стартует здесь. Просьба к модераторам не трогать пока, пусть повисит некоторое время. На фоне обсуждения УГ и политоты хоть какая-то польза. В devel все-равно никого нет.</p><p></p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102770</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102770</guid>
<pubDate>Fri, 05 Aug 2011 03:29:39 +0400</pubDate>
<description><![CDATA[<p>Без императивщины реальной проги всё равно не сделаешь. А лисп никогда как функциональный и не позиционировался вообще-то.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102769</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102769</guid>
<pubDate>Thu, 04 Aug 2011 08:01:58 +0400</pubDate>
<description><![CDATA[<p><i>> Функциональное программирование лучше по SICP. Небольшой вынос мозга, но если не всё вынесло - ерланг пойдет гораздо легче.))) </i><br> <i>> Правда я на прошел не так давно курс sicp, ну не буду понтоваться где-то на 3/5, задрал матан в примерах. </i><br> Матан - это хорошо. Спасибо за информацию. Посмотрю, может можно будет делать упражнения на erlang или поищю аналоги с haskell.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102768</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102768</guid>
<pubDate>Thu, 04 Aug 2011 07:48:08 +0400</pubDate>
<description><![CDATA[<p><i>> Открою небольшой секрет: ни схема, ни лисп, ни эрланг не являются строго функциональными языками, потому как позволяют использование императивных конструкций и побочных эффектов. </i><br> Да, и это хорошо, поскольку позволяет мне решать, когда использовать функциональное и когда императивное програмирование. Язык я выберал под конкретную задачу: программирование сетевых програм.</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102767</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102767</guid>
<pubDate>Wed, 03 Aug 2011 23:10:27 +0400</pubDate>
<description><![CDATA[<p>Открою небольшой секрет: ни схема, ни лисп, ни эрланг не являются строго функциональными языками, потому как позволяют использование императивных конструкций и побочных эффектов. </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102766</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102766</guid>
<pubDate>Wed, 03 Aug 2011 22:55:18 +0400</pubDate>
<description><![CDATA[<p>Пишу на эрланге распределенный аналог жуйки для анонимусов, сейчас использую связку erlang+exmpp+yaws. Уже есть рабочий прототип. Пиши в жаббер bonegnasher [at] jabber.ru </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102765</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102765</guid>
<pubDate>Wed, 03 Aug 2011 21:28:11 +0400</pubDate>
<description><![CDATA[<p><i>>> "Erlang Programming", Francesco Cesarini & Simon Thompson, O'Reilly </i><br>Спасибо, почитаем.</p><p><i>> Пожалуста. Я сам сейчас по ниму учусь. Позитивно, что в книге заодно и функциональное программирование преподаётся.</i><br></p><p>Функциональное программирование лучше по SICP. Небольшой вынос мозга, но если не всё вынесло - ерланг пойдет гораздо легче.))) </p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102764</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102764</guid>
<pubDate>Wed, 03 Aug 2011 21:24:21 +0400</pubDate>
<description><![CDATA[<p><i>> Посоветуй какой-нибудь приличный учебник по этому вашему эрлангу,</i><br></p><p>Я прекрасно начал с &nbsp;<a href="http://rsdn.ru/article/erlang/GettingStartedWithErlang.xml">http://rsdn.ru/article/erlang/GettingStartedWithErlang.xml</a> и дошел до темы межпроцесорного взаимодействия за два дня (~3-4 часа в день). Правда я на прошел не так давно курс sicp, ну не буду понтоваться где-то на 3/5, задрал матан в примерах. </p><p>Но впрочм немного сейчас вникну в тему рекордов, в упоминаемой статье они зря не освщались (это наверно все таки в доках эрганга). Потом вернусь к статье по поводу межпроцесорного взаимодействия, попутно читая OTP в &nbsp;<a href="http://erlanger.ru/wiki/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0.">http://erlanger.ru/wiki/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0.</a> и думаю через недельку другую, доберусь до мойшевеба.)))</p>]]></description>
</item>
<item>
<title>Re: Никто случайно не хочет Эрганг по изучать,</title>
<link>https://rulinux.net/message.php?newsid=34255&amp;page=1#102763</link>
<guid>https://rulinux.net/message.php?newsid=34255&amp;page=1#102763</guid>
<pubDate>Wed, 03 Aug 2011 21:12:13 +0400</pubDate>
<description><![CDATA[<p><i>>> по изучать </i><br><i>> Для начала выучи, что в русском языке предлога перед глаголом быть не может!</i><br></p><p>Ты знаешь, после того как я это запостил, после трудового дня прошедшего в копании ПыхПых Симфонии. Я был конечно же немного неадекватен. Но я увидел эту багу, но Туксоид для ананимусов отрезал функцию редактирования (ему минус за это). И что мне оставалось? Уповать на то что граммар-наци идут на хуй (обойдемся без условностей, на нашем ресурсе пока ещё можно посылать на хуй))).</p><p> Так чта извиняй)))</p>]]></description>
</item>
</channel>
</rss>