<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://lj.rossia.org/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>
<channel>
  <title>Програзм</title>
  <link>http://lj.rossia.org/community/programming/</link>
  <description>Програзм - LJ.Rossia.org</description>
  <managingEditor>Програзм</managingEditor>
  <lastBuildDate>Wed, 27 Apr 2011 13:17:37 GMT</lastBuildDate>
  <generator>LiveJournal / LJ.Rossia.org</generator>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/5272.html</guid>
  <pubDate>Wed, 27 Apr 2011 13:17:37 GMT</pubDate>
  <link>http://lj.rossia.org/community/programming/5272.html</link>
  <description>Может кто-нибудь подсказать, как доказать, что языки с &quot;циклической&quot; структурой (где для выражения токенов используется рекурсия) не могут являться регулярными ?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/5272.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/5272&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/5272.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/4949.html</guid>
  <pubDate>Mon, 26 Apr 2010 16:12:36 GMT</pubDate>
  <title>PERL САМЫЙ ЛУЧШИЙ</title>
  <link>http://lj.rossia.org/community/programming/4949.html</link>
  <description>subj&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/4949.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/4949&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/4949.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/4629.html</guid>
  <pubDate>Sun, 20 Sep 2009 18:42:35 GMT</pubDate>
  <link>http://lj.rossia.org/community/programming/4629.html</link>
  <description>Кто может подсказать идею файловой системы для носителя, который предназначен ТОЛЬКО для дописывания? Объем файловой структуры ОЧЕНЬ большой. Думаю, около терабайта. Нужна приятная идеология. Арвидную систему знаю... Что еще есть?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/4629.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/4629&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/4629.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/4443.html</guid>
  <pubDate>Wed, 08 Oct 2008 08:19:31 GMT</pubDate>
  <link>http://lj.rossia.org/community/programming/4443.html</link>
  <description>Чем отличается структура от класса кроме методов? Следует ли данные объявлять структурой или классом? Есть на эту тему какой-то концепт?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/4443.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/4443&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/4443.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/3906.html</guid>
  <pubDate>Wed, 29 Aug 2007 10:48:52 GMT</pubDate>
  <title>вопрос по OCaml/Camlp4</title>
  <link>http://lj.rossia.org/community/programming/3906.html</link>
  <description>фолды часто выглядят невнятно.&lt;br /&gt;хочется писать что-то вроде&lt;br /&gt;&lt;br /&gt;&lt;b&gt;let fold&lt;/b&gt; elt&lt;b&gt;&amp;lt;-&lt;/b&gt;l &lt;b&gt;into&lt;/b&gt; accu&lt;b&gt;:&lt;/b&gt;ISet.empty = ISet.add elt accu &lt;b&gt;in&lt;/b&gt;&lt;br /&gt;  print_endline (ISet.to_string accu)&lt;br /&gt;&lt;br /&gt;(или что-то подобное).&lt;br /&gt;интересно, camlp4 может нам тут помочь ?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/3906.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/3906&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/3906.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/3594.html</guid>
  <pubDate>Mon, 27 Aug 2007 13:34:20 GMT</pubDate>
  <title>еще о нём же</title>
  <link>http://lj.rossia.org/community/programming/3594.html</link>
  <description>появился вариант, способный грузить динамические&lt;br /&gt;библиотеки в native-варианте. подробности см.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://alain.frisch.fr/natdynlink.html&quot;&gt;http://alain.frisch.fr/natdynlink.html&lt;/a&gt;&lt;wbr /&gt;&lt;br /&gt;&lt;br /&gt;там же предлагают ocamlnat, toplevel, в реальном&lt;br /&gt;времени компилирующий в native и подгружающий.&lt;br /&gt;&lt;br /&gt;попробовавшие говорят, что ускорение по сравнению&lt;br /&gt;с обычным ocamltop колоссальное (раз в сорок)&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/3594.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/3594&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/3594.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/3464.html</guid>
  <pubDate>Mon, 27 Aug 2007 11:27:05 GMT</pubDate>
  <title>красивые грабли: OCaml</title>
  <link>http://lj.rossia.org/community/programming/3464.html</link>
  <description>о прекрасном.&lt;br /&gt;&lt;br /&gt;написал чудесный функтор&lt;br /&gt;module type Holder =&lt;br /&gt;sig&lt;br /&gt;  type t&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;module Comparable(H:Holder) =&lt;br /&gt;struct&lt;br /&gt;  type t = H.t&lt;br /&gt;  let compare = compare&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;прекрасно применяется, между прочим, к целым,&lt;br /&gt;строкам, декартовым произведениям, вариантам ...&lt;br /&gt;&lt;br /&gt;и всё бы было ничего, но функция&lt;br /&gt;lim f eq start =&lt;br /&gt;  let next = f start in&lt;br /&gt;  if (eq start next) then next&lt;br /&gt;  else lim f eq next&lt;br /&gt;(которая весьма полезна для набивки множеств,&lt;br /&gt;получения связных компонент графов и &lt;br /&gt;всего такого прочего) у меня зациклилась&lt;br /&gt;(на Map[Comparable[Set[...]]] и этот самый&lt;br /&gt;compare = 0)&lt;br /&gt;&lt;br /&gt;&lt;lj-cut text=&quot;мораль проста ...&quot;&gt;&lt;br /&gt;не будь, как тот медведь:&lt;br /&gt;compare действительно определяет &lt;b&gt;структурную&lt;/b&gt;&lt;br /&gt;эквивалентность базовых типов - т.е. сравнение того,&lt;br /&gt;&lt;b&gt;что лежит внутри&lt;/b&gt;. но у множеств внутри лежат&lt;br /&gt;сбалансированные деревья, и вот они-то множеством&lt;br /&gt;определяются  неоднозначно: зависят от порядка закладки&lt;br /&gt;туда элементов. посему, кстати, у Set и Map есть&lt;br /&gt;свой compare, правильный &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/3464.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/3464&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/3464.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/3147.html</guid>
  <pubDate>Tue, 17 Jul 2007 09:24:07 GMT</pubDate>
  <title>ocaml lablgtk2</title>
  <link>http://lj.rossia.org/community/programming/3147.html</link>
  <description>вопрос - пытался ли кто-нибудь компилировать lablgtk2 под msys/mingw ?&lt;br /&gt;имеются проблемы - под windows почему-то отсутствует ocamlmklib,&lt;br /&gt;ocamlmktop глючит, и т.д.&lt;br /&gt;все это обходится - код у mklib несложный, и все, что она делает,&lt;br /&gt;можно сделать вручную и т.д. (также проблема в том, что&lt;br /&gt;ocaml под windows генерирует &quot;неправильные&quot; слэши для&lt;br /&gt;имени, например, временных файлов и т.д.).&lt;br /&gt;это не очень сложно поправить, исходники ocaml удивительно&lt;br /&gt;внятные, но интересно, не решал ли кто-нибудь уже эту задачу.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/3147.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/3147&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/3147.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/3027.html</guid>
  <pubDate>Mon, 09 Jul 2007 10:00:07 GMT</pubDate>
  <title>еще про заключенных (романтическое)</title>
  <link>http://lj.rossia.org/community/programming/3027.html</link>
  <description>троих заключенных сажают в три одиночки. в каждой одиночке&lt;br /&gt;на стене лампочка. каждая лампочка либо горит, либо не горит&lt;br /&gt;в течение дня.&lt;br /&gt;заключенным известно, что лампочки переключаются по одной из&lt;br /&gt;двух стратегий. согласно первой, каждый день горят ровно&lt;br /&gt;две из трех. согласно второй, некоторое количество дней&lt;br /&gt;(неизвестное) в начале срока горят ровно две из трех, &lt;br /&gt;а остаток срока - ровно одна из трех.&lt;br /&gt;так они сидят натуральную вечность (1,2,3,...).&lt;br /&gt;по окончании вечности они должны, не советуясь, &lt;br /&gt;проголосовать - каждый за ту стратегию, которая, &lt;br /&gt;по его мнению, применялась.&lt;br /&gt;перед началом срока они могут советоваться&lt;br /&gt;сколько угодно.&lt;br /&gt;&lt;br /&gt;существует ли метод голосования, позволяющий угадать&lt;br /&gt;применявшуюся стратегию большинством голосов ?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/3027.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/3027&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/3027.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/2742.html</guid>
  <pubDate>Sat, 07 Jul 2007 06:10:28 GMT</pubDate>
  <title>Задачка</title>
  <link>http://lj.rossia.org/community/programming/2742.html</link>
  <description>Для оживления коммьюнити вот еще одна задачка:&lt;br /&gt;имеется тюрьма, в которой сидят по одиночным&lt;br /&gt;камерам N заключенных. В тюрьме так же есть&lt;br /&gt;комната с двумя рубильниками, у каждого &lt;br /&gt;рубильника два положения (вкл/выкл), начальное&lt;br /&gt;положение рубильников неизвестно.&lt;br /&gt;&lt;br /&gt;Начальство тюрьмы собирает заключенных вместе&lt;br /&gt;и говорит: я буду в некотором произвольном (не&lt;br /&gt;обязательно случайном!) порядке водить каждого&lt;br /&gt;из вас в комнату с рубильниками. При заходе в&lt;br /&gt;комнату вы будете обязаны переключить ровно&lt;br /&gt;один из рубильников (по вашему выбору). Как &lt;br /&gt;только кто-то из вас при заходе в комнату определит&lt;br /&gt;(по состоянию рубильников и собственной памяти),&lt;br /&gt;что все ЗК уже в комнате побывали и скажет мне&lt;br /&gt;об этом, то я вас отпущу. Сказать мне об этом&lt;br /&gt;можно только один раз. Я гарантирую, что каждого&lt;br /&gt;из вас будут водить в комнату достаточное &lt;br /&gt;количество раз, чтобы определение присутствия &lt;br /&gt;всех ЗК было возможным. Водить я буду вас по&lt;br /&gt;одному и вы не сможете общаться между собой.&lt;br /&gt;Я даю вам время сейчас всем вместе обсудить&lt;br /&gt;стратегию.&lt;br /&gt;&lt;br /&gt;Задача в том, чтобы придумать эту выигрышную &lt;br /&gt;стратегию.&lt;br /&gt;&lt;br /&gt;PS: Условие &quot;достаточного количества вызовов&quot; и&lt;br /&gt;произвольности порядка вызова можно сформулировать&lt;br /&gt;так: при стремлении к бесконечности общего числа&lt;br /&gt;вызовов в комнату, число вызовов каждого конкретного&lt;br /&gt;ЗК также стремится к бесконечности некоторым &lt;br /&gt;произвольным (не обязательно случайным!) образом.&lt;br /&gt;&lt;br /&gt;PPS: Комменты скринятся.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/2742.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/2742&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/2742.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/2441.html</guid>
  <pubDate>Sun, 24 Jun 2007 15:32:56 GMT</pubDate>
  <title>Простая задачка (с красивым решением)</title>
  <link>http://lj.rossia.org/community/programming/2441.html</link>
  <description>Имеется последовательность из N объектов,&lt;br /&gt;про любые два из которых можно сказать только&lt;br /&gt;равны они или нет. Известно, что некоторого&lt;br /&gt;объекта в последовательности больше половины.&lt;br /&gt;Придумать алгоритм поиска этого объекта, &lt;br /&gt;который бы завершался за один проход по &lt;br /&gt;последовательности и использовал фиксированный&lt;br /&gt;(то есть не зависящий от N) объем памяти.&lt;br /&gt;&lt;br /&gt;Комменты скринятся.&lt;br /&gt;&lt;br /&gt;Пояснение:&lt;br /&gt;&lt;br /&gt;Понятно, что количество бит, при помощи которых&lt;br /&gt;можно закодировать число N зависит от N, но &lt;br /&gt;конкретно этой зависимостью можно пренебречь.&lt;br /&gt;Также понятно, что от размера объекта зависит&lt;br /&gt;объем используемой памяти. Этой зависимостью можно&lt;br /&gt;также пренебречь. Существенно, чтобы количество&lt;br /&gt;используемой памяти не зависело от количества&lt;br /&gt;элементов в последовательности.&lt;br /&gt;&lt;br /&gt;Решение (выделить мышкой):&lt;br /&gt;&lt;font color=&quot;white&quot;&gt;&lt;br /&gt;&lt;pre&gt;
