tag:blogger.com,1999:blog-72808097862420579102024-03-13T05:39:44.946+03:00Mind -> [Thought] -> IO Blog -- Here I am(setf *my-blog* (make-instance 'blog)) ;Also available in Common LISPCrazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.comBlogger69125tag:blogger.com,1999:blog-7280809786242057910.post-66432131196504232742012-06-11T11:19:00.002+04:002012-06-11T11:19:53.879+04:00Инженер.<div dir="ltr" style="text-align: left;" trbidi="on">
Защитился на прошлой неделе. Теперь я - полноценный инженер с оценкой "отлично" в дипломе.</div>Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-42262722427642481492012-03-31T21:15:00.000+04:002012-03-31T21:15:05.807+04:00У вас Perlянка // It's luPLus.<div dir="ltr" style="text-align: left;" trbidi="on"><br />
В конце рабочей недели вернулся на время к good old Perl.<br />
<br />
Нужно было перенести сайт с PHP-рельс (хе-хе) на рельсы Великого и Ужасного. Решил воспользоваться фреймворком Mojolicious (http://mojolicio.us) для этих целей.<br />
<br />
Скоро будет уже года два, как я не пишу на Perl. Сам фреймворк производит великолепное впечатление, все достаточно аккуратно и логично. Наличествуют _почти_ все атрибуты уважающего себя веб-фреймворка - пути, расширяемый шаблонизатор, запросы-ответы, есть даже модные "HTML5-штуки" навроде WebSockets. Не хватает только управляемых форм (вместо расставляемых в шаблоне тегов и ручного извлечения из POST-параметров) и ORM для связи с БД. Но с ORM-ами у Perl вообще все как-то грустновато. Для работы с электронной почтой нашелся плагин (плагины для Моджо - отдельная тема, их достаточно много и просто писать свои).<br />
<br />
Также есть приятный режим Mojolicious::Lite, который позволяет простецкое приложение описать вообще одним файлом, есть встроенный оптимизированный сервер - Гипножаба (СЛАВА ГИПНОЖАБЕ), не хватает только встроенного репла, как в джанге.<br />
<br />
В целом, опытом остался доволен, хотя несколько раз рабочий процесс сильно тормозил из-за особенностей Perl, вернее, из-за перерыва. Ну и из-за прочих областей, в которые пришлось залезть.<br />
</div>Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-25799118134198053242011-10-31T16:46:00.000+04:002011-10-31T16:46:58.584+04:00Лисповое<div dir="ltr" style="text-align: left;" trbidi="on"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsTxZHIuVjr7ZNBZdE7NObnv5HuSIJoKSbtOPXgdYzLIZ6CvtNKLIgtsvgKszEl4kQXjvoNTf5ZjLDTxkhzAZtSefdYklxTuu0CTZQalFqrJDlfAEwhgyQxpdYL6O6YgBxU-KENejyb1O1/s1600/ouroboros-lisp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="319" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsTxZHIuVjr7ZNBZdE7NObnv5HuSIJoKSbtOPXgdYzLIZ6CvtNKLIgtsvgKszEl4kQXjvoNTf5ZjLDTxkhzAZtSefdYklxTuu0CTZQalFqrJDlfAEwhgyQxpdYL6O6YgBxU-KENejyb1O1/s320/ouroboros-lisp.png" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><br />
</div>Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-22844040311772612332010-12-12T19:42:00.000+03:002010-12-12T19:42:58.412+03:00Идея для футболки<div>Пришла в голову офигенная идея для футболки. Носить обязательно на девушке.</div><br />
<div>Итак, на груди надпись:<br />
<pre>'( )</pre>Между скобками, естественно, ОНИ. А ниже надпись:<br />
<pre>LISP - тема списков раскрыта</pre>Ящитаю, будет бомба.</div>Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com3tag:blogger.com,1999:blog-7280809786242057910.post-69198421996339132772010-12-10T01:49:00.001+03:002010-12-10T01:49:42.085+03:00Ад дизайна и угар цветовой гаммыСменил дизайн бложека. Теперь все еще более вырвиглазно.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com1tag:blogger.com,1999:blog-7280809786242057910.post-85709788772802868972010-12-09T19:46:00.004+03:002010-12-10T19:44:18.721+03:00Clojure - пишем программу с базовым интерфейсом и собираем ее в .jar<div>Переписал пример из "Core Java. Fundamentals" на clojure, чтобы разобраться с тем, как на ней пишется GUI.</div><div>Код и комментарии - под катом.</div><div><a name='more'></a>Вот код:</div><div style="background-color: darkslategrey; color: wheat;"><style type="text/css">
<!--
.builtin {
/* font-lock-builtin-face */
color: #98fb98;
font-weight: bold;
}
.function-name {
/* font-lock-function-name-face */
color: #7b68ee;
font-weight: bold;
}
.keyword {
/* font-lock-keyword-face */
color: #fa8072;
}
.string {
/* font-lock-string-face */
color: #ffa07a;
font-style: italic;
}
.type {
/* font-lock-type-face */
color: #9acd32;
font-weight: bold;
}
a {
color: inherit;
background-color: inherit;
font: inherit;
text-decoration: inherit;
}
a:hover {
text-decoration: underline;
}
-->
</style><br />
<pre>(<span class="keyword">ns</span> interfacetest.core
(<span class="builtin">:import</span> [javax.swing
JFrame
JLabel
JFileChooser
JMenuBar
JMenuItem
JMenu
ImageIcon]
[java.io
File]
[java.awt.event
ActionListener])
(<span class="builtin">:gen-class</span>))
(<span class="keyword">defn</span> <span class="function-name">create-listener</span> [lmbd]
(<span class="builtin">proxy</span> [ActionListener]
[]
(actionPerformed [e] (lmbd e))))
(<span class="keyword">defn</span> <span class="function-name">initframe</span> [<span class="type">#^JFrame</span> frame]
(<span class="keyword">let</span> [lbl (JLabel.)
chooser (JFileChooser.)
menubar (JMenuBar.)
menu (JMenu. <span class="string">"File"</span>)
openItem (JMenuItem. <span class="string">"Open"</span>)
exitItem (JMenuItem. <span class="string">"Exit"</span>)]
(<span class="keyword">doto</span> openItem
(.addActionListener
(create-listener
(<span class="builtin">fn</span> [e] (<span class="keyword">let</span> [result (.showOpenDialog chooser nil)
getname (<span class="builtin">fn</span> [] (<span class="keyword">..</span> chooser getSelectedFile getPath))]
(<span class="keyword">if</span> (<span class="builtin">=</span> result JFileChooser/APPROVE_OPTION)
(.setIcon lbl (ImageIcon. (getname)))))))))
(<span class="keyword">doto</span> exitItem
(.addActionListener
(create-listener
(<span class="builtin">fn</span> [e] (System/exit 0)))))
(.setCurrentDirectory chooser (File. <span class="string">"."</span>))
(<span class="keyword">doto</span> menu
(.add openItem)
(.add exitItem))
(.add menubar menu)
(<span class="keyword">doto</span> frame
(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
(.setSize 300 300)
(.setVisible true)
(.add lbl)
(.setJMenuBar menubar))))
(<span class="keyword">defn</span> <span class="function-name">-main</span> []
(<span class="keyword">let</span> [fr (JFrame. <span class="string">"Hello world"</span>)]
(initframe fr)))
</pre></div><div>Результатом работы программы будет небольшая формочка с двумя пунктами меню - "Open" и "Exit". Open предложит выбрать изображение, которое и будет помещено на формочку (изображение не ресайзится, от очень большой картинки будет показана только часть.<br />
</div><div>Разберем код по порядку.<br />
</div><div>Инструкция (ns) задает пространство имен под названием interfacetest.core. В ней же указано, что необходимо сгенерировать Java-класс для этого пространства имен (что и будет сделано при компиляции) - :gen-class. В директиве :import подключаются классы из стандартной библиотеки Java (написанные не на Clojure).<br />
</div><div>Функция create-listener превращает функцию clojure в объект, реализующий интерфейс ActionListener. Эти объекты понадобятся нам позже, для меню.<br />
</div><div>Далее следует функция initframe, принимающая объект класса JFrame (инструкция #^JFrame заставляет делать проверку типов при компиляции, если я ничего не путаю). В let-биндинге создаются объекты JMenuBar, JFileChooser, JMenuItem и так далее, а затем, при помощи инструкций doto производятся действия над этими объектами и собирается интерфейс. <pre>(doto object ...)</pre>позволяет производить несколько действий подряд над одним и тем же объектом. Обычно вызов методов объектов производится так: <pre>(.method object args)</pre>, в случае с doto можно делать так: <pre>(doto object (.method args) ... )</pre>, чем мы и пользуемся.<br />
</div><div>Затем определяется метод -main, который будет вызываться java'ой. В нем мы создаем фрейм и вызываем для него initframe.<br />
</div><div>Да, еще момент - я использовал в let-биндинге лямбда-функцию, чтобы отложить получение имени выбранного файла, потому что не был уверен, что на момент биндинга оно будет существовать. Такая вот ленивость.<br />
</div><div>Вроде все. Теперь про компиляцию.<br />
</div><div>Пространство имен называется interfacetest.core, значит, создаем на диске директорию interfacetest и кладем туда файл core.clj с указанным выше содержимым. Затем переходим в командной строке в директорию уровнем выше interfacetest, и запускаем REPL Clojure. В интерпретаторе пишем:<br />
</div><div><pre>(compile 'interfacetest.core)</pre></div><div>Файл откомпилирован, и на диске создана директория classes, в которой лежат interfacetest/*.class. Проверить, что все получилось, можно следующим образом - из командной строки переходим в директорию classes (желательно положить туда же clojure.jar) и пишем:<br />
</div><div><pre>java -cp .;clojure.jar interfacetest.core</pre></div><div>Обратите внимание - здесь указана версия для Windows - разделитель ";" в classpath. Для линукса нужно будет заменить ";" на ":".<br />
</div><div>Осталось только собрать наш jar. Распаковываем clojure.jar как обычный .zip-архив, копируем директорию clojure (ту, которая лежит в директории распаковки), кладем ее рядом с interfacetest и пишем:<br />
</div><div><pre>jar cvfe jarfilename.jar interfacetest.core clojure\* interfacetest\*</pre></div><div>Опять же, это версия для Windows - для линукса заменяем обратные слеши на прямые. Получаем исполняемый файл, который запускается без лишних библиотек.<br />
</div><div>Вроде все. За кадром остался вопрос, как определить только используемые классы из clojure.jar и не включать из в итоговый jar, тем самым уменьшая его размер (думаю, это можно сделать).<br />
</div>Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com5tag:blogger.com,1999:blog-7280809786242057910.post-68794905171585928802010-09-27T19:03:00.001+04:002010-12-10T19:36:02.344+03:00Я вернулся.Не знаю, надолго ли, но вернулся, гыгы.<br />
<br />
Написал на хаскеле интерпретатор конечных автоматов Мили, аналогичный используемому в институте "МИЭМ-89" (написанному на паскале). На все про все ушло около двух вечеров: один разбирался с парсерами и их комбинаторами и писал свой велосипед (хотя, наверное, стоило бы повтыкать в Parsec), а второй - писал собственно интерпретатор.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com1tag:blogger.com,1999:blog-7280809786242057910.post-47715202881069483082010-09-27T19:01:00.001+04:002010-12-10T19:36:09.316+03:00Устанавливаем SDL-ные биндинги поверх Haskell Platform for WindowsНаткнулся на такую ссылку: <a href="http://web.animal-machine.com/blog/2010/04/a-haskell-adventure-in-windows/">http://web.animal-machine.com/blog/2010/04/a-haskell-adventure-in-windows/</a>Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-63316348013756846402010-07-23T11:23:00.002+04:002010-07-23T11:23:47.323+04:00Кнопочки.Блоггер дот ком добавил кнопочки к постам. Теперь моим бредом можно делиться с друзьями на фейсбуке, хехе.<br />
<br />
Кстати, на фейсбуке я тоже теперь есть.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-19259252017606670632010-07-23T11:19:00.001+04:002010-07-23T12:41:15.217+04:00Новое сообщение. Работа и развлечения.<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"></span></span><br />
<span class="Apple-style-span" style="font-family: Arial; font-size: small;"><span class="Apple-style-span" style="font-size: 13px;"><div><br />
</div><div>Итак, как некоторые из вас уже знают, я сменил работу. Теперь я отошел от дел перловых и пишу на пайтоне. Под django. В общем, то самое, о чем я мечтал полгода.</div><div><br />
</div><div>На работе использую Ubuntu 10.04, emacs, ipython, git. Впечатления - восхитительные. Все-таки фреймворк упрощает программисту работу в разы, если не на порядок. К тому же, встроенные средства джанги, типа админки, тоже сильно облегчают работу, особенно на этапе разработки.</div><div><br />
</div><div>Приобрел себе книгу "Категории для работающего математика", штудирую потихоньку. Также с целью математического самообразования (или восполнения пробелов в памяти - как посмотреть) разжился "Лекциями по линейной алгебре" и "Теорией множеств". Сейчас продвигаюсь по всему этому потихоньку.</div><div><br />
</div><div>Такие дела.</div></span></span>Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-65812234904205858302010-06-28T13:51:00.000+04:002010-06-28T13:51:25.887+04:00Erlang + OCaml и все-все-все.<a href="http://www.slideshare.net/j2a/ss-4625844">Вот здесь</a> опубликованы весьма интересные слайды - про то, как функциональные языки вытеснили в продакшене императивщину. Крайне интересно.<br />
<br />
Сказать по правде, именно так я себе все и представлял.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-56564171490908265802010-06-25T13:46:00.002+04:002010-12-10T19:36:17.541+03:00Няшный Haskell.На днях нарыл книжку "Programming in Haskell", начал потихоньку разбираться. Пока что понимаю не так уж много, но работаю над собой. Налицо, кстати, явное сходство F# с сабжем - afaik, одни и те же люди приложили руку к созданию как того, так и другого.<br />
<br />
А сейчас - про общую, хех, "няшность" брутального Хаскеля. <a href="http://raincat.bysusanlin.com/">Игру про няшного котика, написанную на Haskell</a>, все видели? Ну а теперь вот второе наблюдение - интерпретатор Хаскеля называется "hugs". Вот сидит такой одинокий программист, захочется ему обнять кого-нибудь, открывает он консоль и пишет там "обнимашки" (ну, hugs пишет, имею ввиду). И запускается ему интерпретатор, и теплеет у него на душе, и с блаженной улыбкой он начинает работать.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com2tag:blogger.com,1999:blog-7280809786242057910.post-74033000791060321462010-06-18T13:03:00.002+04:002010-06-29T10:50:58.049+04:00Насущные вещи и perlянка.Всем привет! <br />
<br />
Вот немного разобрался со своими проблемами - ушел на очередной околоземный виток в институте (я снова четверокурсник, хаха), нашел себе новую работу (программист python+django, аккурат то, о чем я мечтаю вот уже полгода как), сейчас дорабатываю две недели в "Докторе" и сваливаю.<br />
<br />
Впечатления от почти двух лет работы: в общем, все было ок (а местами даже лучше, чем ок), не особо и жалуюсь. Коллектив отличный, режим работы неплохой, занятия не особо скучные (в основном, но бывают, конечно, рутинные места, хотя - где их нет?). Добираться от дома, опять же, достаточно удобно :]<br />
<br />
Но. Была очень серьезная проблема, которую разрешить не удалось. О чем я искренне сожалею. Мне будет не хватать вас, ребята.<br />
<br />
Ну ладно, с лирически-грустной частью покончено. Теперь расскажу вам кое-что интересное.<br />
<br />
А именно - о ключе 'e' в регулярных выражениях Perl. Тема эта для меня новая - не так уж и давно начал ее ковырять, поэтому если что - не обессудьте, буду рад выслушать всяческую критику, замечания и предложения.<br />
<br />
<a name='more'></a><br />
<br />
Итак, ключ 'e'. Что же он делает?<br />
<br />
Во-первых, он применяется только в выражениях замены, s///, стало быть. Нужен он для того, чтобы интерпретировать правую часть выражения замены и подставить результат интерпретации вместо части левой.<br />
<br />
Ну например. Приспичило нам (пример настолько надуманный, что мне страшно, что же с моей фантазией) посчитать сумму, записанную в строке, тут же поделить результат на 2 и подставить в ту же строку вместо исходного выражения, заставив пользователя недоумевать - куда же делась еще половина суммы?<br />
<br />
Не имея на руках волшебного ключа 'e', мы бы делали так (хотя вы бы, может, делали и не так):<br />
<br />
<pre>my $var = 'blah blah blah 11+12 blah blah';
$var =~ /(\d+)\+(\d+)/;
my $result = ( $1 + $2 ) / 2;
$var =~ s/(\d+)\+(\d+)/$result/;
print $var;
</pre><br />
Круто, да? Ну, относительно, честно говоря. Целых две операции с регулярными выражениями. А если нам надо произвести десяток замен, и каждую потребуется вычислить? Придется организовывать цикл.<br />
<br />
А теперь мы используем волшебный ключ 'e':<br />
<br />
<pre>my $var = 'blah blah blah 11+12 blah blah';
$var =~ s!(\d+)\+(\d+)!($1+$2)/2!e;
print $var;
</pre><br />
В этот все гораздо круче и непонятнее - perl, ясное дело.<br />
<br />
Строка "($1+$2)/2" интерпретируется (кстати, здесь, чтобы не экранировать символ слеша, я заменил ограничители регэкспа на восклицательные знаки), и результат "11.5" подставляется в строку.<br />
<br />
Вот такая удобная фича. Про наличие ее в других языках не знаю, не изучал этот вопрос.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-5089198366773828592010-06-04T13:07:00.000+04:002010-06-04T13:07:49.965+04:00Наконец-то пост. О работе и всяком таком.И снова я возвращаюсь сюда.<br />
<br />
Из последних новостей - продолжаю разбираться в джанге, параллельно подтягиваю пайтон. Ищу работу - программист на Perl или Python. На Пайтоне, конечно, из разряда мечт - кто ж меня возьмет без опыта (точнее, с опытом, но с опытом перла, так сказать, хех). В общем, если кто это увидит и захочет мне чего предложить - милости прошу.<br />
<br />
Установил для Emacs расширение yasnippet. Как я раньше без всего этого жил - скорость набора кода увеличилась в разы. Продолжаю запоминать собственные мнемоники. Очень удобно, сделал уже набор сниппетов для jQuery и для часто используемых перловых оборотов. Особенно понравилась возможность встраивать в сниппет elisp-код.<br />
<br />
В планах на будущее - доосилить таки F#-сервер и заняться программированием всяких прикладных автоматизирующих рутинную работу штучек на пайтоне. Хочу попробовать IronPython, а также Stackless - мельком видел его, вроде достаточно интересен.<br />
<br />
Такие вот наполеоновские планы, хехе.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-44866415204186322552010-05-07T12:15:00.002+04:002010-05-07T12:15:45.696+04:00Last second save!Давно не писал.<br />
А все почему?<br />
Да потому что нечего особо писать. Как будет что интересное - немедленно сообщу.<br />
<br />
На следующей неделе начальник сваливает в отпуск на две недели, и я принимаю на себя весь нелегкий груз веб-программизма. Атлант, однако!<br />
<br />
Вот такие дела.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-62301063196667356362010-04-19T18:29:00.001+04:002010-04-19T18:29:55.747+04:00Метро 2033Раз уж день пошел богатый на посты в блоге, продолжим, пока прет. Прошел "Метро 2033".<br />
<br />
Конечно, наверное, на просторах интернета много камней кинуто в огород линейности-коридорности, но мне понравилось. Особенно понравилась атмосфера - виды разрушенной Москвы прямо как бальзам на душу (не подумайте плохого). Выйдя на поверхность с Боровицкой (в игре), сразу же узнал пейзаж, несмотря на разрушения. А уж эпизод с телебашней это вообще ух.<br />
<br />
Такие дела. Крайней рекомендую. Книжка мне в свое время понравилась (вторая, кстати, как-то не очень была, а первая очень даже прилично).Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-79403118472503562472010-04-19T18:16:00.005+04:002010-12-10T19:36:52.613+03:00F# - красивая конструкцияСижу, пишу сервер. Есть у меня две функции, которые принимают данные разных типов (String и byte array) и отправляют их в поток - первая, соответственно, для отправки клиенту текста (заголовки всякие, прочая белиберда), вторая - для отправки изображений и прочей бинарщины.<br />
<br />
И вот, благодаря паттерн матчингу, их можно объединить:<br />
<br />
<pre>let sendToStream (str: NetworkStream) (bin: Object) =
match bin with
| :? string as strn ->
str.Write(System.Text.Encoding.UTF8.GetBytes(strn), 0, strn.Length)
| :? (byte[]) as bytarr ->
str.Write(bytarr, 0, bytarr.Length)
</pre><br />
Вот такая вот функция. Что радует - увеличившийся уровень абстракции - стоит появиться какому-нибудь новому типу, для которого нужен свой способ отправки - все, что нужно изменить - паттерн. Благодаря наличию Object на верхнем уровне мы можем совать какие угодно данные в функцию. Правда, тут стоит следить за наследованием - ведь проверка типов может не дойти до нашего "нового" типа. Поэтому наиболее частные типы следует размещать как можно раньше.<br />
<br />
P.S. Кстати, в приведенном примере компилятор найдет изъян - не покрыты все паттерны. Дело лечится добавлением граничного случая <code>| _ -> failwith "Invalid input"</code> например.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com2tag:blogger.com,1999:blog-7280809786242057910.post-18362280230281045762010-04-19T11:26:00.002+04:002010-04-19T11:26:08.232+04:00Новое и насущное.Увидел вчера в книжном нового, свеженького (для России) Рейвенора-отступника, и не смог пройти мимо - подхватил и утащил, аки паук, на кассу.<br />
<br />
Качество бумаги по сравнению с предыдущим изданием - небо и земля, причем сравнение, естественно, не в пользу предыдущего. И, хотя я уже читал его в оригинале, начал читать в русском переводе. Пока откровенных косяков не замечено - Молох все еще Молох.<br />
<br />
Вот так. Этот пост, конечно, не интересен будет тем, кто не в теме :]Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-78967752131751255272010-04-16T22:51:00.007+04:002010-12-10T19:37:02.715+03:00Erlang - шифр цезаря.Рад вам представить результат двух вечеров мучений - *барабанная дробь* - шифр Цезаря (а точнее, аффинные преобразования его же имени) на эрланге.<br />
<br />
О том, что из этого получилось - под катом.<br />
<br />
<br />
<a name='more'></a><br />
<br />
Итак, изначально идея проста - есть функция, которая кодирует некий символ из алфавита путем арифметических действий (умножение и сложение) над его порядковым номером в этом алфавите. Получившееся число делится по модулю на длину алфавита - и получаем порядковый номер нового символа.<br />
При реализации упор я сделал на то, что каждый символ кодируется _одним_ целым числом. В процессе кодирования выяснилось, что одно число - это unicode codepoint, а на самом деле символ кириллицы представляется в виде двух двоичных чисел (латиница и цифры - по-прежнему одним).<br />
<br />
Итак, реализация и элегантные костылики:<br />
<br />
<br />
Модуль unic - переводит список вида [208,179....] (именно список, а не бинарную последовательность) в список codepoint'ов:<br />
<br />
UPD: хтмл-парсер съел немного, <a href="http://pastebin.com/ZBjbBCeF">выкладываю с пастебина</a><br />
<br />
<a href="http://pastebin.com/2ZErLSze">Кодирование</a><br />
<br />
В консоли стартуем сервер: caesar:init(), после чего кодируем сообщения: caesar:enc("Сообщение").<br />
<br />
Вот такие велосипеды.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com3tag:blogger.com,1999:blog-7280809786242057910.post-90448889994151328322010-04-15T17:54:00.002+04:002010-04-15T17:54:56.065+04:00Эрланг. Впечатления.Первое впечатление: "хехе, паттерн матчинг, оптимизация хвостовой рекурсии... как тут дела с HOF?".<br />
Второе: "Неизменяемые переменные!"<br />
Третье: "Круто, все так параллелится!"<br />
Четвертое: "Что-то мне синтаксис напоминает..."<br />
Пятое: "ПРОЛОГ?"Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-9053076249106816332010-04-15T16:10:00.000+04:002010-04-15T16:10:17.168+04:00О нежданной пользе старинных технологий.Открываю вчера вечером ежедневник, в который пишу всякое по работе (чего сделать, чего сделал, как устроен тот или иной скрипт) - за последней страницей заложен полтинник.<br />
<br />
А пользовался бы КПК или телефоном для тех же целей - не было бы у меня сейчас полтинника.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-74873835245063089882010-04-11T21:52:00.001+04:002010-04-11T21:54:09.231+04:00Лекция в политехе.Был в среду на лекции "Эволюция искусственного интеллекта" в Политехническом музее.<br />
<br />
Лекция проходила в Большой аудитории. На подобном мероприятии в политехе был впервые, а в самом политехе - в третий раз в жизни :]<br />
<br />
В общем, пришел, сел. Пришел за 5 минут до начала (то бишь без пяти восемь). Народу было где-то половина аудитории. К тому моменту, когда началась лекция (началась она с опозданием на 10 минут) - был уже почти полный зал (только несколько верхних рядов были заполнены наполовину.<br />
<br />
Итак, собственно про лекцию. Я по ходу делал кое-какие заметки, сейчас по ним попробую восстановить. Если что забыл - не обессудьте.<br />
<br />
<br />
<a name='more'></a><br />
<br />
Лекция была поделена на две части - собственно лекция и вопросы аудитории. Лекционная часть длилась около часа.<br />
<br />
Начали издалека - с середины 20го века, когда, собственно, исследования проблемы ИИ и начались. В контексте вопроса "что же такое ИИ и как его определить" упомянули тест Тьюринга (когда ИИ чатится с человеком и человек не может сказать, что говорит с ботом).<br />
<br />
Далее рассказали про "механический ИИ". Например, про робота-сепульку (sic!), который, оказывается, работал в политехе экскурсоводом.<br />
<br />
Затем развитие ИИ разделилось на два направления:<br />
<br />
- "символьный" ИИ (оперирует символами по определенным правилам, далее просто "искусственный интеллект". Хорошо формализуем, основан на логике, на его основе строятся экспертные системы)<br />
- искуственные нейронные сети (имитируют нейроны мозга, хорошо решают задачи распознавания образов и аппроксимации)<br />
<br />
Далее лектор рассказал про "клеточные автоматы" фон Неймана (на ограниченном поле некая фигура из клеточек, живущая по определенным правилам, копирует сама себя и таким образом размножается).<br />
<br />
Затем взгляд исследователей ИИ обратился в сторону эволюции. И родились всякие исследования, в которых ученые наблюдали за развитием "виртуальной жизни", живущей по определенным правилам. Правда, опять же, это нисколько не продвинуло ученых к "настоящему ИИ".<br />
<br />
В этот момент от чисто академического интереса отпочковался интерес практический, который в итоге привел к... роботу-пылесосу. Это так называемая "поведенческая роботика", создание роботов, поведение которых лежит на уровне животных.<br />
<br />
Затем была часть про нейронные сети и моделирование мозга. Однако, несмотря на создание громадных моделей мозга (по числу нейронов как мозг кошки и приближающихся к человеческому мозгу), научить их "думать" в привычном смысле так и не удалось - не в последнюю очередь потому, что мы и сами до конца не понимаем, как мы думаем нашими нейронами и синапсами.<br />
<br />
И в конце выступления лектор представил свой взгляд в будущее. Он сказал, что дальше так жить нельзя, и что надо пересмотреть свои взгляды на процесс изучения ИИ. А именно - он предложил подход, называемый "теорией функциональных систем" - система элементов, взаимодействующих для достижения адаптивного результата. И этот адаптивный результат, вернее, его понимание - должен стать связующим звеном между эволюцией и интеллектом.<br />
<br />
Лектор также высказал предположение, что ИИ уже создается - что весь интернет и есть адаптивная система, а мы, пользователи Интернета - как бы "нейроны" в этом глобальном мозге. Это, кстати, очень интересно.<br />
<br />
Вот, в общем-то, и все. Затем было несколько вопросов, в основном уточняющих, и лекция закончилась.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com2tag:blogger.com,1999:blog-7280809786242057910.post-91520732891969040592010-04-08T16:55:00.000+04:002010-04-08T16:55:47.664+04:00F# web server, текущая картина.Итак, на данный момент имеется:<br />
<br />
- Веб-сервер, умеющий отдавать текст, хтмыл, цсс и жс.<br />
- Веб-сервер, не умеющий отдавать картинки (пока что) и прочую бинарщину (но я уже знаю, в чем дело, и в ближайшее время поправлю).<br />
<br />
Однако взглянул я в код, и кое-что мне не понравилось. Чтобы добавить новые функции, слишком много надо курочить.<br />
<br />
И решил я его переделать.<br />
<br />
Сегодня займусь.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-77921903909660700822010-04-01T14:08:00.002+04:002010-04-01T14:08:51.477+04:00Google ReaderКажется, я распробовал Гугль Ридор.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com0tag:blogger.com,1999:blog-7280809786242057910.post-54158155322858643752010-03-31T15:56:00.000+04:002010-03-31T15:56:08.166+04:00F# web serverСобственно, в институте по "Программированию для Интернет" было дано задание - написать простенький веб-сервер.<br />
<br />
Так как предмет ориентирован на .NET,а писать на C# не было никакого желания, сегодня напросился написать этот сервер на F#. <br />
<br />
Хорошо хоть разрешили.Crazy_Owlhttp://www.blogger.com/profile/01391696075679047126noreply@blogger.com5