<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0UASX47cSp7ImA9WhRUEEU.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580</id><updated>2012-01-20T18:40:48.009+01:00</updated><category term="file formats" /><category term="incanter" /><category term="couchdb" /><category term="education" /><category term="podcast" /><category term="data mining" /><category term="tex" /><category term="erlang" /><category term="clojure" /><category term="web" /><category term="contests" /><category term="fp" /><category term="2011" /><category term="latex" /><category term="boost" /><category term="maven" /><category term="algorithms" /><category term="apache camel" /><category term="mapreduce" /><category term="asio" /><category term="site" /><category term="hadoop" /><category term="cs" /><category term="software development" /><category term="home" /><category term="it" /><category term="job" /><category term="f#" /><category term="cmake" /><category term="opensource" /><category term="information retrieval" /><category term="git" /><category term="AI" /><category term="DSL" /><category term="tips" /><category term="haskell" /><category term="spirit" /><category term="video" /><category term="windows" /><category term="sicp" /><category term="freebsd" /><category term="tv" /><category term="docbook" /><category term="hg" /><category term="solaris" /><category term="c++" /><category term="ML" /><category term="work" /><category term="presentations" /><category term="linux" /><category term="scheme" /><category term="oss" /><category term="NLP" /><category term="scala" /><category term="emacs" /><category term="russia" /><category term="cuda" /><category term="msoffice" /><category term="personal" /><category term="security" /><category term="smalltalk" /><category term="opencl" /><category term="programming" /><category term="lucene" /><category term="2010" /><category term="lisp" /><category term="common-lisp" /><category term="content filtering" /><category term="instant messaging" /><category term="book" /><category term="blog" /><category term="publishing" /><category term="life" /><category term="squid" /><category term="online" /><category term="gpu" /><category term="баечки" /><category term="muse" /><category term="unix" /><category term="mac" /><category term="cedet" /><category term="microsoft" /><category term="ocaml" /><category term="article" /><category term="version control" /><category term="opensolaris" /><category term="testing" /><category term="architecture" /><category term="vcs" /><category term="google" /><category term="R" /><title>Alex Ott's Russian blog about IT-related things</title><subtitle type="html">This blog dedicated to IT, Software development and information security.  Main language - Russian.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://alexott-ru.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>344</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/alexott-ru" /><feedburner:info uri="alexott-ru" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><entry gd:etag="W/&quot;D0UARXg9cCp7ImA9WhRWE0k.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-7131214859603351958</id><published>2011-12-31T16:27:00.000+01:00</published><updated>2011-12-31T16:27:24.668+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-31T16:27:24.668+01:00</app:edited><title>Итоги года...</title><content type="html">Сейчас самое подвести итоги уходящего года, и посмотреть вперед - 2011-й год был достаточно насыщеным, свободного времени практически не было....&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;получил повышение до Principal разработчика, что добавило задач, но проекты были интересными, и будут новые&lt;/li&gt;
&lt;li&gt;достаточно много ездил - в другие страны (&lt;a href="https://picasaweb.google.com/106643849267592516873/2011England"&gt;англия&lt;/a&gt;, &lt;a href="https://picasaweb.google.com/106643849267592516873/2011Keukenhof"&gt;голландия&lt;/a&gt;, канарские острова) и в германии (&lt;a href="https://picasaweb.google.com/106643849267592516873/2011Rhein"&gt;по рейну&lt;/a&gt;, &lt;a href="https://picasaweb.google.com/106643849267592516873/11112011CarnivalAtCologne"&gt;в Кельн на карнавал&lt;/a&gt;, и т.д.)&lt;/li&gt;
&lt;li&gt;накатал 2000км на велосипеде, хотя это меньше чем я планировал&lt;/li&gt;
&lt;li&gt;достаточно много "книжных" проектов - работал с Manning над "Mahout in Action" &amp;amp; "Tika in Action", наконец-то &lt;a href="http://alexott-ru.blogspot.com/2011/10/blog-post.html"&gt;вышел перевод TaPL&lt;/a&gt; в его окончательном варианте&lt;/li&gt;
&lt;li&gt;в части open source активность была не особо высокой - обычно в виде небольших патчей для разных проектов&lt;/li&gt;
&lt;li&gt;для статей тоже не особо много времени находилось - написал только статью про &lt;a href="http://alexott.net/en/cpp/CppTestingIntro.html"&gt;TDD &amp;amp; Unit testing in C++&lt;/a&gt;, и вместе с &lt;a href="http://my-clojure.blogspot.com/"&gt;Дмитрием Бушенко&lt;/a&gt;, написали &lt;a href="https://docs.google.com/open?id=0BzmL7xzGeOtOOWE1ZTc3NzAtZjkyNy00ZDU5LTg2Y2UtZDc4MmNkNTI1ZmJl"&gt;небольшое пособие про Emacs&lt;/a&gt;, которое мы планируем в следующем году значительно расширить информацией про CEDET/Semantic для Java и т.п.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.goodreads.com/user_challenges/21521"&gt;много читал&lt;/a&gt;, в основном техническую литературу&lt;/li&gt;
&lt;li&gt;&lt;a href="http://alexott-ru.blogspot.com/2011/12/blog-post.html"&gt;учился&lt;/a&gt; в двух стенфордских классах, что доставило очень большое удовольствие и позволило многому научиться&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;В следующем году продолжу разбираться с темами, которые мне интересны - machine learning, natural language processing (в том числе возьму и &lt;a href="http://www.nlp-class.org/"&gt;стенфордский класс на эту тему&lt;/a&gt;), постараюсь больше писать на разные темы, и более активно учавствовать в open source проектах. И проехать 3000км на велосипеде (надо только его проапгрейдить до шоссейника)...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;И хочу поздравить всех моих читателей с Новым, 2012-м годом - пусть он будет успешным и интересным для вас!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-7131214859603351958?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/60CdHTxkalc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/7131214859603351958/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=7131214859603351958" title="Комментарии: 7" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/7131214859603351958?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/7131214859603351958?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/60CdHTxkalc/blog-post_31.html" title="Итоги года..." /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>7</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/12/blog-post_31.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEBQ3czcCp7ImA9WhRXFks.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-4556589536668236033</id><published>2011-12-23T19:52:00.003+01:00</published><updated>2011-12-23T20:14:12.988+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-23T20:14:12.988+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AI" /><category scheme="http://www.blogger.com/atom/ns#" term="ML" /><category scheme="http://www.blogger.com/atom/ns#" term="NLP" /><title>Про Стэнфордские курсы...</title><content type="html">Я как и многие мои знакомые, учавствовал в экспериментальных учебных курсах предложенных Стэнфордским университетом. В виду &lt;strike&gt;патологической жадности&lt;/strike&gt; любви к учебе, записался сразу на два курса &lt;a href="http://www.ai-class.com/"&gt;Artificial Intelligence (AI)&lt;/a&gt; &amp;amp; &lt;a href="http://www.ml-class.org/"&gt;Machine Leaning (ML)&lt;/a&gt;, оба на advanced track, что предполагало делание домашних заданий в дополнение к вопросам в ходе лекций. Вчера я получил свой сертификат для AI - 89%, чему я с одной стороны рад, поскольку я смог это сделать, с другой стороны - корю себя за невнимательность и несобранность - было сделано достаточно много глупых ошибок. Сертификат по ML скорее всего придет на той неделе.&lt;br /&gt;
Я собирался написать про свои впечатления об обоих курсах, но Lev Walkin меня опередил &lt;a href="http://lionet.livejournal.com/99296.html"&gt;отличных постом&lt;/a&gt; в своем журнале. Мои впечатления полностью совпадают с тем, что он написал - возможность получения немедленного feedback на ML-курсе, позволила гораздо лучше запомнить материал по сравнению с тем что давали на AI. Но стоит отметить, что AI тоже не прошел даром - обзорные лекции по разным темам дали возможность на них посмотреть чуть ближе, и понять что из них будет интересно и применимо.&lt;br /&gt;
Оба курса были также хорошей возможностью чуть лучше сконцентрироваться на определенных темах, поскольку домашние работы надо было выполнять в срок. Плюс это дало возможность наконец-то почитать давно купленные книги, например, Artificial Intelligence: A Modern Approach (у меня 2-е, русское издание), купленное много лет назад, и иногда доставаемое с полки для чтения какой-то главы :-)&lt;br /&gt;
&lt;br /&gt;
А в конце января, начнется новая серия курсов, я скорее всего возьму только один - &lt;a href="http://www.nlp-class.org/"&gt;Natural Language Processing&lt;/a&gt;&amp;nbsp;(так что я достану из загашников еще пару книжек :-),&amp;nbsp;хотя хочется взять половину из новых курсов, даже 2 курса одновременно - это достаточно затратно по времени, так что буду надеяться что все курсы будут оставаться в открытом доступе и в дальнейшем (по крайней мере, курс по ML будет повторен и в новом семестре).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-4556589536668236033?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/KBrX8wxWv2E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/4556589536668236033/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=4556589536668236033" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/4556589536668236033?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/4556589536668236033?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/KBrX8wxWv2E/blog-post.html" title="Про Стэнфордские курсы..." /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/12/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcBSH8-eyp7ImA9WhRRFEo.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-8595699459822902077</id><published>2011-11-27T16:09:00.001+01:00</published><updated>2011-11-28T10:20:59.153+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-28T10:20:59.153+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Перевод TaPL в продаже</title><content type="html">Для заинтересованных - перевод TaPL можно уже купить. findbook показывает что можно заказать через &lt;a href="http://www.goodreads.ru/books/2460883/default.aspx"&gt;goodreads.ru&lt;/a&gt;, books.ru имеет книгу в каталоге, но она помечена как "нет в продаже"...&lt;br /&gt;
&lt;div&gt;Судя по &lt;a href="http://juick.com/qrilka/1628376#7"&gt;информаци из juick&lt;/a&gt;, в Москве можно купить в обычных книжных магазинах: "В москве продаётся как минимум в МДК (на арбате и в техкниге), в Москве (на тверской), и в библиоглобусе. Дешевле всего (за 1100р) можно купить в МЦНМО&amp;nbsp;(&lt;a href="http://www.mccme.ru/head/address.html"&gt;mccme.ru&lt;/a&gt;). туда лучше заранее позвонить, ибо много книг хранить они не могут"...&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;P.S. а озон почему-то выставил безумную цену в 2 с лишним тысячи, поэтому они идут лесом :-)&lt;br /&gt;
&lt;br /&gt;
Update: Алексей Махоткин &lt;a href="http://ru-lambda.livejournal.com/133077.html"&gt;написал пост&lt;/a&gt;, где собрал список всех известных магазинов и других способов покупки книги...&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-8595699459822902077?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/PNoslRayl08" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/8595699459822902077/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=8595699459822902077" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8595699459822902077?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8595699459822902077?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/PNoslRayl08/tapl.html" title="Перевод TaPL в продаже" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/11/tapl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YHQ304eCp7ImA9WhdaEkU.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-8561476323401495399</id><published>2011-10-22T14:12:00.000+01:00</published><updated>2011-10-22T14:12:12.330+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-22T14:12:12.330+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Еще книжное...</title><content type="html">Осень выдается достаточно результативной на книги, к которым я имею отношение в той или иной мере... Кроме релиза про перевод Types &amp;amp; programming languages, про который я писал &lt;a href="http://alexott-ru.blogspot.com/2011/10/blog-post.html"&gt;вчера&lt;/a&gt;, сегодня я получил свой экземпляр книги &lt;a href="http://www.manning.com/owen/"&gt;Mahout in Action&lt;/a&gt;, в издании которой я принимал участие в качестве technical proofreader. В том же качестве я поработал и над книгой &lt;a href="http://www.manning.com/mattmann/"&gt;Tika in Action&lt;/a&gt;, которая должна выйти в ближайшее время. А началось все с того, что люди из Manning предложили мне сделать review для нескольких книг, часть из которых я уже купил как MEAP, а потом предложили сделать и technical proofreading - проверить примеры, формулы и т.п., что и было с удовольствием сделано - все равно я собирался читать эту книгу, а тут такая возможность :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mahout in Action - интересная книга, если вы интересуетесь machine learning, особенно в large scale. В книжке почти нет теории, но в ней подробно описывается как использовать &lt;a href="http://mahout.apache.org/"&gt;Apache Mahout&lt;/a&gt; для классификации и кластеризации данных, а также рекомендаций (для товаров и т.п.). В книге описаны только основные алгоритмы, в самом Mahout их гораздо больше, и все больше добавляется с каждым релизом.&lt;br /&gt;
В электронной версии (в PDF) есть мультимедийные вставки, с помощью которых рассказывают или показывают про сложные места - интересно сделано. На &lt;a href="http://www.amazon.com/gp/product/1935182684?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=shr&amp;amp;camp=213733&amp;amp;creative=393185&amp;amp;creativeASIN=1935182684&amp;amp;ref_=sr_1_1&amp;amp;qid=1319288354&amp;amp;sr=8-1"&gt;амазоне, печатная книга стоит дешевле&lt;/a&gt; чем у &lt;a href="http://www.manning.com/owen/"&gt;Manning&lt;/a&gt;'а, но у Manning'а вместе с печатной версией дают и электронную - это у них стандартные условия, плюс регулярно бывают 40-50% скидки - если кому интересно. Все примеры были протестированы на Mahout версии 0.5 (актуальный релиз), но я планирую в ближайшее время &lt;a href="https://github.com/tdunning/MiA"&gt;сделать их&lt;/a&gt; совместимыми со следующим релизом - 0.6 - там совсем небольшое изменение...&lt;br /&gt;
&lt;br /&gt;
P.S. будет еще несколько книг, но уже на русском, но я пока не знаю еще точных сроков выхода, но обязательно напишу :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-8561476323401495399?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/drnFsGh6c-E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/8561476323401495399/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=8561476323401495399" title="Комментарии: 6" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8561476323401495399?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8561476323401495399?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/drnFsGh6c-E/blog-post_22.html" title="Еще книжное..." /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/10/blog-post_22.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAASH84eip7ImA9WhdaEUQ.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-3774552692603652342</id><published>2011-10-21T11:59:00.000+01:00</published><updated>2011-10-21T11:59:09.132+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-21T11:59:09.132+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Книга "Типы в языках программирования"</title><content type="html">Из &lt;a href="http://newstar.rinet.ru/pipermail/tapl/2011-October/000445.html"&gt;достоверных источников&lt;/a&gt; стало известно, что книга "&lt;a href="http://newstar.rinet.ru/%7Egoga/tapl/"&gt;Типы в языках программирования&lt;/a&gt;" (перевод известной "Types and Programming Languages") вышла в бумажном виде, и &lt;a href="http://dl.dropbox.com/u/132983/IMG_1009.jpg"&gt;это не миф&lt;/a&gt; :-) Пока правда неизвестно где ее можно купить, но вы можете &lt;a href="http://newstar.rinet.ru/pipermail/tapl/2011-October/000446.html"&gt;связаться с Алексеем Махоткиным&lt;/a&gt; (aka&amp;nbsp;squadette) и узнать об этом.&amp;nbsp; Я тоже напишу когда она будет доступна в магазинах.&lt;br /&gt;
Также доступна полная &lt;a href="http://dl.dropbox.com/u/132983/tapl.pdf"&gt;электронная версия книги&lt;/a&gt;, она совпадает с печатной версией. Меньшего формата не будет (пока?), поскольку там есть проблемы с таблицами и листингами, но вы можете попытаться переверстать, благо исходные тексты также доступны.&lt;br /&gt;
Эта книга труд многих людей - Юра Бронников сделал львинную часть перевода, Алексей Махоткин сделал огромную работу по вычитке и редактированию, а Вадим Родионов так красиво и правильно все сверстал. Кроме того, много людей читало промежуточные версии перевода и присылало замечания и пожелания - всем спасибо!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-3774552692603652342?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/g5yO-ea0G60" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/3774552692603652342/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=3774552692603652342" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/3774552692603652342?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/3774552692603652342?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/g5yO-ea0G60/blog-post.html" title="Книга &quot;Типы в языках программирования&quot;" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/10/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUARnwyfyp7ImA9WhdVGEo.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-4611071960834885318</id><published>2011-09-24T16:14:00.000+01:00</published><updated>2011-09-24T16:14:07.297+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-24T16:14:07.297+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Что нового в Clojure 1.3?</title><content type="html">&lt;p&gt;Сегодня ночью была выпущена новая версия &lt;a href="http://clojure.org/"&gt;языка Clojure&lt;/a&gt; &amp;mdash; 1.3.  Что нового в этой версии? Давайте рассмотрим основные изменения сделанные в этой версии (детальный список изменений можно найти &lt;a href="https://github.com/clojure/clojure/blob/1.3.x/changes.txt"&gt;в соответствующей ветке репозитория&lt;/a&gt;).&lt;/p&gt;&lt;h3&gt;Расширенная поддержка примитивных типов&lt;/h3&gt;&lt;p class="first"&gt;В предыдущих версиях, примитивные типы (long, double, etc.) поддерживались только для локальных арифметических операций и при объявлении полей &lt;code&gt;deftype&lt;/code&gt;/&lt;code&gt;defrecord&lt;/code&gt;, но не для аргументов функций и не для возвращаемых значений.  Boxing выполнялся всегда, что часто приводило к ощутимым накладным расходам.&lt;/p&gt;&lt;p&gt;В новой версии примитивные типы поддерживаются в полной мере, что приводит к значительному увеличению производительности кода (в соответствующих тестах, в среднем в 3-5 раз).  Соответственно изменилась работа с арифметическими выражениями &amp;mdash; для примитивных типов будут использоваться стандартные операторы Java.  Но при этом не будет происходит автоматического превращения в &amp;quot;Big*&amp;quot; типы при переполнении, как это происходило раньше &amp;mdash; вместо этого будет брошено исключение.  Если вам все-таки нужно автоматическая конвертация, то вы можете использовать операторы &lt;code&gt;+'&lt;/code&gt;, &lt;code&gt;*'&lt;/code&gt;, и т.д., хотя они и более медленные.  Битовые операции теперь только поддерживаются для примитивных типов, и вся их поддержка для &amp;quot;Big*&amp;quot; была убрана из языка.&lt;/p&gt;&lt;p&gt;Для использования примитивных типов вам необходимо добавить соответствующие type hints, например:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #7f007f;"&gt;defn&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;fib&lt;/span&gt; &lt;span style="color: #218a21;"&gt;^long&lt;/span&gt; [&lt;span style="color: #218a21;"&gt;^long&lt;/span&gt; n]
    (&lt;span style="color: #473c8a;"&gt;if&lt;/span&gt; (&lt;span style="color: #9f522c;"&gt;&amp;lt;=&lt;/span&gt; n 1)
        1
        (&lt;span style="color: #9f522c;"&gt;+&lt;/span&gt; (fib (&lt;span style="color: #9f522c;"&gt;dec&lt;/span&gt; n)) (fib (&lt;span style="color: #9f522c;"&gt;-&lt;/span&gt; n 2)))))