Одно из возможных решений основывается на том
интересном факте, что из последовательности
можно выкинуть 3 произвольных попарно неравных
элемента. При этом количество искомых элементов
по прежнему будет больше половины в уменьшенной
последовательности. Другое решение (более простое),
предложенное Димой Калединым, также использует 
индукцию. Понять, как именно, предоставляется 
читателю в качестве упражнения.

Для простоты в решении рассматривается массив из
целых чисел. Алгоритмы, впрочем, будут работать для
любых объектов.

Мой вариант решения:

int find_most_repeatable(int *arr, size_t size)
{
    unsigned int        i;
    int                 a, b = 0, e, answer_a, answer_b, answer;

    answer_a = arr[0];
    a = 1;
    
    for (i = 1; i &amp;lt; size; i ++)
    {
        e = arr[i];
    
        if (answer_a == e &amp;&amp; a &amp;gt; 0)
            a ++;
        else if (answer_b == e &amp;&amp; b &amp;gt; 0)
            b ++;
        else
        {
            if (a == 0)
            {
                answer_a = e;
                a = 1;
                continue;
            }
            else if (b == 0)
            {
                answer_b = e;
                b = 1;
                continue;
            }

            a --; b --;
        }
    }

    if (a &amp;gt;= b)
        answer = answer_a;
    else
        answer = answer_b;
    
    return answer;
}