&lt;/pre&gt;&lt;p&gt;Более подробно обо всем этом &lt;a href="http://dev.clojure.org/display/doc/Documentation+for+1.3+Numerics"&gt;на соответствующей странице JIRA&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Улучшения &lt;code&gt;defrecord&lt;/code&gt; и &lt;code&gt;deftype&lt;/code&gt;&lt;/h3&gt;&lt;p class="first"&gt;В версии 1.3 были сделаны различные улучшения для работы с  &lt;code&gt;defrecord&lt;/code&gt; и &lt;code&gt;deftype&lt;/code&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;новый синтаксис для чтения и записи &amp;mdash; либо с метками (&lt;code&gt;#myns.MyRecord{:a 1, :b 2}&lt;/code&gt; &amp;mdash; только для записей), либо позиционный (&lt;code&gt;#myns.MyRecord[1 2]&lt;/code&gt; &amp;mdash; для записей и типов);&lt;/li&gt;
&lt;li&gt;автоматическая генерация функций для создания типов и записей: &lt;code&gt;myns/map-&amp;gt;MyRecord&lt;/code&gt; (только для записей) и &lt;code&gt;myns/-&amp;gt;MyRecord&lt;/code&gt; (для записей и типов).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Подробнее можно прочитать вот &lt;a href="http://dev.clojure.org/display/design/defrecord+improvements"&gt;тут&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Reflection API&lt;/h3&gt;&lt;p class="first"&gt;Введено новое пространство имен &lt;code&gt;clojure.reflect&lt;/code&gt;, функции которого должны обеспечить более удобную и быструю работу с классами, методами и т.д.  Подробнее об этом &lt;a href="http://dev.clojure.org/display/design/Reflection+API"&gt;тут&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Модульный &lt;code&gt;clojure-contrib&lt;/code&gt;&lt;/h3&gt;&lt;p class="first"&gt;Начиная с версии 1.3, больше не существует монолитного набора библиотек известного как &lt;code&gt;clojure-contrib&lt;/code&gt; &amp;mdash; вместо этого, были созданы отдельные проекты для каждой из библиотек, что позволяет им развиваться и выпускаться независимо друг от друга. Полный список всех старых библиотек, и соответствующих им новых, можно найти на &lt;a href="http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go"&gt;отдельной странице&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Множественные улучшения производительности&lt;/h3&gt;&lt;p class="first"&gt;Кроме улучшений в части производительности, описанных выше, в новом релизе сделано множество изменений чтобы обеспечить более высокую скорость работы программ на Clojure:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Более быстрый доступ к переменным;&lt;/li&gt;
&lt;li&gt;Ускорение загрузки&lt;/li&gt;
&lt;li&gt;Promises не используют блокировок (locks);&lt;/li&gt;
&lt;li&gt;Инлайнинг &lt;code&gt;nil?&lt;/code&gt;, битовых функций, математических операций, функций &lt;code&gt;min&lt;/code&gt; &amp;amp; &lt;code&gt;max&lt;/code&gt; с разным числом аргументов;&lt;/li&gt;
&lt;li&gt;и многое другое...&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Прочее&lt;/h3&gt;&lt;p class="first"&gt;Помимо новой функциональности описанной выше, а также различных исправлений ошибок, в новой версии реализованы новые вещи (перечислены не все):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Некоторые вспомогательные пространства имен (&lt;code&gt;clojure.set&lt;/code&gt;, &lt;code&gt;clojure.xml&lt;/code&gt;, &lt;code&gt;clojure.zip&lt;/code&gt;) не загружаются при запуске;&lt;/li&gt;
&lt;li&gt;Объявления сделанные с помощью &lt;code&gt;def&lt;/code&gt; более не являются &amp;quot;динамическими&amp;quot; по умолчанию &amp;mdash; вы должны использовать &lt;code&gt;^:dynamic&lt;/code&gt; если хотите иметь возможность использования ее в &lt;code&gt;binding&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Улучшенные сообщения об ошибках и исключениях;&lt;/li&gt;
&lt;li&gt;Можно вызвать &lt;code&gt;deref&lt;/code&gt; с указанием таймаута;&lt;/li&gt;
&lt;li&gt;Функция &lt;code&gt;comp&lt;/code&gt; возвращает &lt;code&gt;identity&lt;/code&gt; если вызвана без параметров;&lt;/li&gt;
&lt;li&gt;Возможность указания разных возвращаемых типов в объявлениях одной функции с разными количествами аргументов;&lt;/li&gt;
&lt;li&gt;Некоторые функции перемещены в другие пространства имен;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-4611071960834885318?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/r7zO2YbxDkg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/4611071960834885318/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=4611071960834885318" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/4611071960834885318?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/4611071960834885318?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/r7zO2YbxDkg/clojure-13.html" title="Что нового в Clojure 1.3?" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/09/clojure-13.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIDRn0yfyp7ImA9WhdVFE8.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-165002300047394653</id><published>2011-09-18T10:59:00.001+01:00</published><updated>2011-09-19T10:12:57.397+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-19T10:12:57.397+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="haskell" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Перевод " Learn You a Haskell for Great Good!"</title><content type="html">BTW, планируется выпуск русского перевода "Learn You a Haskell for Great Good!" в виде бумажной книги. Переводом занимается&amp;nbsp;&lt;a href="http://arsanukaev.blogspot.com/"&gt;Yasir Arsanukaev&lt;/a&gt;, и работа над переводом ведется на &lt;a href="https://bitbucket.org/yasir/lyah"&gt;bitbucket&lt;/a&gt; - кто может, присоединяйтесь к вычитке перевода! :-)&lt;br /&gt;
&lt;br /&gt;
P.S. Из достоверных источников стало известно, что книжка уже на этапе верстки, так что недолго ждать осталось :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-165002300047394653?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/24yBtW8Mg9Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/165002300047394653/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=165002300047394653" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/165002300047394653?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/165002300047394653?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/24yBtW8Mg9Q/learn-you-haskell-for-great-good.html" title="Перевод &quot; Learn You a Haskell for Great Good!&quot;" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/09/learn-you-haskell-for-great-good.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQBQXo8fyp7ImA9WhZaFUw.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-114426030748834840</id><published>2011-07-01T12:05:00.000+01:00</published><updated>2011-07-01T12:05:50.477+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-01T12:05:50.477+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="lisp" /><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Опрос: название для русской версии Practical Common Lisp</title><content type="html">В процессе причесывания русского перевода &lt;a href="http://pcl.catap.ru/"&gt;Practical Common Lisp&lt;/a&gt;, выползла проблема того, как книжка должна называться на русском языке. Пока вариантов немного, и некоторые звучат не особо :-( Поэтому хочу попросить помощи у сообщества - какой из переводов вам больше нравится (или можете предложить свой) - пишите номера или сови предложения в комментариях:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Practical Common Lisp - оставить оригинальное название (будет плохо искаться в поиске, имхо)&lt;/li&gt;
&lt;li&gt;(ru '(Practical Common Lisp)) - вариант &lt;a href="http://catap.ru/blog/"&gt;catap&lt;/a&gt;'а&lt;/li&gt;
&lt;li&gt;Практика Common Lisp&lt;/li&gt;
&lt;li&gt;Common Lisp на практике&lt;/li&gt;
&lt;li&gt;Практический Common Lisp &lt;/li&gt;
&lt;li&gt;Практический Lisp&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-114426030748834840?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/Zr-Gx7IeLLU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/114426030748834840/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=114426030748834840" title="Комментарии: 54" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/114426030748834840?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/114426030748834840?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/Zr-Gx7IeLLU/practical-common-lisp.html" title="Опрос: название для русской версии Practical Common Lisp" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>54</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/07/practical-common-lisp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAFQH4_cSp7ImA9WhZWFEg.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-5331477006189159856</id><published>2011-05-14T12:26:00.002+01:00</published><updated>2011-05-15T10:45:11.049+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-15T10:45:11.049+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="file formats" /><category scheme="http://www.blogger.com/atom/ns#" term="common-lisp" /><category scheme="http://www.blogger.com/atom/ns#" term="f#" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Небольшой книжный обзор</title><content type="html">Давно не писал в блог, даже собирался как-то продолжить свою серию обзоров книг, прочитанных за последние два месяца, но со временем полный завал - релизы на работе, плюс дополнительные проекты, поэтому писать про книги буду реже... Так что рецензии на уже прочитанные книги, и то, что я буду дальше читать, можно найти &lt;a href="http://www.goodreads.com/user/show/635213-alex-ott"&gt;на Goodreads&lt;/a&gt;.&lt;br /&gt;
&lt;h3&gt;Вкратце  о разных книгах&lt;/h3&gt;За мартовский отпуск дочитал давно лежащую в очереди "The art of meta-object protocol" - книжка дает понимание как проектировался CLOS, как были выбраны те или иные решения, и т.д.&lt;br /&gt;
В апреле в достаточно быстром темпе (они предложили сделать ревью) прочитал две книги издательства Manning: &lt;a href="http://www.manning.com/mattmann/"&gt;Tika in Action&lt;/a&gt; и &lt;a href="http://www.manning.com/wright/"&gt;ManifoldCF in Action&lt;/a&gt;. Первая была не особо интересной для меня, поскольку я в этой области работаю уже давно, да и tika знаю достаточно хорошо, но я думаю, что книжка все равно будет интересна для людей, которым нужно выделять текст и мета-информацию из файлов разных форматов.&amp;nbsp; А вот вторая книга была более интересной - я ее купил когда она еще только была анонсирована, но руки не доходили ее прочитать.&amp;nbsp; Книга описывает ManifoldCF - расширяемый фреймворк для работы с разными content repositories, откуда можно извлекать информацию для индексирования и прочей обработки. Фреймворк очень интересный, и я надеюсь его запользовать в одном из своих проектов.&lt;br /&gt;
&lt;h3&gt;Функциональное программирование на F#&lt;/h3&gt;Также в апреле мне попала на руки книга Дмитрия Сошникова &lt;a href="http://www.ozon.ru/context/detail/id/6151130/?partner=alexott"&gt;Функциональное программирование на F#&lt;/a&gt; (спасибо издательству ДМК-Пресс за предоставленный файл), и я ее неспешно прочитал...&lt;br /&gt;
Книга чисто практическая, начинается с примеров, и все остальное вводится по мере повествования. Это же является и ее недостатком - нет подробностей о лямбда-исчислении и синтаксисе языка - для этого требуется обратиться к другим источникам, типа &lt;a href="https://code.google.com/p/funprog-ru/"&gt;перевода курса лекций Джона Хариссона&lt;/a&gt;, и &lt;a href="http://www.ozon.ru/context/detail/id/6252314/?partner=alexott"&gt;переводу орейлевской книги про F#&lt;/a&gt;, которая вышла в издательстве "Символ-Плюс" (я ее правда не читал в переводе).&lt;br /&gt;
&lt;br /&gt;
Описываются все основные приемы программирования - функциональный, императивный и объектно-ориентированный. Достаточно хорошо описаны расширения языка типа активных паттернов, async, etc. &lt;br /&gt;
&lt;br /&gt;
Ну и стоит отдельно упоминуть 7-ю главу, которая содержит примеры решения задач в различных областях - "научное" программирование, графика, программирование для Windows Phone 7, веб-программирование, включая использование F# с ASP.Net, работу с веб-сервисами и т.п.&lt;br /&gt;
Я думаю, что книга может быть полезна студентам и начинающим программистам для использования в качестве сборника примеров решения задач. А затем, если язык заинтересует, то можно переходить и к &lt;a href="http://alexott.net/ru/fp/books/"&gt;другим книгам&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-5331477006189159856?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/wQe0vjXOWjY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/5331477006189159856/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=5331477006189159856" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/5331477006189159856?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/5331477006189159856?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/wQe0vjXOWjY/blog-post.html" title="Небольшой книжный обзор" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>4</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/05/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMFQHs7eCp7ImA9WhZRFkQ.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-8532603696274146554</id><published>2011-04-13T13:23:00.000+01:00</published><updated>2011-04-13T13:23:31.500+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-13T13:23:31.500+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><title>Новый номер журнала «Практика функционального программирования»</title><content type="html">&lt;p&gt;Вышел &lt;a href="http://fprog.ru/2011/issue7/"&gt;свежий (7-й) номер журнала «Практика функционального программирования»&lt;/a&gt;. В новом номере вы можете прочитать следующие статьи:&lt;p&gt;&lt;ul&gt;&lt;li&gt; &lt;b&gt;Язык РЕФАЛ &amp;mdash; взгляд со стороны.&lt;/b&gt; Бойко Банчев расскажет о сущности, истории и современном состоянии языка РЕФАЛ.&lt;li&gt; &lt;b&gt;Circumflex &amp;mdash; веб-фреймворк на Scala &lt;i&gt;comme il faut&lt;/i&gt;&lt;/b&gt;. Александр Темерев даст урок использования этого &amp;laquo;обезжиренного&amp;raquo; и гибкого веб-фреймворка, написанного на Scala.&lt;li&gt; &lt;b&gt;Разработка алгоритма обнаружения движения в среде программирования Mathematica&lt;/b&gt;. Вадим Залива расскажет об опыте прототипирования такого алгоритма при разработке iPhone-приложения &lt;a href="http://itunes.apple.com/us/app/isentry/id396777365?mt=8"&gt;iSentry&lt;/a&gt;.&lt;li&gt; &lt;b&gt;Как написать LDAP-сервер на Erlang&lt;/b&gt; и &lt;b&gt;Как написать LDAP-сервер на Си&lt;/b&gt;. Максим Сохацкий и Олег Смирнов обменяются любезностями со Львом Валкиным: Максим и Олег похвалят Erlang за то, что на нем можно за 20 минут написать LDAP-сервер, а Лев докажет, что дело тут вовсе не в Erlang.&lt;li&gt; &lt;b&gt;Продолжения в практике&lt;/b&gt;. Алексей Вознюк расскажет об использовании продолжений для упрятывания асинхронности кода за обыкновенным &amp;laquo;последовательным&amp;raquo; синтаксисом.&lt;li&gt; &lt;b&gt;Суперкомпиляция: идеи и методы&lt;/b&gt;. Илья Ключников, расскажет о суперкомпиляции, построив поразительно компактный и понятный суперкомпилятор простого языка, и покажет, что она применима не только для удивительно мощной оптимизации многих классов программ, но имеет и другие неожиданные применения.&lt;/ul&gt;&lt;p&gt;Кроме электронной версии, этот номер доступен и в &lt;a href="http://samizdal.ru/fprog"&gt;печатном виде&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;Обсудить статьи вы можете в &lt;a href="http://fprog.ru/2011/issue7/discuss/"&gt;fprog@ЖЖ&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-8532603696274146554?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/KVp1ubWLYB8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/8532603696274146554/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=8532603696274146554" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8532603696274146554?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8532603696274146554?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/KVp1ubWLYB8/blog-post_13.html" title="Новый номер журнала «Практика функционального программирования»" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/04/blog-post_13.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EHQns-eSp7ImA9WhZREUs.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-766601932602622688</id><published>2011-04-07T09:40:00.000+01:00</published><updated>2011-04-07T09:40:33.551+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-07T09:40:33.551+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Monad tutorial для кложуры</title><content type="html">&lt;a href="http://www.vimeo.com/user5897815/videos"&gt;Серия слайдкастов&lt;/a&gt; про монады на примере Clojure сделанный &lt;a href="http://www.exampler.com/blog/"&gt;Brian Marick.&lt;/a&gt; &lt;br /&gt;
Первая лекция начинается со следующей фразы "Существует предсказание, что когда-то, каждый человек на земле сделает monad tutorial, и высшая цель вселенной будет достигнута, и все человечество попадет в рай..." :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-766601932602622688?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/NnwGEZzkiDk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/766601932602622688/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=766601932602622688" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/766601932602622688?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/766601932602622688?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/NnwGEZzkiDk/monad-tutorial.html" title="Monad tutorial для кложуры" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/04/monad-tutorial.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEINRXg9eyp7ImA9WhZSGUQ.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-3503396043355804062</id><published>2011-04-05T08:50:00.001+01:00</published><updated>2011-04-05T10:43:14.663+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T10:43:14.663+01:00</app:edited><title>Реклама в журнале "Практика функционального программирования"</title><content type="html">Может быть это заинтересует кого-то из моих читателей - вы можете разместить свои вакансии (или другую рекламу) в журнале "Практика функционального программирования". Преимуществом такой рекламы является достаточно большая аудитория разработчиков ПО, которые, как мне кажется, имеют хороший уровень образования. Подробности &lt;a href="http://community.livejournal.com/fprog/20291.html"&gt;тут&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-3503396043355804062?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/fT5mHej1wc8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/3503396043355804062/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=3503396043355804062" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/3503396043355804062?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/3503396043355804062?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/fT5mHej1wc8/blog-post.html" title="Реклама в журнале &quot;Практика функционального программирования&quot;" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8MQ3czeCp7ImA9Wx9UEko.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-7335838929614142497</id><published>2011-02-09T19:08:00.000+01:00</published><updated>2011-02-09T19:08:02.980+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-09T19:08:02.980+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="2011" /><category scheme="http://www.blogger.com/atom/ns#" term="apache camel" /><category scheme="http://www.blogger.com/atom/ns#" term="DSL" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Дайджест прочитанных книг. Январь 2011</title><content type="html">&lt;p&gt;Как вы наверное уже заметили, в прошлом месяце не было обзора литературы &amp;mdash; было слишком много дел, поэтому никакой книги я читать не закончил.  Но зато рождественские и новогодние праздники позволили прочитать больше книг.&lt;/p&gt;&lt;div class="contents"&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href="#sec1"&gt;DSLs in Action&lt;/a&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;a href="#sec2"&gt;Camel in Action&lt;/a&gt;&lt;/dt&gt;
&lt;dt&gt;&lt;a href="#sec3"&gt;Test-driven development: By Example&lt;/a&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/div&gt;&lt;h2&gt;&lt;a name="sec1" id="sec1"&gt;&lt;/a&gt;DSLs in Action&lt;/h2&gt;&lt;p class="first"&gt;Давно собирался почитать что-то про domain specific languages (DSL) чтобы найти новые идеи, сравнить с тем что я сам делаю (у меня есть несколько DSL, которые я применяю в рабочих проектах), может быть улучшить свои решения.  Мой выбор пал на &lt;a href="http://www.amazon.com/gp/product/1935182455?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1935182455"&gt;DSLs in Action&lt;/a&gt;, написанную Debasish Ghosh, который является достаточно известным разработчиком в Scala сообществе, хотя использует и другие языки, например, Haskell, Groovy, Clojure.  Когда я выбирал что почитать, я также смотрел в сторону книги &lt;a href="http://www.amazon.com/gp/product/0321712943?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321712943"&gt;Domain-Specific Languages&lt;/a&gt;, написанную Martin Fowler, но Manning прислал очередную партию скидок, и я купил книгу у них (и не пожалел).&lt;/p&gt;&lt;p&gt;Книга написана очень простым языком, но при этом дается материал очень высокого качества. Автор показывает различные приемы разработки DSL используя разные языки &amp;mdash; Ruby, Groovy, Scala, Clojure (в книге используются только языки, работающие только на JVM, и многие вещи применимы только к этой платформе).  Это позволяет показать разные подходы к проектированию и реализации DSL (есть также &lt;a href="http://debasishg.blogspot.com/2011/02/why-i-made-dsls-in-action-polyglotic.html"&gt;статья в блоге автора&lt;/a&gt; о том, почему использовались разные языки).&lt;/p&gt;&lt;p&gt;Первая часть книги посвящена основам DSL &amp;mdash; автор начинает рассказ с описания что такое DSL, из чего они состоят, какие бывают виды DSL, как они выполняются, преимущества и недостатки использования DSL в ваших проектах.  Отдельно описывается то, как моделируются предметные области, и как они влияют на структуру DSL.&lt;/p&gt;&lt;p&gt;Вторая глава демонстрирует простой DSL, который реализован с помощью стандартной Java, и анализируются недостатки конкретного подхода.  Затем, аналогичный DSL создается с помощью Groovy, и рассматриваются его преимущества по сравнению с первой реализаций.  В остальной части главы рассматриваются паттерны реализации DSL, с учетом предыдущей информации.&lt;/p&gt;&lt;p&gt;Третья глава посвящена вопросам интеграции DSL в основной проект.  В ней обсуждаются java scripting engine, интеграция на базе Spring, и т.д.  Для каждого из возможных подходов, рассматриваются преимущества и недостатки данного подхода, то, как он может повлиять на реализацию DSL, и т.д.&lt;/p&gt;&lt;p&gt;Вторая часть (главы 4-8) посвящены реализации DSL на конкретных языках программирования. 4-я глава описывает основные приемы реализации внедряемых (internal) DSL &amp;mdash; мета-программирование, типизированные абстракции, генерацию кода во время компиляции и т.д.  И следующие две главы (5 и 6), подробно показывают как эти абстракции применяются при реализации DSL на Ruby, Groovy, Clojure и Scala.&lt;/p&gt;&lt;p&gt;Седьмая глава продолжает тему реализации DSL, но уже с точки зрения использования внешних (external) DSL.  Рассматриваются разные виды парсеров, с помощью которых можно разбирать код использующий DSL, показывается небольшой пример использования ANTLR для генерации парсеров, и приводится небольшое описание Xtext &amp;mdash; фреймворка для Eclipse, который упрощает разработку внешних DSL.&lt;/p&gt;&lt;p&gt;В восьмой главе продолжается тематика использования внешних DSL и в ней показывается применение комбинаторов парсеров для разбора исходного кода DSL.  Глава начинается с небольшого описания того, что такое комбинаторы парсеров, а затем показывается пример использования комбинаторов парсеров в Scala для работы с внешними DSL.&lt;/p&gt;&lt;p&gt;И в заключительной части книги рассматриваются текущие тенденции в части разработки и использования DSL, утилит для упрощения разработки, и сопутствующие темы.&lt;/p&gt;&lt;p&gt;Кроме основного материала, в книге имеется несколько приложений, в которых собраны краткие описания используемых языков, что позволяет ознакомиться с примерами даже тем людям, которые не программируют на конкретных языках.  Отдельно стоит упомянуть &amp;quot;философское&amp;quot; приложение A, которое посвящено обсуждению роли абстракций в моделировании предметной области, влиянию чистоты, отсутствия побочных эффектов на разработку, и сопутствующим проблемам. Кроме этого, может быть интересным приложение B, где обсуждается роль мета-программирования в разработке DSL.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Заключение:&lt;/em&gt; если вы используете и/или разрабатываете DSL, или вам просто интересна эта тема, то книгу обязательно стоит прочитать &amp;mdash; в ней много практической информации, которая будет полезна при разработке DSL.&lt;/p&gt;&lt;h2&gt;&lt;a name="sec2" id="sec2"&gt;&lt;/a&gt;Camel in Action&lt;/h2&gt;&lt;p class="first"&gt;Для очередного из &amp;quot;домашних&amp;quot; проектов понадобилось слепить систему обработки данных из разных источников, поэтому погуглив, я нашел &lt;a href="http://camel.apache.org/"&gt;Apache Camel&lt;/a&gt;, который показался мне интересным и достаточно зрелым проектом, а на очередной маннинговской распродаже я прикупил книжку &lt;a href="http://www.amazon.com/gp/product/1935182366?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1935182366"&gt;Camel in Action&lt;/a&gt; авторства Claus Ibsen и Jonathan Anstey.&lt;/p&gt;&lt;p&gt;Книга начинается (глава 1) с объяснения что такое Apache Camel, какие задачи он решает и из чего он состоит.  Во второй главе более подробно рассматриваются маршруты (routes) и показывается как можно их создавать используя код на Java или Spring.&lt;/p&gt;&lt;p&gt;Вторая часть книги полностью посвящена базовым вопросам разработки с использованием Camel, показывается как преобразовывать данные, обрабатывать ошибки, тестировать код, и использовать дополнительные компоненты, такие как JMS, базы данных и т.д.&lt;/p&gt;&lt;p&gt;А третья часть посвящена таким вопросам как использование транзакций, организация конкурентной обработки данных, а также вопросам мониторинга и деплоймента проектов.&lt;/p&gt;&lt;p&gt;Отдельная глава (11-я) описывает организацию процесса разработки с использованием Camel, включая разработку новых компонентов и адаптеров.  Кроме этого, на примере DSL для Scala, показывается как использовать Camel с другими языками (хотя на мой взгляд проект &lt;a href="https://github.com/krasserm/scalaz-camel"&gt;scalaz-camel&lt;/a&gt; выглядит более интересным).&lt;/p&gt;&lt;p&gt;&lt;em&gt;Заключение:&lt;/em&gt; если вы заинтересованы в применении Apache Camel, то книжку стоит прочитать &amp;mdash; она может служить как хорошим введением в данную систему, так и достаточно подробным руководством по основным компонентам.&lt;/p&gt;&lt;p&gt;P.S. Для Clojure также начата работа по созданию библиотеки для интеграции с Apache Camel. Проект называется &lt;a href="https://github.com/dysinger/hackamore"&gt;Hackamore&lt;/a&gt; и находится в начальной стадии разработки.  Если вам это интересно, то вы можете присоединиться к обсуждению в специально созданном &lt;a href="https://groups.google.com/group/hackamore"&gt;списке рассылки&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a name="sec3" id="sec3"&gt;&lt;/a&gt;Test-driven development: By Example&lt;/h2&gt;&lt;p class="first"&gt;Недавно я готовил презентацию для внутреннего семинара о test driven development (TDD), и решил прочитать что-то от основоположников этого движения.  Серию Extreme Programming я читал много лет назад, сразу после ее выхода, поэтому взгляд остановился на книге &lt;a href="http://www.amazon.com/gp/product/0321146530?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321146530"&gt;Test Driven Development: By Example&lt;/a&gt; Кента Бека.&lt;/p&gt;&lt;p&gt;Книжка небольшая &amp;mdash; чуть больше 200 страниц, но и этот объем является слишком большим для данной темы &amp;mdash; автор взял одну проблему, и подробно разбирает процесс ее реализации, который управляется тестами, которые создаются по мере добавления новых требований.  На протяжении первой части книги, с помощью данного примера иллюстрируются основы TDD и Unit testing.&lt;/p&gt;&lt;p&gt;Во второй части, применение TDD иллюстрируются описанием процесса реализации xUnit-подобного фреймворка для тестирования кода на Python, начиная с определения основной функциональности фреймворка, и затем, последовательной реализацией кода.&lt;/p&gt;&lt;p&gt;В третьей части рассматриваются основные приемы и паттерны использования TDD, проектирования кода для тестирования, разработки тестов и т.д.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Заключение:&lt;/em&gt; хорошее введение в TDD, но стоит прочитать только для людей кто никогда с ним не сталкивался &amp;mdash; слишком уж начального уровня. Хотя иногда попадаются полезные советы по организации кода, неплохое описание рабочего процесса и т.п.  Если вы уже хоть как-то применяли тесты в своей работе, то можно найти более короткий источник нужной информации.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-7335838929614142497?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/ERuel1unKrQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/7335838929614142497/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=7335838929614142497" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/7335838929614142497?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/7335838929614142497?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/ERuel1unKrQ/2011.html" title="Дайджест прочитанных книг. Январь 2011" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/02/2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08GRno8eSp7ImA9Wx9VGE8.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-2175626746263785720</id><published>2011-02-04T15:19:00.005+01:00</published><updated>2011-02-04T15:30:27.471+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-04T15:30:27.471+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><category scheme="http://www.blogger.com/atom/ns#" term="article" /><title>Типы и протоколы в Clojure</title><content type="html">Эта заметка также опубликована как часть &lt;a href="http://alexott.net/ru/clojure/clojure-intro/"&gt;статьи "Введение в Clojure"&lt;/a&gt;...&lt;br /&gt;
&lt;hr&gt;&lt;p&gt;Одно из самых больших изменений в Clojure версии 1.2 &amp;mdash; введение в язык новых артефактов: протоколов (protocols) и типов  данных (datatypes).  Данные изменения позволяют улучшить производительность программ по сравнению с мультиметодами, что в будущем даст возможность написать Clojure на Clojure (в данный момент протоколы и типы данных уже активно используются при реализации Clojure).&lt;/p&gt;&lt;div class="contents"&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href="#sec1"&gt;Что это такое и зачем нужно?&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;&lt;a href="#sec2"&gt;Определение протоколов&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;&lt;a href="#sec3"&gt;Реализация протоколов&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;&lt;a href="#sec4"&gt;Определение типов данных&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;dl&gt;&lt;dt&gt;&lt;a href="#sec5"&gt;deftype &amp;amp; defrecord&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;&lt;a href="#sec6"&gt;reify&lt;/a&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a href="#sec7"&gt;Дополнительные функции и макросы&lt;/a&gt;&lt;/dt&gt;&lt;dt&gt;&lt;a href="#sec8"&gt;Дополнительная информация&lt;/a&gt;&lt;/dt&gt;&lt;/dl&gt;&lt;/div&gt;&lt;h2&gt;&lt;a name="sec1" id="sec1"&gt;&lt;/a&gt;Что это такое и зачем нужно?&lt;/h2&gt;&lt;p class="first"&gt;Протоколы и типы данных &amp;mdash; два связанных друг с другом понятия.  Протоколы используются для определения полиморфных функций, которые затем могут быть реализованы для конкретных типов данных (в том числе и из других библиотек).&lt;/p&gt;&lt;p&gt;Существует несколько причин введения протоколов и типов данных в новую версию языка:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Увеличить скорость работы полиморфных функций, при этом поддерживая большую часть функциональности мультиметодов, поскольку для протоколов диспатчеризация выполняется только по типу данных;&lt;/li&gt;
&lt;li&gt;Использовать лучшие стороны интерфейсов (только спецификация функций, без реализации, реализация нескольких интерфейсов одним типом), в тоже время избегая недостатков (список реализуемых интерфейсов задан во время реализации типа данных, создание иерархии типов вида &lt;code&gt;isa/instanceof&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;Избежать &lt;a href="http://en.wikipedia.org/wiki/Expression_Problem"&gt;Expression problem&lt;/a&gt; и дать возможность расширять набор операций над типами данных без изменениях определения типов данных (в том числе и чужих) и перекомпиляции исходного кода&lt;sup&gt;&lt;a class="footref" name="fnr.1" href="#fn.1"&gt;1&lt;/a&gt;&lt;/sup&gt;;&lt;/li&gt;
&lt;li&gt;Использовать высокоуровневые абстракции для типов данных и операций над ними&lt;sup&gt;&lt;a class="footref" name="fnr.2" href="#fn.2"&gt;2&lt;/a&gt;&lt;/sup&gt;, что упрощает проектирование программ.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Также как и интерфейсы, протоколы позволяют объединить объявление нескольких полиморфных функций (или одной функции) в один объект&lt;sup&gt;&lt;a class="footref" name="fnr.3" href="#fn.3"&gt;3&lt;/a&gt;&lt;/sup&gt;.  Отличием от интерфейсов является то, что вы не можете унаследовать новый протокол от существующего протокола.&lt;/p&gt;&lt;p&gt;В отличии от имеющегося в Clojure &lt;code&gt;gen-interface&lt;/code&gt; (и соответствующих &lt;code&gt;proxy/gen-class&lt;/code&gt;) определение протоколов и типов не требует AOT (ahead-of-time) компиляции исходного кода, что упрощает распространение программ на Clojure.  Однако при определении протокола, Clojure автоматически создает соответствующий интерфейс, который будет доступен для кода, написанного на Java.&lt;/p&gt;&lt;p&gt;Типы данных, определенные с помощью &lt;code&gt;deftype&lt;/code&gt; или &lt;code&gt;defrecord&lt;/code&gt; позволяют программисту на Clojure определять свои структуры данных, вместо использования обычных отображений и структур, но об этом &lt;a href="#datatypes"&gt;ниже&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Важно помнить, что протоколы и типы данных с одним и тем же именем могут быть определены в разных пространствах имен, так что стоит быть осторожным и не наделать ошибок при импорте определений и последующей реализации протоколов!&lt;/em&gt;&lt;/p&gt;&lt;h2&gt;&lt;a name="sec2" id="sec2"&gt;&lt;/a&gt;Определение протоколов&lt;/h2&gt;&lt;p class="first"&gt;Протоколом называется именованный набор функций с определенными сигнатурами.  Для определения используется макрос, применение которого выглядит следующим образом:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;defprotocol&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;&amp;#1085;&amp;#1072;&amp;#1079;&amp;#1074;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1077;&lt;/span&gt; &lt;span style="color: #666666;"&gt;"&amp;#1086;&amp;#1087;&amp;#1080;&amp;#1089;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1077;"&lt;/span&gt; &amp;amp; &amp;#1089;&amp;#1080;&amp;#1075;&amp;#1085;&amp;#1072;&amp;#1090;&amp;#1091;&amp;#1088;&amp;#1099;)
&lt;/pre&gt;&lt;p&gt;&lt;code&gt;название&lt;/code&gt; &amp;mdash; единственный обязательный параметр, хотя определение протокола без функций не имеет особого смысла.  В описании вы можете описать ваш протокол, и это описание будет показываться при вызове функции &lt;code&gt;doc&lt;/code&gt; для вашего протокола.  Для протокола вы можете указать одну или несколько сигнатур функций, где каждая сигнатура выглядит следующим образом:&lt;/p&gt;&lt;pre class="src"&gt;(&amp;#1080;&amp;#1084;&amp;#1103; [&amp;#1072;&amp;#1088;&amp;#1075;&amp;#1091;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1099;+]+ &lt;span style="color: #008b00;"&gt;"&amp;#1086;&amp;#1087;&amp;#1080;&amp;#1089;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1077;"&lt;/span&gt;)
&lt;/pre&gt;&lt;p&gt;Вы можете определять одну функцию, которая будет принимать различное количество параметров, но первым аргументом функции всегда является объект, на основании которого будет выполняться диспатчеризация, и к которому эта функция будет применяться.  Вы можете рассматривать его как &lt;code&gt;this&lt;/code&gt; в Java и C++.  В дополнение к сигнатурам, вы можете описать вашу функцию, но это необязательно.&lt;/p&gt;&lt;p&gt;Давайте посмотрим на стандартный пример:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;defprotocol&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AProtocol&lt;/span&gt;
  &lt;span style="color: #666666;"&gt;"A doc string for AProtocol abstraction"&lt;/span&gt;
  (bar [a b] &lt;span style="color: #008b00;"&gt;"bar docs"&lt;/span&gt;)
  (baz [a] [a b] [a b c] &lt;span style="color: #008b00;"&gt;"baz docs"&lt;/span&gt;))
&lt;/pre&gt;&lt;p&gt;Данный протокол определяет две функции: &lt;code&gt;bar&lt;/code&gt; &amp;mdash; с двумя параметрами, и &lt;code&gt;baz&lt;/code&gt; &amp;mdash; с одним, двумя или тремя параметрами.&lt;/p&gt;&lt;p&gt;&lt;code&gt;defprotocol&lt;/code&gt; также создаст соответствующий интерфейс, с тем же самым именем что и протокол. Данный интерфейс будет иметь те же самые функции, что и протокол.&lt;/p&gt;&lt;h2&gt;&lt;a name="sec3" id="sec3"&gt;&lt;/a&gt;Реализация протоколов&lt;/h2&gt;&lt;p class="first"&gt;Протокол сам по себе ни на что не влияет &amp;mdash; чтобы использовать его, мы должны добавить его специализации для типов данных или классов JVM.  Для этого может использоваться функция &lt;code&gt;extend&lt;/code&gt;, использование которой выглядит следующим образом:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #006400;"&gt;extend&lt;/span&gt; &amp;#1090;&amp;#1080;&amp;#1087;-&amp;#1080;&amp;#1083;&amp;#1080;-&amp;#1082;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1089;
  &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;&amp;#1083;-1
   {&lt;span style="color: #006400;"&gt;:&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-1&lt;/span&gt; &amp;#1091;&amp;#1078;&amp;#1077;-&amp;#1086;&amp;#1087;&amp;#1088;&amp;#1077;&amp;#1076;&amp;#1077;&amp;#1083;&amp;#1077;&amp;#1085;&amp;#1085;&amp;#1072;&amp;#1103;-&amp;#1092;&amp;#1091;&amp;#1085;&amp;#1082;&amp;#1094;&amp;#1080;&amp;#1103;
    &lt;span style="color: #006400;"&gt;:&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-2&lt;/span&gt; (&lt;span style="color: #006400;"&gt;fn&lt;/span&gt; [a b] ...)
    &lt;span style="color: #006400;"&gt;:&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-3&lt;/span&gt; (&lt;span style="color: #006400;"&gt;fn&lt;/span&gt; ([a]...) ([a b] ...)...)}
  &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;&amp;#1083;-2
    {...}
...)
&lt;/pre&gt;&lt;p&gt;Для этой функции вы указываете имя типа данных или класса (или &lt;code&gt;nil&lt;/code&gt;), и передаете список состоящий из названий протоколов (&lt;code&gt;протокол-1&lt;/code&gt; и т.д.) и отображений, которые связывают функции протокола (&lt;code&gt;метод-1&lt;/code&gt; и т.д.) с их реализациями &amp;mdash; анонимными или именованными функциями.&lt;/p&gt;&lt;p&gt;Стоит отметить, что функция &lt;code&gt;extend&lt;/code&gt; является низкоуровневым инструментом реализации протоколов.  Кроме этого, в состав языка введены макросы &lt;code&gt;extend-protocol&lt;/code&gt; &amp;amp; &lt;code&gt;extend-type&lt;/code&gt;, которые немного упрощают реализацию протоколов&lt;sup&gt;&lt;a class="footref" name="fnr.4" href="#fn.4"&gt;4&lt;/a&gt;&lt;/sup&gt;.  Протокол также может быть реализован непосредственно при &lt;a href="#datatypes"&gt;объявлении типа данных&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Использование &lt;code&gt;extend-type&lt;/code&gt; выглядит практически также как и использование &lt;code&gt;extend&lt;/code&gt;, но пользователь записывает реализации в более удобном виде (&lt;code&gt;extend-type&lt;/code&gt; раскрывается в соответствующий вызов &lt;code&gt;extend&lt;/code&gt;):&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #006400;"&gt;extend-type&lt;/span&gt; &amp;#1090;&amp;#1080;&amp;#1087;-&amp;#1080;&amp;#1083;&amp;#1080;-&amp;#1082;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1089;
  &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;&amp;#1083;-1
    (&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-2 [a b] ...)
    (&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-3 ([a]...)
             ([a b] ...)...)
  &amp;#1087;&amp;#1088;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;&amp;#1083;-2
    (....)
...)
&lt;/pre&gt;&lt;p&gt;Макрос &lt;code&gt;extend-protocol&lt;/code&gt; использоваться в тех случаях, если вы хотите реализовать один протокол для нескольких типов данных или классов.  В общем виде использование &lt;code&gt;extend-protocol&lt;/code&gt; выглядит следующим образом:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #006400;"&gt;extend-protocol&lt;/span&gt; &amp;#1085;&amp;#1072;&amp;#1079;&amp;#1074;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1077;-&amp;#1087;&amp;#1088;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;&amp;#1083;&amp;#1072;
  &amp;#1058;&amp;#1080;&amp;#1087;-&amp;#1080;&amp;#1083;&amp;#1080;-&amp;#1050;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1089;-1
   (&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-1 ...)
   (&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-2 ...)
  &amp;#1058;&amp;#1080;&amp;#1087;-&amp;#1080;&amp;#1083;&amp;#1080;-&amp;#1050;&amp;#1083;&amp;#1072;&amp;#1089;&amp;#1089;-2
   (&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-1 ...)
   (&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;-2 ...)
...)
&lt;/pre&gt;&lt;p&gt;При использовании, &lt;code&gt;extend-protocol&lt;/code&gt; раскрывается в серию вызовов &lt;code&gt;extend-type&lt;/code&gt; для каждого из используемых типов.&lt;/p&gt;&lt;p&gt;Давайте рассмотрим небольшой пример.  Пусть мы объявим следующий простой протокол:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;defprotocol&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;Hello&lt;/span&gt; &lt;span style="color: #666666;"&gt;"Test of protocol"&lt;/span&gt;
  (hello [this] &lt;span style="color: #008b00;"&gt;"hello function"&lt;/span&gt;))