Вариант Димы Каледина (исправленный):

int find_most_repeatable2(int *arr, size_t size)
{
    unsigned int        i;
    int                 answer, e, c;
    
    answer = arr[0];
    c = 0; 
    for (i = 1; i &amp;lt; size; i ++)
    {
        e = arr[i];

        if (answer == e)
        {
            c ++;
            if (c &amp;lt;= 0)
                c ++;
        }
        else if (c &amp;gt;= 0)
            c --;

        if (c &amp;lt; 0)
            answer = e;
    }

    return answer;
}
&lt;/pre&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/2441.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/2441&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/2441.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/2272.html</guid>
  <pubDate>Wed, 25 Oct 2006 13:34:52 GMT</pubDate>
  <title>Erlang и утечка памяти.</title>
  <link>http://lj.rossia.org/community/programming/2272.html</link>
  <description>Почему это течет? Функция select_calls вызывает себя рекурсивно, но, вроде как tail recursion, так что все нормально.&lt;br /&gt;&lt;br /&gt;&lt;lj-cut text=&quot;под кат!&quot;&gt;&lt;code&gt;&lt;pre&gt;
select_calls(Ref,Fd,NumberOfCalls) -&amp;gt;
        case odbc:next(Ref) of 
                {selected,[&quot;CS_CALLER_ID&quot;,&quot;CS_CALLED_ID&quot;,&quot;CS_CALL_ID&quot;,&quot;CS_TAG_TO&quot;,&quot;CS_TAG_FROM&quot;,&quot;CS_ROUTE_TO&quot;,&quot;CS_ROUTE_FROM&quot;], [{Caller,Called,SessionID,TagTo,TagFrom,RouteTo,RouteFrom}]} -&amp;gt;
                        send_msg (Fd,Caller,Called,SessionID,TagTo,TagFrom,RouteTo),
                        send_msg (Fd,Called,Caller,SessionID,TagFrom,TagTo,RouteFrom),
                        select_calls(Ref,Fd,NumberOfCalls+1);
                Error -&amp;gt; 
                        io:format(&quot;Select next FAILED!\n&quot;)
        end.

send_msg (Fd,Caller,Called,SessionID,TagTo,TagFrom,Route) -&amp;gt;
        Msg = &quot;BYE sip:127.0.0.1:5060 SIP/2.0 \r\n&quot;
        &quot;Via: SIP/2.0/UDP 127.0.0.1:3456\r\n&quot;
        &quot;From: &amp;lt;&quot; ++ Caller ++ &quot;&amp;gt;;tag=&quot; ++ TagFrom ++ &quot;\r\n&quot;
        &quot;To: &amp;lt;&quot; ++ Called ++ &quot;&amp;gt;;tag=&quot; ++ TagTo ++ &quot;\r\n&quot;
        &quot;Call-ID: &quot; ++ SessionID ++ &quot;\r\n&quot;
        &quot;Route: &amp;lt;&quot; ++ Route ++ &quot;&amp;gt;\r\n&quot;
        &quot;CSeq: 123 BYE\r\n&quot;
        &quot;Content-Length: 0\r\n&quot;
        &quot;\r\n&quot;,

        gen_udp:send(Fd,&quot;127.0.0.1&quot;,5060, [Msg]).
&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Если в функции select_calls закомментировать вызов send_msg, то ничего не течет. Так как же в erlang&apos;е правильно строки-то отсылать через socket?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/2272.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/2272&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/2272.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/2042.html</guid>
  <pubDate>Thu, 19 Oct 2006 18:43:05 GMT</pubDate>
  <title>Цикл на Erlang&apos;е</title>
  <link>http://lj.rossia.org/community/programming/2042.html</link>
  <description>Приветствую!&lt;br /&gt;&lt;br /&gt;Что-то я недопонял. Как заставить выполнить кусок кода, скажем, шесть раз.&lt;br /&gt;&lt;br /&gt;Дано:&lt;br /&gt;&lt;br /&gt;unixODBC, откуда я читаю записи вот  так:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;main_cycle (Ref) -&amp;gt;
	case odbc:select_count(Ref, &quot;select A,B,C from name.table&quot;) of 
		{ok, NumberOfRows} -&amp;gt;
			if 
				NumberOfRows &amp;gt; 0 -&amp;gt;
					select_calls(Ref)
			end;
		Error -&amp;gt; 
			exit(Error)
	end.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;В вышеуказанной функции я получаю NumberOfRows например равным шести. Я не нашел ничего лучше, как рекурсивно выполнить select_calls до тех пор, пока мне не сообщат об ошибке:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;select_calls(Ref) -&amp;gt;
	case odbc:next(Ref) of 
		{selected,[&quot;CS_CALLED_STATION_ID&quot;,&quot;CS_CALLING_STATION_ID&quot;,&quot;CS_LOCALCALLID&quot;], [{Caller,Called,SessionID}]} -&amp;gt;
			write_msg(Caller,Called,SessionID),
			select_calls(Ref);
	Error -&amp;gt; 
		io:format(&quot;end of data\n&quot;)
	end.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Запросить сразу лист записей, а потом сделать map или foreach нельзя, т.к. драйвер базы данных (Oracle) для unixODBC еще не дописан до конца (а фирменный от Oracle или другой коммерческий от Easysoft настолько проблемно ставится, что проще будет пока с этим повозиться) и не позволяет селектом выдавать сразу лист  - только так, по одной записи. &lt;br /&gt;&lt;br /&gt;Так вот, хотелось бы не дожидаться пока odbc:next выбросит ошибку, а выполнить его столько, сколько мне надо.&lt;br /&gt;&lt;br /&gt;Как?&lt;br /&gt;А то я что-то этот момент упустил пока. В туториалах есть много-много про параллельное программирование и кластеризацию ,а вот такой момент что-то обойдет вниманием.&lt;br /&gt;&lt;br /&gt;Я хотел добавить лишний параметр в вызов функции, что-то вроде &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;select_calls(Ref, counter) -&amp;gt;
	if
		counter &amp;gt; 0 -&amp;gt;
			...
			select_calls(Ref, counter-1);
	end.&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;но это почему-то не работает.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/2042.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/2042&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/2042.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/1709.html</guid>
  <pubDate>Wed, 17 May 2006 13:33:11 GMT</pubDate>
  <title>OCaml SNMP</title>
  <link>http://lj.rossia.org/community/programming/1709.html</link>
  <description>Недавно разгребал старые архивы и обнаружил враппер библиотеки &lt;a href=&quot;http://www.net-snmp.org/&quot;&gt;Net SNMP&lt;/a&gt; для OCaml. Интересно, кому-нибудь кроме меня такое может понадобиться? :&amp;gt; &lt;br /&gt;&lt;br /&gt;/me думает, стоит ли его приводить в порядок (местами оно довольно страшное в духе потока сознания) и выкладывать куда-нибудь. Самому в настоящий момент не надо.&lt;br /&gt;&lt;br /&gt;P.S. Использование выглядит примерно &lt;a href=&quot;http://uzhe.nichego.net/junk/snmpdemoapp.ml&quot;&gt;так&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/1709.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/1709&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/1709.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/1380.html</guid>
  <pubDate>Fri, 06 Jan 2006 23:17:41 GMT</pubDate>
  <title>Переписываем и хаскеля в камл</title>
  <link>http://lj.rossia.org/community/programming/1380.html</link>
  <description>Тут в &lt;a href=&quot;http://www.livejournal.com/community/ru_lambda/5507.html&quot;&gt;http://www.livejournal.com/community/ru_&lt;wbr /&gt;lambda/5507.html&lt;/a&gt; написана замечательная программа.&lt;br /&gt;Я попытался переписать ее на камл, получилось почти буква в букву:&lt;br /&gt;&lt;pre&gt;