&lt;/pre&gt;&lt;p&gt;Мы можем использовать &lt;code&gt;extend&lt;/code&gt;, &lt;code&gt;extend-protocol&lt;/code&gt;, или &lt;code&gt;extend-type&lt;/code&gt; для его специализации для класса &lt;code&gt;String&lt;/code&gt;:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #006400;"&gt;extend&lt;/span&gt; &lt;span style="color: #006400;"&gt;String&lt;/span&gt;
  &lt;span style="color: #006400;"&gt;Hello&lt;/span&gt;
  {&lt;span style="color: #006400;"&gt;:hello&lt;/span&gt; (&lt;span style="color: #006400;"&gt;fn&lt;/span&gt; [this] (&lt;span style="color: #006400;"&gt;str&lt;/span&gt; &lt;span style="color: #008b00;"&gt;"Hello "&lt;/span&gt; this &lt;span style="color: #008b00;"&gt;"!"&lt;/span&gt;))})

(&lt;span style="color: #006400;"&gt;extend-protocol&lt;/span&gt; &lt;span style="color: #006400;"&gt;Hello&lt;/span&gt; &lt;span style="color: #006400;"&gt;String&lt;/span&gt;
  (hello [this] (&lt;span style="color: #006400;"&gt;str&lt;/span&gt; &lt;span style="color: #008b00;"&gt;"Hello "&lt;/span&gt; this &lt;span style="color: #008b00;"&gt;"!"&lt;/span&gt;)))