let  scanl f i l = 
  let rec aux i = function
      [] -&amp;gt; []
    | x :: xs -&amp;gt; 
        let ir = f i x in
          ir :: (aux ir xs) in
    i :: (aux i l)

let flip f a b = f b a

let rec rmake = function
    0 -&amp;gt; []
  | n -&amp;gt; n :: (rmake (n - 1))

let lmake n =  List.rev (rmake n)

let (^) f g x = f (g x)

let apply f x = f x

(**************)

let move (top::xs, ys, zs) = (xs, top::ys, zs)

let yz (x,y,z) = (x,z,y)
let xz (x,y,z) = (z,y,x)

let twist g f = g ^ f ^ g

let rec moves = function
    0 -&amp;gt; []
  | n -&amp;gt; List.map (twist yz) (moves (n - 1)) @ move :: List.map (twist xz) (moves (n - 1))

let hanoi n =
  scanl (flip apply) ((lmake n), [], []) (moves n)
&lt;/pre&gt;&lt;br /&gt;за тем малым исключением, что пришлось написать часть библиотечных функций.&lt;br /&gt;Что самое забавное, hugs, который в debian/stable, падает по sigv раньше, что ocaml(top) начинает говорить stack overflow. Желающие могут проверить ocamlopt :-)&lt;br /&gt;&lt;br /&gt;PS: битик в unboxed values воруется для того что бы всегда можно было знать что это: значение или указатель. Именно из-за этого у камла быстрая арифметика.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/1380.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/1380&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/1380.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/1181.html</guid>
  <pubDate>Mon, 12 Dec 2005 12:55:43 GMT</pubDate>
  <title>А есть ли тут схимники? (schemers)</title>
  <link>http://lj.rossia.org/community/programming/1181.html</link>
  <description>%subj%&lt;br /&gt;&lt;br /&gt;Интересует как в scheme производится обработка исключений наиболее распространенным образом? Исключения интересуют, конечно, связанные с внешней средой, типа ошибки при открытии файла (про call/cc я в курсе и он тут никак не поможет). &lt;br /&gt;&lt;br /&gt;R5RS читал (не очень, впрочем, внимательно), но такого не обнаружил. Google при поиске типа &quot;scheme exception handling&quot; выдает десятки различных вариантов.&lt;br /&gt;&lt;br /&gt;P.S. Есть о&apos;камловая программа, в которой в качестве языка конфигов используется примитивное подмножество scheme (написанное мною давным-давно за пару дней и даже без tail рекурсии). Думаю заменить свою убогую реализацию на &lt;a href=&quot;http://will.iki.fi/software/ocs/&quot;&gt;ocs&lt;/a&gt; или &lt;a href=&quot;http://home.arcor.de/chr_bauer/schoca.html&quot;&gt;schoca&lt;/a&gt; (скорее всего, на ocs) и вынести часть функциональности в конфиги. Обработку исключений придется, похоже, дописывать самому. Так вот интересует, стоит ли что-то брать за образец или изобретать велосипед самому?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/1181.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/1181&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/1181.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/920.html</guid>
  <pubDate>Fri, 18 Nov 2005 09:39:47 GMT</pubDate>
  <title>Реализация вызова метода в O&apos;Caml</title>
  <link>http://lj.rossia.org/community/programming/920.html</link>
  <description>На самом деле идея простая, но красивая. &lt;br /&gt;&lt;br /&gt;В чем пробелма: с точки зрения статического контроля типов, объект может выступать&lt;br /&gt;под любым типом, которому соотвествует его сигнатура (то есть - наличествуют&lt;br /&gt;заданные методы и их типы подходят). В месте, где происходит вызов метода, &lt;br /&gt;компилятор ничего не знает про тип самого объекта. Он обычно не знает, что такой тип&lt;br /&gt;вообще существует.&lt;br /&gt;&lt;br /&gt;В месте, где создается объект, компилятор как правило ничего не знает о том, что&lt;br /&gt;где-то этот объект будет использоваться с конкретной сигнатурой. В отличие от &lt;br /&gt;языков, где иерархия основана на наследовании все предки в месте создания объекта&lt;br /&gt;известны, O&apos;Caml базируется на отношинее subtyping&apos;a.&lt;br /&gt;&lt;br /&gt;Понятно, что можно в объекте держать таблицу методов с именами и динамически искать их.&lt;br /&gt;Но это как-то не очень. Цикл устраивать. Потому делается так (решение подходит и к реализации&lt;br /&gt;записей с subtyping&apos;ом по включению набора полей):&lt;br /&gt;&lt;br /&gt;Все имена методов нумеруются глобально по всей программе. Это может делать линкер, в&lt;br /&gt;O&apos;Caml это делается динамически при запуске программы. Далее в качестве VMT можно использовать&lt;br /&gt;таблицу длины n_meth, где n_meth - количество имен методов.  В пустующие клетки не записывается &lt;br /&gt;ничего, в остальные - адреса функций.&lt;br /&gt;&lt;br /&gt;Вызов делается просто - по номеру метода берется соотвествующий адрес и вызывается. Статическй&lt;br /&gt;контроль гарантирует, что метод с данным именем/номером будет. &lt;br /&gt;&lt;br /&gt;Идея хороша всем, кроме того, что n_meth может быть довольно большим (напирмер 1000), а заводить для каждого класса&lt;br /&gt;(пусть 200 классов) табличку в 1000 слов несколько накладно - даже тут уже получится мегабайт. Это при&lt;br /&gt;весьма умеренных n_meth и числе классов. Опять же - понятно, что таблики будут почти пустые.&lt;br /&gt;&lt;br /&gt;Потому они поджимаются довольно простым методом: для сильно разреженной таблицы с n объектами обычно можно подобрать&lt;br /&gt;немного большее число p, такое, что для любого момера k элемента в табличке, k mod p будет однозначно &lt;br /&gt;определять k (среди присутсвующих в таблице гнезд). То есть - такое простенькое безконфоликтное хэширование.&lt;br /&gt;&lt;br /&gt;Далее - в начало таблицы записывается подобранное p, а адреса методов располагаются в позиция по модулю&lt;br /&gt;p. Вызов метода соотвественное делается просто - берется остаток от деления номера метода на p из таблицы&lt;br /&gt;и вызывается то, что лежит по адресу.&lt;br /&gt;&lt;br /&gt;Придумал это &lt;a href=&quot;http://pauillac.inria.fr/~remy&quot;&gt;Didier Rémy&lt;/a&gt; в 1992 года:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;ftp://ftp.inria.fr/INRIA/Projects/cristal/Didier.Remy/eff-repr-of-ext-records.ps.gz&quot;&gt;Efficient Representation of Extensible Records&lt;/a&gt;. In Proceedings of the 1992 workshop on ML and its Applications, page 12, San Francisco, USA, June 1992&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/920.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/920&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/920.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/704.html</guid>
  <pubDate>Mon, 07 Nov 2005 19:48:38 GMT</pubDate>
  <title>Про объекты в O&apos;Caml:</title>
  <link>http://lj.rossia.org/community/programming/704.html</link>
  <description>Объектность там забавная и в каком-то смысле очень оригинальная&lt;br /&gt;&lt;br /&gt;Во-первых - типизация там, как и везде статическая.&lt;br /&gt;Во-вторых - при этом там не наследования в обычном смысле&lt;br /&gt;этого слова.&lt;br /&gt;&lt;br /&gt;То есть: &quot;объектный тип&quot; (АКА class type - типы, которые приписываются&lt;br /&gt;значениям объектам) - это сигнатура. То есть - список методов, &lt;br /&gt;которые должны быть у объекта + их типы. Ну например - &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;type p2d = &amp;lt; x : int; y : int &amp;gt; &lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;тип, которому соотвествует любой объект, у которого есть методы x и y,&lt;br /&gt;возвращающие int. Соотвественно - естественным путем возникает&lt;br /&gt;отношение тип-подтип между объектными типами. Оно и заменяет наследование.&lt;br /&gt;Важно не то, как объекты образоывывались, а что они умеют.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Более интересный пример (кажется не выразимый ни в одном из статически&lt;br /&gt;типизированных языкоа): &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;type eq = &amp;lt; eq : &apos;a -&amp;gt; bool &amp;gt; as &apos;a&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Тут это тип объекта, у которого есть метод eq, ожидающий получить параметром&lt;br /&gt;объект в точности того же самого типа. Понятно, что  трехмерная точка&lt;br /&gt;будет одноврменно и двумерной, но сравнение на = разнородных точек вряд ли уместно.&lt;br /&gt;&lt;br /&gt;Наследование, конечно, есть, но это конструкция скорее синтаксическая - &lt;br /&gt;вместо использования inherit, можно просто повторить все тоже самое&lt;br /&gt;руками. Результат, за исключением тонких нюансов, отличаться не будет:&lt;br /&gt;&lt;pre&gt;