(&lt;span style="color: #006400;"&gt;extend-type&lt;/span&gt; &lt;span style="color: #006400;"&gt;String&lt;/span&gt; &lt;span style="color: #006400;"&gt;Hello&lt;/span&gt;
  (hello [this] (&lt;span style="color: #006400;"&gt;str&lt;/span&gt; &lt;span style="color: #008b00;"&gt;"Hello "&lt;/span&gt; this &lt;span style="color: #008b00;"&gt;"!"&lt;/span&gt;)))
&lt;/pre&gt;&lt;p&gt;При использовании любой из этих реализаций для объекта класса &lt;code&gt;String&lt;/code&gt; мы получим один и тот же ответ:&lt;/p&gt;&lt;pre class="src"&gt;user&amp;gt; (hello &lt;span style="color: #008b00;"&gt;"world"&lt;/span&gt;)
&lt;span style="color: #008b00;"&gt;"Hello world!"&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Стоит отметить, что если вы не реализовали протокол для определенного типа данных, то при вызове функции будет сгенерировано исключение.  В том случае, если вам необходима &amp;quot;реализация по умолчанию&amp;quot;, то вы можете специализировать протокол для класса &lt;code&gt;Object&lt;/code&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a name="sec4" id="sec4"&gt;&lt;/a&gt;&lt;a name="datatypes" id="datatypes"&gt;&lt;/a&gt;Определение типов данных&lt;/h2&gt;&lt;p class="first"&gt;В Clojure 1.2 введены два метода определения новых именованных типов данных (&lt;code&gt;deftype&lt;/code&gt; и &lt;code&gt;defrecord&lt;/code&gt;), которые реализуют абстракции, определенные протоколами и/или интерфейсами (к типам данных относится также &lt;code&gt;reify&lt;/code&gt;, который описан ниже).&lt;/p&gt;&lt;p&gt;&lt;code&gt;deftype&lt;/code&gt; и &lt;code&gt;defrecord&lt;/code&gt; динамически создают именованный класс, который имеет набор заданных полей и (необязательно) методов для одного или нескольких протоколов и/или интерфейсов. Поскольку они не требуют явной компиляции, то это дает возможность их использования в интерактивной разработке.  С точки зрения разработчика &lt;code&gt;deftype&lt;/code&gt; и &lt;code&gt;defrecord&lt;/code&gt; похожи на &lt;code&gt;defstruct&lt;/code&gt;, но во многом они отличаются:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;они создают уникальный класс с соответствующими полями;&lt;/li&gt;
&lt;li&gt;созданный класс имеет конкретный тип;&lt;/li&gt;
&lt;li&gt;имеется конструктор;&lt;/li&gt;
&lt;li&gt;для полей можно указывать типы (это будет использоваться для оптимизации и ограничения типов в конструкторе).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;deftype&lt;/code&gt; является &amp;quot;базовым&amp;quot; инструментом для определения типов данных &amp;mdash; созданный тип имеет только конструктор, и ничего больше &amp;mdash; все остальное должен реализовывать разработчик.  Но при этом, &lt;code&gt;deftype&lt;/code&gt; может иметь изменяемые поля, чего не имеет &lt;code&gt;defrecord&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;В отличии от &lt;code&gt;deftype&lt;/code&gt;, &lt;code&gt;defrecord&lt;/code&gt; более прост в использовании, поскольку создаваемый тип данных имеет большую функциональность (по большей части за счет реализации интерфейсов &lt;code&gt;IKeywordLookup&lt;/code&gt;, &lt;code&gt;IPersistentMap&lt;/code&gt;, &lt;code&gt;Serializable&lt;/code&gt; и т.д.):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;автоматически генерируемые функции &lt;code&gt;hashCode&lt;/code&gt; и &lt;code&gt;equals&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;возможность указания мета-информации;&lt;/li&gt;
&lt;li&gt;доступ к полям с помощью ключевых символов;&lt;/li&gt;
&lt;li&gt;вы можете добавлять поля, не указанные в определении.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;deftype&lt;/code&gt; и &lt;code&gt;defrecord&lt;/code&gt; обычно имеют разные области применения: &lt;code&gt;deftype&lt;/code&gt; в основном используется для &amp;quot;системных&amp;quot; вещей &amp;mdash; коллекций, и т.п., тогда как &lt;code&gt;defrecord&lt;/code&gt; в основном используется для хранения информации из &amp;quot;проблемной области&amp;quot; &amp;mdash; данных о заказчиках, записях в БД и т.п. &amp;mdash; то, для чего использовались отображения в версиях 1.0 и 1.1.&lt;/p&gt;&lt;p&gt;Давайте рассмотрим как использовать конкретные средства для создания типов данных.&lt;/p&gt;&lt;h3&gt;&lt;a name="sec5" id="sec5"&gt;&lt;/a&gt;deftype &amp;amp; defrecord&lt;/h3&gt;&lt;p class="first"&gt;В общей форме использование макросов &lt;code&gt;deftype&lt;/code&gt; и &lt;code&gt;defrecord&lt;/code&gt; выглядит следующим образом:&lt;/p&gt;&lt;pre class="src"&gt;(deftype &amp;#1080;&amp;#1084;&amp;#1103; [&amp;amp; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1103;] &amp;amp; &amp;#1089;&amp;#1087;&amp;#1077;&amp;#1094;&amp;#1080;&amp;#1092;&amp;#1080;&amp;#1082;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1080;)
(defrecord &amp;#1080;&amp;#1084;&amp;#1103; [&amp;amp; &amp;#1087;&amp;#1086;&amp;#1083;&amp;#1103;] &amp;amp; &amp;#1089;&amp;#1087;&amp;#1077;&amp;#1094;&amp;#1080;&amp;#1092;&amp;#1080;&amp;#1082;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1080;)
&lt;/pre&gt;&lt;p&gt;Для обоих макросов обязательным параметром является лишь имя, которое становится именем класса.  Поля, которые станут членами класса, перечисляются в векторе, следующем за именем, и могут содержать объявления типов.  После этого вектора, можно указать список реализуемых интерфейсов и протоколов, вместе с реализацией (это не обязательно, поскольку для этого вы позже можете использовать &lt;code&gt;extend-protocol&lt;/code&gt; &amp;amp; &lt;code&gt;extend-type&lt;/code&gt;).&lt;/p&gt;&lt;p&gt;Спецификации протоколов/интерфейсов выглядят следующим образом:&lt;/p&gt;&lt;pre class="src"&gt;&amp;#1087;&amp;#1088;&amp;#1086;&amp;#1090;&amp;#1086;&amp;#1082;&amp;#1086;&amp;#1083;/&amp;#1080;&amp;#1085;&amp;#1090;&amp;#1077;&amp;#1088;&amp;#1092;&amp;#1077;&amp;#1081;&amp;#1089;
(&amp;#1085;&amp;#1072;&amp;#1079;&amp;#1074;&amp;#1072;&amp;#1085;&amp;#1080;&amp;#1077;-&amp;#1084;&amp;#1077;&amp;#1090;&amp;#1086;&amp;#1076;&amp;#1072; [&amp;#1072;&amp;#1088;&amp;#1075;&amp;#1091;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1099;*] &amp;#1088;&amp;#1077;&amp;#1072;&amp;#1083;&amp;#1080;&amp;#1079;&amp;#1072;&amp;#1094;&amp;#1080;&amp;#1103;)*
&lt;/pre&gt;&lt;p&gt;Вы можете указать любое количество протоколов/интерфейсов, которые будут реализованы данным типом данных.  Давайте посмотрим на простейший тип данных, который реализует протокол &lt;code&gt;Hello&lt;/code&gt;:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;deftype&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;A&lt;/span&gt; []
  &lt;span style="color: #006400;"&gt;Hello&lt;/span&gt;
  (hello [this] (&lt;span style="color: #006400;"&gt;str&lt;/span&gt; &lt;span style="color: #008b00;"&gt;"Hello A!"&lt;/span&gt;)))
&lt;/pre&gt;&lt;p&gt;Мы можем вызвать функцию &lt;code&gt;hello&lt;/code&gt; для нашего объекта, и получим следующий вывод:&lt;/p&gt;&lt;pre class="src"&gt;user&amp;gt; (hello (&lt;span style="color: #006400;"&gt;A.&lt;/span&gt;))
&lt;span style="color: #008b00;"&gt;"Hello A!"&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Мы можем также создать тип с помощью &lt;code&gt;defrecord&lt;/code&gt;:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;defrecord&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;B&lt;/span&gt; [name]
  &lt;span style="color: #006400;"&gt;Hello&lt;/span&gt;
  (hello [this] (&lt;span style="color: #006400;"&gt;str&lt;/span&gt; &lt;span style="color: #008b00;"&gt;"Hello "&lt;/span&gt; name &lt;span style="color: #008b00;"&gt;"!"&lt;/span&gt;)))
&lt;/pre&gt;&lt;p&gt;и вызвать метод &lt;code&gt;hello&lt;/code&gt; для этого типа:&lt;/p&gt;&lt;pre class="src"&gt;user&amp;gt; (hello (&lt;span style="color: #006400;"&gt;B.&lt;/span&gt; &lt;span style="color: #008b00;"&gt;"world"&lt;/span&gt;))
&lt;span style="color: #008b00;"&gt;"Hello world!"&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;Как уже отмечалось выше, создаваемые поля по умолчанию являются неизменяемыми, но если вы создаете тип с помощью &lt;code&gt;deftype&lt;/code&gt;, то вы можете пометить некоторые поля как изменяемые, используя метаданные (с помощью ключевого символа &lt;code&gt;:volatile-mutable&lt;/code&gt; или &lt;code&gt;:unsynchronized-mutable&lt;/code&gt;).  Для таких полей вы сможете использовать оператор &lt;code&gt;(set! afield aval)&lt;/code&gt; для изменения данных.  Давайте посмотрим как это делается на примере &amp;mdash; если мы создадим следующий протокол и тип данных:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;defprotocol&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;Setter&lt;/span&gt;
  (set-name [this new-name]))
(&lt;span style="color: #a020f0;"&gt;deftype&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;AM&lt;/span&gt; [^{&lt;span style="color: #006400;"&gt;:volatile-mutable&lt;/span&gt; true} mfield]
  &lt;span style="color: #006400;"&gt;Hello&lt;/span&gt;
  (hello [this] (&lt;span style="color: #006400;"&gt;str&lt;/span&gt; &lt;span style="color: #008b00;"&gt;"Hello "&lt;/span&gt; mfield &lt;span style="color: #008b00;"&gt;"!"&lt;/span&gt;))
  &lt;span style="color: #006400;"&gt;Setter&lt;/span&gt;
  (set-name [this new-name] 
     (set! mfield new-name)))
&lt;/pre&gt;то мы сможем изменять значение поля:&lt;br /&gt;
&lt;pre class="src"&gt;user&amp;gt; (def am (AM. &lt;span style="color: #008b00;"&gt;"world"&lt;/span&gt;))
#'user/am
user&amp;gt; (hello am)
&lt;span style="color: #008b00;"&gt;"Hello world!"&lt;/span&gt;
user&amp;gt; (set-name am &lt;span style="color: #008b00;"&gt;"peace"&lt;/span&gt;)
&lt;span style="color: #008b00;"&gt;"peace"&lt;/span&gt;
user&amp;gt; (hello am)
&lt;span style="color: #008b00;"&gt;"Hello peace!"&lt;/span&gt;
&lt;/pre&gt;&lt;h3&gt;&lt;a name="sec6" id="sec6"&gt;&lt;/a&gt;reify&lt;/h3&gt;&lt;p&gt;&lt;code&gt;reify&lt;/code&gt; используется тогда, когда вам нужно реализовать протокол или интерфейс только в одном месте &amp;mdash; когда вы используете &lt;code&gt;reify&lt;/code&gt; вы одновременно объявляете тип, и сразу создаете объект этого типа. Функция &lt;code&gt;reify&lt;/code&gt; по своему использованию очень похожа на &lt;code&gt;proxy&lt;/code&gt;, но с некоторыми исключениями:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;можно использовать только для интерфейсов и протоколов;&lt;/li&gt;
&lt;li&gt;реализуемые методы являются методами результирующего класса, и они вызываются напрямую,&lt;br /&gt;
без поиска в отображении, но при этом не поддерживается подмена методов в отображении.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Эти отличия позволяют получить более высокую производительность по сравнению с &lt;code&gt;proxy&lt;/code&gt;, и при создании и при выполнении.&lt;/p&gt;&lt;p&gt;Вот небольшой пример реализации протокола &lt;code&gt;Hello&lt;/code&gt; для конкретного объекта:&lt;/p&gt;&lt;pre class="src"&gt;(&lt;span style="color: #a020f0;"&gt;def&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int-reify&lt;/span&gt; (&lt;span style="color: #006400;"&gt;reify&lt;/span&gt; &lt;span style="color: #006400;"&gt;Hello&lt;/span&gt;
                 (hello [this] &lt;span style="color: #008b00;"&gt;"Hello integer!"&lt;/span&gt;)))