class p2d (x:int) (y:int) = object (self:&apos;self)
    method x = x
    method y = y
    method eq (a: &apos;self) = self#x = a#x &amp;&amp; self#y = a#y
end
                                                                                                
class p3d (x:int) (y:int) (z:int) = object (self:&apos;self)
    inherit p2d x y as super
    method z = z
    method eq (a: &apos;self) = super#eq (a :&amp;gt; &apos;self) &amp;&amp; self#z = a#z
end
                                                                                                
class p3d&apos; (x:int) (y:int) (z:int) = object (self:&apos;self)
    method x = x
    method y = y
    method z = z
    method eq (a: &apos;self) = self#x = a#x &amp;&amp; self#y = a#y &amp;&amp; self#z = a#z
end
                    
let p2 = new p2d 1 2                                                                             
let p3_1 = new p3d 1 2 3
let p3_2 = new p3d 1 2 3
let _ = Printf.printf &quot;%b\n&quot; (p3_1#eq p3_2)
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Разницы между p3d и p3d&apos; с точки  зрения типов нет никакой. Типы&lt;br /&gt;у них идентичны.&lt;br /&gt;&lt;br /&gt;Обращу внимание,что &lt;pre&gt;p2#eq p3_1&lt;/pre&gt; написать нельзя. Будет&lt;br /&gt;ошибка типизации.&lt;br /&gt;&lt;br /&gt;Вот вкратце все.&lt;br /&gt;&lt;br /&gt;Как это реализуется (а вызов метода делается за константное время), &lt;br /&gt;будет в следующем номере.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/704.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/704&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/704.html</comments>
</item>
<item>
  <guid isPermaLink='true'>http://lj.rossia.org/community/programming/293.html</guid>
  <pubDate>Tue, 01 Nov 2005 22:33:26 GMT</pubDate>
  <title>Для затравки</title>
  <link>http://lj.rossia.org/community/programming/293.html</link>
  <description>Представление данных в O&apos;Caml (и вообзще -ML):&lt;br /&gt;&lt;br /&gt;На самом деле - оно очень красиво. Что самое забавное - на С изобразить &lt;br /&gt;это можно, но задолбаешся. Итак:&lt;br /&gt;&lt;br /&gt;1) никакого RTTI в O&apos;Caml нет. Нет настолько, что сделать downcasting в&lt;br /&gt;объектном расширении просто невозможно технически.&lt;br /&gt;&lt;br /&gt;2) Представление данных там стольже прямолинейно и тупо как в Pascal.&lt;br /&gt;&lt;br /&gt;3) Что есть - есть следующее:&lt;br /&gt;&lt;br /&gt;Все &lt;s&gt;типы&lt;/s&gt;значения представляются в O&apos;Caml одним словом и делятся на boxed &lt;br /&gt;и unboxed. Boxed - это  те, которые лежат в куче, а представляются адресом в оной.&lt;br /&gt;Unboxed - представляются своим физическим значением, сдвинутым влево на 1 бит и &lt;br /&gt;1 в младшем бите. Потому, собственно, int в O&apos;Caml не 31, а 30 битов. &lt;br /&gt;&lt;br /&gt;Unboxed values - int, char, bool, unit (да - у него есть значение - нолик), &lt;br /&gt;и элементы union&apos;s (АТД) без &quot;of ...&quot;.&lt;br /&gt;&lt;br /&gt;Boxed - все остальное. Соотвественно как представляются &lt;br /&gt;&lt;br /&gt;type &apos;a Tree = E | N of &apos;a tree * &apos;a * &apos;a tree&lt;br /&gt;&lt;br /&gt;Вариант E - просто 0 (с учетом сдвига и битика - 1)&lt;br /&gt;вариант N - адрес блока, в котором лежит три слова - элементы узла.&lt;br /&gt;Сам тэг (1) лежат в управляющем слове по смещению -4 от адреса.&lt;br /&gt;&lt;br /&gt;Вот. Общая идея, надеюсь, понятна. На самом деле вся &quot;информация о типах&quot; в run-time&lt;br /&gt;сводится к этому самому младжему битику, который отличает значение от адреса. Более&lt;br /&gt;- ничего. Какие-то вещи (вроде сериализации или полиморфного сравнения) на этом&lt;br /&gt;сделать можно. Но вообще-то мало что можно.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align:left&quot;&gt;&lt;font size=&quot;-2&quot;&gt;&lt;a href=&quot;http://lj.rossia.org/community/programming/293.html&quot;&gt;&lt;img src=&quot;http://lj.rossia.org/numreplies/programming/293&quot; border=0 width=26 height=17  alt=&quot;number of comments&quot; style=&quot;border:0px;&quot; /&gt; &lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt;&lt;/font&gt;&lt;/div&gt;</description>
  <comments>http://lj.rossia.org/community/programming/293.html</comments>
</item>
</channel>
</rss>