&lt;/pre&gt;&lt;p&gt;И при вызове &lt;code&gt;hello&lt;/code&gt; для этого объекта, мы получим соответствующий результат:&lt;/p&gt;&lt;pre class="src"&gt;user&amp;gt; (hello int-reify)
&lt;span style="color: #008b00;"&gt;"Hello integer!"&lt;/span&gt;
&lt;/pre&gt;&lt;h2&gt;&lt;a name="sec7" id="sec7"&gt;&lt;/a&gt;Дополнительные функции и макросы&lt;/h2&gt;&lt;p class="first"&gt;Для работы с протоколами и типами данных определено некоторое количество вспомогательных функций, которые могут вам понадобиться:&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;strong&gt;&lt;code&gt;extends?&lt;/code&gt;&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;возвращает &lt;code&gt;true&lt;/code&gt; если данный тип данных (2-й аргумент) реализует интерфейс, заданный первым аргументом;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;extenders&lt;/code&gt;&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;возвращает коллекцию типов, реализующих заданный протокол;&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;&lt;code&gt;satisfies?&lt;/code&gt;&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;возвращает &lt;code&gt;true&lt;/code&gt; если данный протокол (1-й аргумент) применим к данному объекту (2-й аргумент);&lt;/dd&gt; &lt;/dl&gt;&lt;h2&gt;&lt;a name="sec8" id="sec8"&gt;&lt;/a&gt;Дополнительная информация&lt;/h2&gt;&lt;p class="first"&gt;Как всегда, основной источник информации &amp;mdash; сайт языка: ознакомьтесь с разделами &lt;a href="http://clojure.org/protocols"&gt;protocols&lt;/a&gt; и &lt;a href="http://clojure.org/datatypes"&gt;datatypes&lt;/a&gt;.  Хорошее описание протоколов и типов данных можно найти в 13-й главе недавно вышедшей книги &lt;a href="http://www.amazon.com/gp/product/1430272317?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430272317"&gt;Practical Clojure. The Definitive Guide&lt;/a&gt;, а также в &lt;a href="http://www.amazon.com/gp/product/1935182595?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1935182595"&gt;Clojure in Action&lt;/a&gt; и &lt;a href="http://www.amazon.com/gp/product/1935182641?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1935182641"&gt;The Joy of Clojure. Thinking the Clojure Way&lt;/a&gt;, которые будут выпущены в ближайшее время.&lt;/p&gt;&lt;p&gt;Stuart Halloway создал очень &lt;a href="http://vimeo.com/11236603"&gt;интересный скринкаст&lt;/a&gt; в котором он рассказывает о том, зачем были созданы протоколы и data types, и демонстрирует их применение на небольших примерах.&lt;/p&gt;&lt;p&gt;Введение новых возможностей в язык не обходится без статей в блогах.  Вот ссылки на некоторые интересные статьи на эту тему:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-clojure-protocols/index.html"&gt;Статья Stuart Sierra&lt;/a&gt; на IBM developerWorks;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.infoq.com/presentations/Clojure-Expression-Problem"&gt;Clojure's Solutions to the Expression Problem&lt;/a&gt; &amp;mdash; выступление Chris Houser на конференции Strange Loop 2010;&lt;/li&gt;
&lt;li&gt;Серия из 3-х статей (&lt;a href="http://www.objectcommando.com/blog/2010/03/26/clojure-protocols-part-1/"&gt;1&lt;/a&gt;, &lt;a href="http://www.objectcommando.com/blog/2010/03/29/clojure-protocols-part-2/"&gt;2&lt;/a&gt;, &lt;a href="http://www.objectcommando.com/blog/2010/04/12/clojure-protocols-part-3/"&gt;3&lt;/a&gt;) о протоколах в блоге Object Commando;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://freegeek.in/blog/2010/05/clojure-protocols-datatypes-a-sneak-peek/"&gt;Краткое введение&lt;/a&gt; в протоколы, написанное Baishampayan Ghose;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://formpluslogic.blogspot.com/2010/08/clojure-protocols-and-expression.html"&gt;Clojure Protocols and Expression Problem&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Два постинга от Sean Devlin &amp;mdash; &lt;a href="http://fulldisclojure.blogspot.com/2010/08/thoughts-on-protocols.html"&gt;Protocol Implementation Awesomeness&lt;/a&gt; и &lt;a href="http://fulldisclojure.blogspot.com/2010/08/partially-implemented-protocols.html"&gt;Partially Implemented Protocols&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.higher-order.net/2010/05/05/circuitbreaker-clojure-1-2/"&gt;Пример реализации паттерна &amp;quot;Circuit Breaker&amp;quot;&lt;/a&gt; с помощью протоколов;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kotka.de/blog/2010/03/memoize_done_right.html#protocols"&gt;Пример использования протоколов&lt;/a&gt; для мемоизации;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bestinclass.dk/index.clj/2010/04/prototurtle-the-tale-of-the-bleeding-turtle.html"&gt;Еще пример&lt;/a&gt; использования протоколов для реализации turtle graphics;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kirindave.tumblr.com/post/658770511/monkey-patching-gorilla-engineering-protocols-in"&gt;Небольшое сравнение&lt;/a&gt; Monkey Patching в Ruby с протоколами в Clojure;&lt;/li&gt;
&lt;li&gt;Пример реализации стека с помощью протоколов (&lt;a href="http://www.viksit.com/content/stack-implementation-clojure-using-protocols-and-records"&gt;1&lt;/a&gt;, &lt;a href="http://www.viksit.com/content/stack-implementation-clojure-ii-functional-approach"&gt;2&lt;/a&gt;), написанный Viksit Gaur;&lt;/li&gt;
&lt;/ul&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;hr&gt;&lt;p class="footnote"&gt;&lt;a class="footnum" name="fn.1" href="#fnr.1"&gt;1.&lt;/a&gt; Стоит однако отметить, что протоколы не реализуют monkey patching и внедрение методов&lt;br /&gt;
(injection) в существующие типы данных.&lt;/p&gt;&lt;br /&gt;
&lt;p class="footnote"&gt;&lt;a class="footnum" name="fn.2" href="#fnr.2"&gt;2.&lt;/a&gt; Возможность реализации абстракций на Clojure и высокая скорость работы протоколов&lt;br /&gt;
позволит в будущем написать Clojure на самой Clojure, без использования исходного кода&lt;br /&gt;
на Java.&lt;/p&gt;&lt;br /&gt;
&lt;p class="footnote"&gt;&lt;a class="footnum" name="fn.3" href="#fnr.3"&gt;3.&lt;/a&gt; Люди знакомые с Haskell могут рассматривать протоколы как некоторое подобие типов&lt;br /&gt;
классов (typeclasses) в этом языке, правда при этом нельзя определять реализации по&lt;br /&gt;
умолчанию для методов.&lt;/p&gt;&lt;br /&gt;
&lt;p class="footnote"&gt;&lt;a class="footnum" name="fn.4" href="#fnr.4"&gt;4.&lt;/a&gt; Но &lt;code&gt;extend&lt;/code&gt; может использоваться в тех случаях, когда вы хотите использовать одни и те&lt;br /&gt;
же реализации для разных типов данных &amp;mdash; в этом случае, вы можете создать отображение&lt;br /&gt;
с нужными функциями, и использовать его для разных типов, например, как описано в&lt;br /&gt;
&lt;a href="http://fulldisclojure.blogspot.com/2010/08/thoughts-on-protocols.html"&gt;следующем блог-постинге&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-2175626746263785720?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/UvTKUHWWc28" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/2175626746263785720/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=2175626746263785720" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/2175626746263785720?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/2175626746263785720?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/UvTKUHWWc28/clojure.html" title="Типы и протоколы в Clojure" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/02/clojure.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEBQ3k7fip7ImA9Wx9VFk4.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-716138085036106177</id><published>2011-02-01T21:40:00.001+01:00</published><updated>2011-02-02T08:44:12.706+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-02T08:44:12.706+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="haskell" /><category scheme="http://www.blogger.com/atom/ns#" term="emacs" /><title>Добавления в haskell-mode</title><content type="html">На новогодних каникулах сделал давно запланированное добавление к haskell-mode - добавил поддержку для &lt;a href="http://community.haskell.org/%7Endm/hlint/"&gt;hlint&lt;/a&gt; (команда &lt;b style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hs-lint&lt;/b&gt;) и &lt;a href="http://projects.haskell.org/style-scanner/"&gt;haskell style scanner&lt;/a&gt; (команда &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;hs-scan&lt;/span&gt;&lt;/b&gt;). Как и в предыдущей реализации, hs-lint поддерживает замену кода на предлагаемый вариант.&lt;br /&gt;
Патчи отправлены мейнтейнеру, но пока они не закоммиченны в основной репозиторий, эти изменения доступны в &lt;a href="https://patch-tag.com/r/alexott/haskell-mode/home"&gt;моем форке&lt;/a&gt;. Замечания и пожелания приветствуются...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-716138085036106177?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/X3qVAbPFOgQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/716138085036106177/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=716138085036106177" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/716138085036106177?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/716138085036106177?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/X3qVAbPFOgQ/haskell-mode.html" title="Добавления в haskell-mode" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2011/02/haskell-mode.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QCQHk8eSp7ImA9Wx9QF0Q.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-7548692255658748782</id><published>2010-12-30T17:52:00.003+01:00</published><updated>2010-12-31T13:42:41.771+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-31T13:42:41.771+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><title>Итоги года...</title><content type="html">Год получился интересным, было много интересных проектов, как на работе, так и вне ее.&lt;br /&gt;
Продолжал "развлекаться" с Clojure, что в итоге вылилось в написание &lt;a href="http://alexott.net/ru/clojure/clojure-intro/index.html"&gt;большой статьи&lt;/a&gt; для журнала "Практика функционального программирования", докладах на &lt;a href="http://www.slideshare.net/alexott/clojure-margincon-2010"&gt;MarginCon 2010&lt;/a&gt; и на встрече Munster Java User Group, а также в подкасте у golodnyj (&lt;a href="http://taop.rpod.ru/168440.html"&gt;1&lt;/a&gt;, &lt;a href="http://taop.rpod.ru/172639.html"&gt;2&lt;/a&gt;). Ну и конечно, не обошлось без писания кода для разных проектов (Incanter, leiningen, swank-clojure, clojure-hadoop, и еще паре своих). Правда немного подзабросил Common Lisp и Scheme, но с первым я поработаю во время чтения недавно купленной "&lt;a href="http://www.amazon.com/gp/product/1558601910?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1558601910"&gt;Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp&lt;/a&gt;".&lt;br /&gt;
Очень много &lt;a href="http://alexott-ru.blogspot.com/search/label/book"&gt;читал&lt;/a&gt; (соответствующая &lt;a href="http://www.shelfari.com/alexott/lists/IsRead"&gt;полка на shelfari&lt;/a&gt;, правда список на прочитать &lt;a href="http://www.shelfari.com/alexott/lists/Reading"&gt;еще больше&lt;/a&gt;), не в последнюю очередь благодаря покупке iPad, и приобретению электронных книг (много у Manning).&lt;br /&gt;
Первый раз был в США (по работе) - была очень полезная поездка. Теперь в планах поездки уже не по работе, хочется вживую познакомиться с френдами на обоих побережьях США...&lt;br /&gt;
На следующий год очень много планов:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;хочу немного увеличить количество Haskell и Erlang в своих проектах, и может быть посмотреть на Scala, если останется время;&lt;/li&gt;
&lt;li&gt;продолжить заниматься machine learning, кроме того, есть несколько задумок в части natural language processing;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;продолжу занятия с hadoop, и т.п. вещами, связанными с обработкой больших объемов данных;&lt;/li&gt;
&lt;li&gt;обновить существующие статьи по программированию и Emacs, и может быть написать что-то новое для ПФП;&lt;/li&gt;
&lt;li&gt;продолжить хакать Emacs, особенно в части CEDET для функциональных языков.&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;И пользуясь случаем, хочу поздравить всех своих читателей с наступающим новым годом, и пусть у вас будет много интересных вещей в новом году, и вообще все хорошо в жизни :-)&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Update&lt;/i&gt;: Забыл написать, что в следующем году (марте скорее всего) будет официально издан перевод отличной книжки - Types and Programming Languages. Перевод закончен полностью, и сейчас только ведется работа над версткой&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-7548692255658748782?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/iTNQDK8p4X8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/7548692255658748782/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=7548692255658748782" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/7548692255658748782?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/7548692255658748782?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/iTNQDK8p4X8/blog-post_30.html" title="Итоги года..." /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/12/blog-post_30.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cBSX87eip7ImA9Wx9RGU8.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-9006037887530232362</id><published>2010-12-21T11:57:00.000+01:00</published><updated>2010-12-21T11:57:38.102+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-21T11:57:38.102+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="emacs" /><title>Переехал на el-get</title><content type="html">Я достаточно долгое время таскал с собой все используемые пакеты для Емакса, вместе с конфигурационными файлами - это позволяло мне иметь везде одинаковую рабочую среду. Большая часть используемых пакетов бралась прямо из репозиториев и регулярно обновлялась с помощью набор шельных скриптов.&lt;br /&gt;
Но некоторое время назад я наткнулся на проект &lt;a href="https://github.com/dimitri/el-get"&gt;el-get&lt;/a&gt;, который берет на себя вопросы скачивания и обновления пакетов, и делает это прямо из емакса. Основное удобство заключается в том, что в составе el-get имеется большое количество готовых конфигурационных файлов (рецептов) для самых разных пакетов, и вы можете сразу использовать их в своей конфигурации.&lt;br /&gt;
Использование el-get очень просто - вы определяет список пакетов, которые вы хотите использовать, а затем вызываете функцию &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(el-get)&lt;/span&gt;, которая выкачивает пакет, компилирует его в соответствии с инструкциями, и загружает нужные части, так что пакет становится доступным для использования.&amp;nbsp; Подробности использования можно найти в описании проекта.&lt;br /&gt;
Неделю назад я наконец-то собрался с духом, и перевел свою &lt;a href="https://github.com/alexott/emacs-configs"&gt;рабочую конфигурацию&lt;/a&gt; на el-get (я пока использую &lt;a href="https://github.com/alexott/el-get"&gt;свой форк проекта&lt;/a&gt;, хотя многие из рецептов уже внесены в основной проект), пришлось правда добавить рецептов которых еще не было в репозитории, и немного повозиться со сборкой на Mac OS X. Но в остальном - все работает нормально.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-9006037887530232362?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/fgv4fBqbZDk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/9006037887530232362/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=9006037887530232362" title="Комментарии: 17" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/9006037887530232362?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/9006037887530232362?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/fgv4fBqbZDk/el-get.html" title="Переехал на el-get" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>17</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/12/el-get.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAMSXw7eSp7ImA9Wx9SGEw.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-8616335971042458285</id><published>2010-12-08T14:59:00.000+01:00</published><updated>2010-12-08T14:59:48.201+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-08T14:59:48.201+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><title>Следующие номера ПФП</title><content type="html">Редакция журнала "Практика функционального программирования" ищет авторов статей для следующих выпусков журнала.&lt;br /&gt;
Если вы хотите написать о применении ФП в своей работе, о новом языке программирования, о конкретном алгоритме, сделать перевод хорошей статьи, или написать еще о чем-то относящемся к ФП, то пришлите письмо на адрес &lt;a href="mailto:ie@fprog.ru"&gt;ie@fprog.ru&lt;/a&gt; с небольшим описанием того, о чем вы хотите написать&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-8616335971042458285?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/f-uG-x-dkLE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/8616335971042458285/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=8616335971042458285" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8616335971042458285?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8616335971042458285?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/f-uG-x-dkLE/blog-post.html" title="Следующие номера ПФП" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/12/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUHRXg4fSp7ImA9Wx9SGEU.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-2809485543366422976</id><published>2010-12-08T13:33:00.002+01:00</published><updated>2010-12-09T08:37:14.635+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-09T08:37:14.635+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="2010" /><category scheme="http://www.blogger.com/atom/ns#" term="opencl" /><category scheme="http://www.blogger.com/atom/ns#" term="gpu" /><category scheme="http://www.blogger.com/atom/ns#" term="cuda" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Дайджест прочитанных книг. Ноябрь 2010</title><content type="html">В ноябре оказалось слишком много работы, поэтому была прочитана только одна книжка на компьютерные темы.&lt;br /&gt;
&lt;h4&gt;Programming Massively Parallel Processors: A Hands-on Approach&lt;/h4&gt;&lt;div class="first"&gt;В рамках проверки некоторых гипотез решил ознакомиться с программированием для графических процессоров (GPU).  В общих чертах я знал как это делается, а для получения более подробной информации выбрал книжку &lt;a href="http://www.amazon.com/gp/product/0123814723?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0123814723"&gt;Programming Massively Parallel Processors: A Hands-on Approach&lt;/a&gt;, которая судя по обзорам должна была дать достаточно информации для начала работы с GPU.&lt;/div&gt;Первые две главы содержат введение в историю программирования на GPU, рассматривают их архитектуру, а также описывают разные подходы к параллельному программированию.&lt;br /&gt;
Начиная с третье главы начинается описание программирования с помощью CUDA, начиная со структуры программы.  Затем показывается простой пример умножения двух матриц, который будет улучшаться на протяжении всей книги.  И в заключение третьей главы, рассматриваются необходимые вопросы перемещения данных между основной памятью и GPU, а также то, как соотносятся ядерные функции и потоки выполнения GPU.&lt;br /&gt;
Четвертая глава полностью посвящена тому, как организовано выполнение кода в модели CUDA — как потоки выполнения выбираются для исполнения на процессоре, как они образуют блоки потоков, как обеспечить синхронизацию между потоками. В пятой главе рассматриваются все виды памяти доступной для программиста CUDA и описываются различные стратегии ее использования, с учетом влияния на производительность и т.п. вещи.&lt;br /&gt;
Шестая глава полностью посвящена вопросам оптимизации производительности программ — как обеспечить полную загрузку процессора и шины по которой данные передаются в память, как организовать предвосхищающую выборку данных, и т.д.  В седьмой главе внимание читателя обращается на выполнение операций с плавающей точкой, о том, как это влияет на точность вычислений и т.п. вопросам.&lt;br /&gt;
В 8-й и 9-й главах рассматриваются два проекта, которые используют вычисления на GPU.  Для каждого проекта рассматриваются архитектура программы, как организованы данные, что выносится в ядерную функцию и т.п.&lt;br /&gt;
Десятая глава более философская — в ней пытаются описать общие подходы к решению проблем и выбору алгоритмов для параллельных программ.&lt;br /&gt;
А 11-я глава посвящена небольшому описанию языка OpenCL, с указанием отличий его от CUDA.  Но описание слишком краткое, и лучше обратиться к официальной документации по &lt;a href="http://www.khronos.org/opencl/"&gt;OpenCL&lt;/a&gt;, хотя сама книга дает очень теоретическую хорошую базу.&lt;br /&gt;
&lt;i&gt;Заключение:&lt;/i&gt; Если вы хотите ознакомиться с основами "нормального (general purpose)" программирования на графических процессорах, то вы можете взять эту книгу.  В ней содержится общая информация об архитектуре, советы по дизайну эффективных программ, которые будут работать на этих процессорах (проиллюстрированные различными примерами), а также небольшое введение в OpenCL.  Кроме того, каждая глава книги содержит много ссылок на статьи и литературу, которые могут быть полезны в дальнейшей работе.   Для тех кто хочет подробней познакомиться с CUDA, советуют книгу &lt;a href="http://www.amazon.com/gp/product/0131387685?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0131387685"&gt;CUDA by Example: An Introduction to General-Purpose GPU Programming&lt;/a&gt; и/или официальную документацию.&lt;br /&gt;
&lt;h5&gt;Дальнейшая работа&lt;/h5&gt;Меня в первую очередь интересует &lt;a href="http://www.khronos.org/opencl/"&gt;OpenCL&lt;/a&gt;, поскольку имеется возможность его использования из других языков, а не быть привязанным к C. Например, имеется проект &lt;a href="https://github.com/ztellman/calx"&gt;Calx&lt;/a&gt;, который обеспечивает возможность запуска кода на OpenCL из программ на Clojure.  К тому же, OpenCL поддерживается не только NVidia. Я жду выхода в следующем году книг &lt;a href="http://www.manning.com/scarpino2/"&gt;OpenCL in Action&lt;/a&gt; (уже можно начинать читать купив MEAP) и &lt;a href="http://www.amazon.com/gp/product/0321749642?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0321749642"&gt;OpenCL Programming Guide&lt;/a&gt;, которая, судя по описанию, должна содержать достаточно много полезной информации.&lt;br /&gt;
Хорошим подспорьем также является то, что с &lt;a href="http://aws.typepad.com/aws/2010/11/new-ec2-instance-type-the-cluster-gpu-instance.html"&gt;недавнего времени&lt;/a&gt; вы можете запускать свой код использующий GPU в Amazon Elastic Cloud, что позволяет уменьшить расходы на покупку мощного оборудования.&lt;br /&gt;
&lt;h5&gt;Дополнительные ресурсы&lt;/h5&gt;В качестве полезных ресурсов могу указать на сайт &lt;a href="http://gpgpu.org/"&gt;GPGPU&lt;/a&gt; где регулярно публикуются статьи и анонсы про программирование GPU.  Например, для меня были интересны следующие статьи: &lt;a href="http://gpgpu.org/2010/07/04/gravity-antivirus-engine"&gt;GrAVity: A Massively Parallel Antivirus Engine&lt;/a&gt; и &lt;a href="http://gpgpu.org/2010/07/04/regular-expression-matching-for-intrusion-detection"&gt;Regular Expression Matching on Graphics Hardware for Intrusion Detection&lt;/a&gt;, поскольку они имеют некоторое отношение к тому, чем я занимаюсь.&lt;br /&gt;
Как минимум два курса по программированию GPU можно найти на iTunesU.  Кроме того, доступен &lt;a href="http://courses.engr.illinois.edu/ece498/al/Syllabus.html"&gt;следующий курс лекций&lt;/a&gt;.&lt;br /&gt;
И достаточно много документации и учебных материалов можно найти на сайте &lt;a href="http://developer.nvidia.com/object/gpucomputing.html"&gt;NVidia&lt;/a&gt; — как по CUDA, так и по OpenCL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-2809485543366422976?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/WLFvaL9XJ5c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/2809485543366422976/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=2809485543366422976" title="Комментарии: 10" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/2809485543366422976?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/2809485543366422976?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/WLFvaL9XJ5c/2010.html" title="Дайджест прочитанных книг. Ноябрь 2010" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>10</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/12/2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4GQXg4fSp7ImA9Wx9SE0w.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-615277640819994866</id><published>2010-12-02T20:25:00.000+01:00</published><updated>2010-12-02T20:25:20.635+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-02T20:25:20.635+01:00</app:edited><title>Интервью для проекта openquality</title><content type="html">На сайте проекта OpenQuality &lt;a href="http://experience.openquality.ru/alex-ott-interview/"&gt;выложили интервью со мной&lt;/a&gt;, обо всем понемножку - разработка ПО, функциональные языки, безопасность и т.д. Умудрился упомянуть про Emacs всего один раз ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-615277640819994866?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/k_IgMOkLr0A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/615277640819994866/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=615277640819994866" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/615277640819994866?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/615277640819994866?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/k_IgMOkLr0A/openquality.html" title="Интервью для проекта openquality" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/12/openquality.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ICQ3Y_fyp7ImA9Wx9SEU8.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-5442286371546857369</id><published>2010-11-30T13:52:00.000+01:00</published><updated>2010-11-30T13:52:42.847+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-30T13:52:42.847+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><title>6-й номер журнала "Практика функционального программирования"</title><content type="html">После долгого перерыва вышел новый номер журнала "Практика функционального программирования". В новом номере опубликованы интервью с Саймоном Пейтон Джонсом и Джо Армстронгом, а также несколько интересных статей.&lt;br /&gt;
Кроме того, выпущена бумажная версия журнала. Подробнее об этом, в &lt;a href="http://community.livejournal.com/fprog/17124.html"&gt;официальном анонсе&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-5442286371546857369?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/IX3T14dn0uI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/5442286371546857369/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=5442286371546857369" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/5442286371546857369?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/5442286371546857369?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/IX3T14dn0uI/6.html" title="6-й номер журнала &quot;Практика функционального программирования&quot;" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/11/6.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYHQHw6eSp7ImA9Wx5aFUg.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-5966920846837105134</id><published>2010-11-12T11:02:00.000+01:00</published><updated>2010-11-12T11:02:11.211+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-12T11:02:11.211+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="file formats" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="msoffice" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft" /><title>Рабочее/файл-форматное 2</title><content type="html">Как и было обещано, Microsoft &lt;a href="http://blogs.msdn.com/b/officeinteroperability/archive/2010/11/10/interoperability-videos-and-presentations.aspx"&gt;опубликовал видео&lt;/a&gt; сделанное на лекциях о форматах файлах, о которых я писал в &lt;a href="http://alexott-ru.blogspot.com/2010/11/blog-post.html"&gt;предыдущем посте&lt;/a&gt;. Тем, кто работает с офисными форматами файлов, будет интересно&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-5966920846837105134?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/AjkvC0w1Yto" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/5966920846837105134/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=5966920846837105134" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/5966920846837105134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/5966920846837105134?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/AjkvC0w1Yto/2.html" title="Рабочее/файл-форматное 2" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/11/2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8EQHo7fyp7ImA9Wx5bGEo.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-3656100888882265040</id><published>2010-11-04T14:36:00.000+01:00</published><updated>2010-11-04T14:36:41.407+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-04T14:36:41.407+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="file formats" /><category scheme="http://www.blogger.com/atom/ns#" term="work" /><category scheme="http://www.blogger.com/atom/ns#" term="msoffice" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft" /><title>Рабочее/файл-форматное</title><content type="html">Две недели назад я побывал на семинаре в Microsoft (в офисе в Редмонде) посвященном работе с файлами Microsoft Office.&amp;nbsp; Поскольку я давно общаюсь с соответствующими подразделениями Microsoft на темы работы с различными форматами файлов, то было очень интересно познакомиться как с людьми, которые готовят документацию по протоколам и форматам файлов, так и с самими разработчиками Microsoft Office.&lt;br /&gt;
Семинар длился два дня, в течении которых разработчики MS Office рассказывали про внутреннее устройство разных частей Office, и как они соотносятся с тем, что сохраняется в файлах. Кроме того, была возможность задать свои вопросы напрямую разработчикам и людям, отвественным за документацию.&lt;br /&gt;
Поскольку такой семинар &lt;a href="http://blogs.msdn.com/b/officeinteroperability/archive/2010/10/25/office-binary-file-format-plugfest-2010-recap.aspx"&gt;проводился впервые&lt;/a&gt;, то внешних разработчиков было не особо много (человек 15 из разных компаний), но было много представителей Microsoft, и обстановка была "рабочей", т.е. ответы на задаваемые вопросы получались практически сразу, что было очень полезно - можно было показать проблемные файлы, обсудить куски кода и т.п.&lt;br /&gt;
Channel9 должен вскоре опубликовать видео с прочитанными лекциями, и как только они появятся, я напишу дополнительно. Кроме того, был создан &lt;a href="http://blogs.msdn.com/b/officeinteroperability/"&gt;отдельный блог&lt;/a&gt;, в котором будут публиковаться анонсы о будущих семинарах, посвященных работе с файлами Microsoft Office, и сопуствующим тематикам. И я надеюсь, что в будущем такие семинары будут проводиться и в Европе - все-таки достаточно тяжело добираться в центральный офис MS...&lt;br /&gt;
P.S. хотелось бы отметить, что за последние два года &lt;a href="http://msdn.microsoft.com/en-us/library/cc203350.aspx"&gt;документация по форматам файлов и протоколам&lt;/a&gt; очень сильно улучшилась, что не может меня не радовать, поскольку уже устал заниматься reverse engineering...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-3656100888882265040?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/GikUeFO7Poo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/3656100888882265040/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=3656100888882265040" title="Комментарии: 6" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/3656100888882265040?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/3656100888882265040?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/GikUeFO7Poo/blog-post.html" title="Рабочее/файл-форматное" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/11/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEIBQXg5cSp7ImA9Wx5aGU0.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-8015989200472895791</id><published>2010-11-04T14:15:00.003+01:00</published><updated>2010-11-16T11:15:50.629+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-16T11:15:50.629+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="2010" /><category scheme="http://www.blogger.com/atom/ns#" term="version control" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="mapreduce" /><category scheme="http://www.blogger.com/atom/ns#" term="hadoop" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Дайджест прочитанных книг. Октябрь 2010</title><content type="html">&lt;h4&gt;Pro Git&lt;/h4&gt;&lt;div class="first"&gt;Так получилось, что я использую Git достаточно давно, с времен когда книг по нему еще не было, но тут наткнулся на &lt;a href="http://www.amazon.com/gp/product/1430218339?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430218339"&gt;эту книжку&lt;/a&gt; и решил ее прочитать на предмет обнаружения неизвестных тем.  Книга имеет &lt;a href="http://progit.org/"&gt;отдельный сайт&lt;/a&gt; где доступна полная версия книги в виде HTML (есть еще и версия в &lt;a href="http://progit.org/2010/05/17/progit-for-the-ipad.html"&gt;epub&lt;/a&gt;), а также имеется блог где попадаюются интересные заметки.  А исходники книги, вместе с примерами &lt;a href="https://github.com/progit"&gt;доступны на github&lt;/a&gt;.&lt;/div&gt;Книга начинается с краткого обзора Git, зачем он был создан, истории и т.п. вещей.  Есть небольшой раздел посвященный установке и первоначальной настройке Git.&lt;br /&gt;
Во второй главе повествование переходит к использованию Git, начиная с простейших вещей, типа внесения (commit) изменений, просмотра истории изменений, отмене изменений и т.п. вещам.  Также даются необходимые сведения по работе с удаленными (remote) репозиториями.  Третья глава полностью сосредоточена на вопросах, связанных с созданием веток (branching), начиная с простых команд для создания веток и переключения между ними, и заканчивая достаточно подробным описанием использования rebase.  Отдельный раздел посвящен возможным схемам разработки используя несколько веток.&lt;br /&gt;
4-я глава посвящена вопросам создания удаленного репозитория Git, включая рассмотрение доступных протоколов, предоставление публичного доступа к серверу, а также рассматриваются различные утилиты, предназначенные для упрощения создания разделяемых репозиториев, таких как Gitosis, Gitolite и т.д.  А 5-я глава посвящена вопросам использования Git для коллективной разработки, начиная с рассмотрения различных подходов к организации разработки (доступ к общему репозиторию, выделение отдельной роли интегратора изменений, и т.п.), и рассматривая отдельно роли контрибьютора и мейнтенера проекта.&lt;br /&gt;
В 6-й главе рассматриваются различные "нестандартные" вопросы использования Git, которые реже встречаются в работе — использование внешних модулей в репозитории, слияние под-деревьев, переписывание истории изменений и т.п.  7-я глава достаточно подробно рассматривает вопросы настройки Git, включая создание хуков.  А 8-я глава посвящена вопросам интеграции Git и SVN, а также вопросам миграции на Git с других систем контроля версий.&lt;br /&gt;
И заканчивается книга главой о внутреннем устройстве Git, как хранятся объекты и прочая информация, как эта информация передается используя различные протоколы и т.д.&lt;br /&gt;
&lt;i&gt;Заключение:&lt;/i&gt; хорошее введение в Git, рекомендуется для тех, кто собирается начать использовать Git.   А те, кто уже работает с Git тоже могут найти что-то интересное в книге, например, описание утилит для организации репозиториев, или другую полезную информацию.&lt;br /&gt;
&lt;h4&gt;&lt;a name="mapreduce"&gt;&lt;/a&gt;Data-Intensive Text Processing with MapReduce&lt;/h4&gt;&lt;div class="first"&gt;В свободное время (а иногда и на работе) я развлекаю себя различными задачами для решения которых нужно обрабатывать большие объемы данных.  В качестве платформы был выбран Hadoop, и задачки пишутся с использованием &lt;a href="https://github.com/alexott/clojure-hadoop"&gt;clojure-hadoop&lt;/a&gt; и других утилит.&lt;/div&gt;Я &lt;a href="http://alexott-ru.blogspot.com/2010/07/blog-post.html"&gt;уже писал&lt;/a&gt; про книгу "Hadoop: The Definitive Guide" (кстати, сейчас вышло &lt;a href="http://www.amazon.com/gp/product/1449389732?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1449389732"&gt;второе издание&lt;/a&gt;, которое было обновлено описанием свежих версий Hadoop), но в отличии от этой книги, книга &lt;a href="http://www.amazon.com/gp/product/1608453421?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1608453421"&gt;Data-Intensive Text Processing with MapReduce&lt;/a&gt; не описывает детали программирования для Hadoop или какой-то другой системы основанной на принципах Map/Reduce, а посвящена вопросам проектирования алгоритмов которые будут выполняться в таких системах.  В книге также рассматриваются реализации известных алгоритмов, таких как создание инвертированных индексов для поиска, адаптированных для параллельной обработки данных.  У данной книги есть &lt;a href="http://mapreduce.me/"&gt;отдельный сайт&lt;/a&gt;, где вы можете найти дополнительную информацию, а также свободно скачать бета-версию книги.  Кроме того, для экспериментов с алгоритмами, описанными в книге, авторы создали библиотеку &lt;a href="http://www.umiacs.umd.edu/%7Ejimmylin/Cloud9/docs/index.html"&gt;Cloud9&lt;/a&gt;, которую вы можете использовать в своей работе.&lt;br /&gt;
Книга начинается (глава 1) с небольшого описания основных концепций Map/Reduce, как задания выполняются в фреймворке, как происходит разделение задач между mappers &amp;amp; reducers.  Кроме того, приводится небольшое описание основных подсистем Hadoop, чтобы читателю было понятно как происходит распределение заданий, хранение обрабатываемых данных и т.п. вещи.&lt;br /&gt;
Вторая глава рассматривает различные подходы к реализации алгоритмов для Map/Reduce, начиная с наивных реализаций, и затем рассматривая вопросы оптимизации алгоритмов (например, путем объединения результатов прямо в mapper, или использования дополнительных combiners),  сортировку результатов, объединение результатов (joins), и т.д.&lt;br /&gt;
Глава 3 показывает как можно в рамках Map/Reduce реализовать генерацию инвертированного индекса, который используется при поиске по документам.  Сначала приводится наивная реализация генерации индекса, которая оптимизуется в следующих главах, вводя возможность сжатия индекса и т.п. вещи.&lt;br /&gt;
4-я глава полностью посвящена реализации алгоритмов на графах в рамках Map/Reduce.  В качестве первого примера рассматривается поиск кратчайших путей в графе, и показана реализация для этой задачи, вместе с описанием недостатков, присущих параллельной реализации.  А в качестве второго примера используется вычисление &lt;a href="http://en.wikipedia.org/wiki/PageRank"&gt;PageRank&lt;/a&gt; для набора страниц.  И в последнем разделе этой главы рассматриваются проблемы, которые возникают при обработке графов при помощи Map/Reduce и даются ссылки на дополнительную литературу.&lt;br /&gt;
В 5-й главе рассматривается использование Map/Reduce для решения задач machine learning на примере одного из класса алгоритмов — expectation maximization.  В первом разделе главы описываются сами алгоритмы expectation maximization, а в следующих разделах описывается hidden markov models как класса задач, к которому применимы алгоритмы expectation maximization, и затем показывается реализация expectation maximization на базе Map/Reduce.&lt;br /&gt;
И в заключении авторы вкратце рассматривают недостатки парадигмы Map/Reduce и рассматривают альтернативные подходы к масштабным вычислениям.&lt;br /&gt;
&lt;i&gt;Заключение:&lt;/i&gt; Если вы программируете для Hadoop или другой системы Map/Reduce (включая самописные), то книжку читать обязательно — в ней достаточно много советов по "правильной" организации обработки данных.  Кроме этого, в конце книги имеется внушительная библиография, которая может послужить отличным источником дополнительной информации по соответствующим темам.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-8015989200472895791?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/BZmeUM2QKro" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/8015989200472895791/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=8015989200472895791" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8015989200472895791?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8015989200472895791?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/BZmeUM2QKro/2010.html" title="Дайджест прочитанных книг. Октябрь 2010" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/11/2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IDQH8_eCp7ImA9Wx5VFEg.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-8275299012298254251</id><published>2010-10-07T14:52:00.000+01:00</published><updated>2010-10-07T14:52:51.140+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-07T14:52:51.140+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="algorithms" /><category scheme="http://www.blogger.com/atom/ns#" term="lucene" /><category scheme="http://www.blogger.com/atom/ns#" term="2010" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><category scheme="http://www.blogger.com/atom/ns#" term="cs" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Дайджест прочитанных книг. Сентябрь 2010</title><content type="html">&lt;p&gt;Мне пришла в голову идея, что было бы полезно делиться достаточно подробными впечатлениями о прочитанных книгах.  Хотя я и пользуюсь &lt;a href="http://www.goodreads.com/user/show/635213"&gt;GoodReads&lt;/a&gt; и &lt;a href="http://www.shelfari.com/alexott"&gt;Shelfari&lt;/a&gt;, но обзоры там делаю на английском и достаточно краткие.  В качестве периода между обзорами выбран месяц, что дает мне возможность прочитать 2-4 книги, про которые стоило бы рассказать :-)&lt;/p&gt;&lt;hr&gt;&lt;h4&gt;The Joy of Clojure: Thinking the Clojure Way&lt;/h4&gt;&lt;p class="first"&gt;Я купил &lt;a href="http://www.amazon.com/gp/product/1935182641?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1935182641"&gt;The Joy of Clojure: Thinking the Clojure Way&lt;/a&gt; (авторы Michael Fogus и Chris Houser) почти сразу после того, как она появилась на сайте Manning, и регулярно получал обновления для него.  Но примерно месяц назад пришла полная версия книги (но без окончательной вычитки редактором и красивой верстки), и я сел за ее чтение в полном объеме.  У этой книги имеется &lt;a href="http://joyofclojure.com/"&gt;отдельный сайт&lt;/a&gt; на котором можно найти дополнительную информацию о книге, включая информацию о существующих скидках на предварительную версию (MEAP).&lt;/p&gt;&lt;p&gt;Хочется сразу отметить, что это не учебник по языку Clojure, и хотя в книге имеется отдельная глава с кратким (около 30 страниц) описанием основ языка, но все равно, для начала стоит прочитать одну из существующих книг: &lt;a href="http://www.amazon.com/gp/product/1430272317?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1430272317"&gt;Practical Clojure&lt;/a&gt; или&lt;br /&gt;
&lt;a href="http://www.amazon.com/gp/product/1934356336?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1934356336"&gt;Programming Clojure&lt;/a&gt;, или еще не выпущенную, но уже доступную через MEAP,&lt;br /&gt;
&lt;a href="http://www.manning.com/rathore/"&gt;Clojure in Action&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Книга пытается рассказать о том, как &amp;quot;более правильно&amp;quot; программировать на Clojure с точки зрения стиля языка и функционального программирования, как лучше организовывать программы на Clojure.  Сюда относятся использование &amp;quot;ленивых&amp;quot; структур данных, когда нужно и можно использовать макросы, как организовывать рекурсивное выполнение, как организованы различные структуры данных, когда их нужно и можно использовать, и т.п.&lt;/p&gt;&lt;p&gt;Также достаточно много места уделено вопросам производительности программ на Clojure &amp;mdash; какие структуры данных лучше использовать в различных ситуациях, как можно улучшить производительность с помощью type hinting, использования &amp;quot;переходных&amp;quot; структур данных, &amp;quot;блочных&amp;quot; последовательностей и мемоизации.&lt;/p&gt;&lt;p&gt;Не обойден стороной и вопрос конкуррентного программирования на Clojure, и использование изменяемых данных в программах.  Обсуждению этих вопросов посвящена 11-я глава книги, в которой обсуждается устройство изменяемых структур (refs/atoms/agents), когда их можно и нужно использовать, а также рассказывается про параллельное программирование на Clojure (futures, promises, локи и т.п.).&lt;/p&gt;&lt;p&gt;Кроме того, книга касается вопросов использования мультиметодов, протоколов и типов данных, введенных в Clojure 1.2, а также вопросов интеграции с JVM и Java.  Но эти темы рассматриваются не настолько подробно, как остальные.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Вердикт&lt;/em&gt;: эту книжку рекомендуется прочитать всем, кто уже познакомился с языком, но хочет изучить некоторые темы более подробно и/или хочет научиться &amp;quot;более правильно&amp;quot; программировать на этом языке.  Я лично нашел достаточно много интересного материала, который начал применять в своих проектах.&lt;/p&gt;&lt;h4&gt;Lucene in Action, 2-е издание&lt;/h4&gt;&lt;p class="first"&gt;Я давно собирался посмотреть на &lt;a href="http://lucene.apache.org/"&gt;Lucene&lt;/a&gt; для своих проектов, слышал про книгу Lucene in Action, но было много жалоб на то, что эта книга уже устарела и неприменима для свежих версий Lucene.  Недавно вышедшее второе издание &lt;a href="http://www.amazon.com/gp/product/1933988177?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1933988177"&gt;Lucene in Action&lt;/a&gt; исправляет эту проблему.&lt;/p&gt;&lt;p&gt;Начинается книга (глава 1) с небольшого обзора Lucene и из чего она состоит, описываются основные этапы в жизненном цикле поиска &amp;mdash; сбор документов, выделение информации, индексация, и сам поиск.  Кроме того, в 1-й главе приведены небольшие, но законченные примеры того, как можно выполнять индексацию документов и затем использовать полученный индекс для поиска.&lt;/p&gt;&lt;p&gt;Первая часть книги (главы 2-6) посвящены подробному описанию того, как Lucene устроена, и как можно использовать ее возможности в приложениях.  Глава 2 полностью посвящена вопросам индексации с описанием того, какие есть опции индексации, как они влияют на работу Lucene, включая производительность, как можно производить индексацию численных и временных (temporal) данных, как можно оптимизовывать и отлаживать процесс индексации.&lt;/p&gt;&lt;p&gt;Глава 3 описывает использование основных поисковых возможностей Lucene.  Глава начинается с простого приложения, которое используется в качестве основы для остальных примеров. Сначала рассматривается использование &lt;code&gt;IndexSearch&lt;/code&gt;, который используется для выполнения поиска, а затем уже рассматриваются основные виды запросов, реализованных в Lucene, и &lt;code&gt;QueryParser&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Главы с 4-й по 6-ю посвящены &amp;quot;расширенным&amp;quot; темам, их можно пропустить при первом прочтении, если вам нужны только стандартные возможности Lucene.  В 4-й главе описываются различные анализаторы текста, реализованные в Lucene и Nutch, а также показывается как можно реализовать новые анализаторы и/или расширять существующие.  5-я глава посвящена дополнительным возможностям поиска &amp;mdash; запросам по нескольким полям и/или индексам, использовании векторов терминов (term vectors), сортировке результатов и т.п.  А в 6-й главе рассказывается о том, как можно расширить возможности поиска путем реализации собственных методов сортировки, фильтров и &amp;quot;сборщиков&amp;quot; (collectors) документов.&lt;/p&gt;&lt;p&gt;Вторая часть книги (главы 7-11) рассказывает о том, как можно выделять текст с помощью библиотеки &lt;a href="http://tika.apache.org/"&gt;Tika&lt;/a&gt; (глава 7), какие существуют расширения для Lucene (главы 8-9), как можно использовать Lucene с языками, отличными от Java (глава 10), а 11-я глава рассматривает вопросы администрирования Lucene, и настройки производительности.&lt;/p&gt;&lt;p&gt;Третья часть книги полностью посвящена рассмотрению того, как Lucene применяется в реальных проектах (Kruge, SIREn, LinkedIn) и рассказывается про то, какие возможности Lucene они используют, как организован процесс индексации и поиска, какие расширения были добавлены для работы, и т.д.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Вердикт&lt;/em&gt;: Большое количество примеров и подробное описание как делают эту книгу очень привлекательной для людей, которые начинают использовать Lucene.  После ее прочтения, можно возвращаться к ней для получения ответов на вопросы, которые не описываются в официальной документации.&lt;/p&gt;&lt;h4&gt;Introduction to Algorithms&lt;/h4&gt;&lt;p class="first"&gt;Эту книгу я уже читал много лет назад, в русском переводе (на русском она называется &lt;a href="http://www.ozon.ru/context/detail/id/2429691/?partner=alexott"&gt;Алгоритмы. Построение и анализ&lt;/a&gt;), но некоторое время назад мне захотелось обновить теоретические основы, и поэтому я решил перечитать эту книгу.  В руки мне попало 2-е издание, а спустя буквально месяц вышло уже третье издание &lt;a href="http://www.amazon.com/gp/product/0262033844?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0262033844"&gt;Introduction to Algorithms&lt;/a&gt;, и я немного жалею, что не дождался его, поскольку там есть некоторые полезные темы.&lt;/p&gt;&lt;p&gt;Я не могу много написать об этой книге, иначе это будет ее пересказ :-) Лучше всего о ней говорит &lt;a href="http://mitpress.mit.edu/catalog/item/default.asp?ttype=2&amp;amp;tid=11866&amp;amp;mode=toc"&gt;оглавление этой книги&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Это классический учебник по алгоритмам и подходам к их анализу.  Книга начинается с основ анализа алгоритмов, и затем переходит к рассмотрению различных алгоритмов и структур данных (списки, деревья, хеш-таблицы, кучи и т.д.).  Для каждой из рассматриваемых тем приводится анализ сложности алгоритма, рассматриваются возможные варианты реализации структур данных и т.п.  Достаточно много места посвящено алгоритмам над графами.  Кроме базовых структур данных и алгоритмов, в книге рассматриваются некоторые &amp;quot;сложные&amp;quot; темы &amp;mdash; биноминальные кучи, b-trees и т.п.  Почти сотню страниц книги занимают приложения, в которых описывается весь математический аппарат, необходимый для чтения этой книги &amp;mdash;&lt;br /&gt;
теория множеств, основы теории вероятностей, и т.п.&lt;/p&gt;&lt;p&gt;Стоит также отметить, что на английском языке доступны &lt;a href="http://videolectures.net/mit6046jf05_introduction_algorithms/"&gt;видео-записи лекций&lt;/a&gt; по данному курсу которые читались в MIT (они также доступны через iTunesU).&lt;/p&gt;&lt;p&gt;&lt;em&gt;Вердикт&lt;/em&gt;: всем программистам читать обязательно, можно использовать как справочник, но первые главы нужно прочитать обязательно.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2145365503775784580-8275299012298254251?l=alexott-ru.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/belLR8cRfhw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/8275299012298254251/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=8275299012298254251" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8275299012298254251?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8275299012298254251?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/belLR8cRfhw/2010.html" title="Дайджест прочитанных книг. Сентябрь 2010" /><author><name>Alex Ott</name><uri>http://www.blogger.com/profile/13001951608173211050</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="25" height="32" src="http://2.bp.blogspot.com/_gSOdG3mSC3I/SVnwBuQg7_I/AAAAAAAAEdo/K3SNWhTN_Ic/S220/avatar2.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2010/10/2010.html</feedburner:origLink></entry></feed>

