<?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:blogger="http://schemas.google.com/blogger/2008" 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;DEIFRXY_cSp7ImA9WhBXFEs.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580</id><updated>2013-03-28T11:28:34.849+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="conference" /><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="java" /><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>351</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;DUUFRncyfSp7ImA9WhNUGEQ.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-565993793918682080</id><published>2013-01-11T09:40:00.001+01:00</published><updated>2013-01-11T10:40:17.995+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-11T10:40:17.995+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><category scheme="http://www.blogger.com/atom/ns#" term="book" /><title>Готовится перевод "Clojure Programming"</title><content type="html">Издательство "ДМК-Пресс" продолжает серию переводов книг про новые языки программирования, и следующая вещь в списке - "Clojure Programming". Перевод уже начался, и они ищут людей которые помогут с технической вычиткой перевода.&amp;nbsp; Если кому-то интересно, то пишите на dm at dmk-press.ru.&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/iUPrFymQI9g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/565993793918682080/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=565993793918682080" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/565993793918682080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/565993793918682080?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/iUPrFymQI9g/clojure-programming.html" title="Готовится перевод &quot;Clojure Programming&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/2013/01/clojure-programming.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkABQXo7cCp7ImA9WhNXGEs.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-989216802143750994</id><published>2012-12-03T20:21:00.000+01:00</published><updated>2012-12-07T08:19:10.408+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-07T08:19:10.408+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">Я регулярно общаюсь с издательством ДМК-Пресс, которое в последнее время занимается изданием переводов книг по функциональному программированию и языкам ФП.
В данный момент они занимаются переводом "Scala for Impatient" и им нужны люди которые бы могли сделать техническую вычитку. Если кому интересно, то напишите Дмитрию Мовчану на dm at dmk-press.ru - я сам не знаю как это дело будет организовано...&lt;/br&gt;
Они также заинтересованы в издании перевода Practical Common Lisp, который находится в подвешенном состоянии уже давно (надо доперевести 1.5 главы и пройтись по тексту, вычитывая).  Издательство приобрело права на издание книги в России, и обещает напечатать книгу по себестоимости. Если кто может принять участие в этом проекте, напишите мне, я выдам .git-репозиторий с текстом в формате LaTeX (или залить это дело на github?). У меня честно говоря совсем нет свободного времени довести PCL до ума.
&lt;br/&gt;&lt;/br&gt;
Update: PCL &lt;a href="https://github.com/pcl-ru/pcl-ru"&gt;залит на github&lt;/a&gt;, кто хочет поучавствовать - присылайте свои login names, я добавлю к проекту. Координация и обсуждения происходят в &lt;a href="https://groups.google.com/forum/?hl=ru&amp;fromgroups#!forum/pcl-ru"&gt;списке рассылки&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/ccikJJAC-Dg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/989216802143750994/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=989216802143750994" title="Комментарии: 17" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/989216802143750994?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/989216802143750994?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/ccikJJAC-Dg/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>17</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2012/12/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQMQ3o-fSp7ImA9WhNSFk8.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-495851551468565049</id><published>2012-10-30T19:11:00.001+01:00</published><updated>2012-10-30T19:39:42.455+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-30T19:39:42.455+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="c++" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="emacs" /><category scheme="http://www.blogger.com/atom/ns#" term="article" /><category scheme="http://www.blogger.com/atom/ns#" term="cedet" /><title>Новая версия статьи про CEDET</title><content type="html">Только что залил на сайт новую версию своей &lt;a href="http://alexott.net/ru/writings/emacs-devenv/EmacsCedet.html"&gt;статьи про настройку CEDET&lt;/a&gt;. Я также оставил доступной &lt;a href="http://alexott.net/ru/writings/emacs-devenv/EmacsCedetOld.html"&gt;старую версию статьи&lt;/a&gt;, но в виде отдельной страницы.&lt;br /&gt;
Новая версия описывает новую схему расположения исходного кода, а также новый способ активации под-режимов, так что статья теперь применима и к версии из bzr, и к версии идущей в составе GNU Emacs (после того как выпустят новую его версию).&lt;br /&gt;
Кроме того, я добавил небольшое описание того, как настроить связку CEDET + Java, а также небольшое описание настройки дополнений через auto-complete.&lt;br /&gt;
&lt;br /&gt;
Вместо моего конфига, который очень уж сильно замусорен, теперь лучше воспользоваться &lt;a href="https://gist.github.com/3930120"&gt;отдельным конфигом&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
P.S. кстати, в последних снапшотах, CEDET умеет находить проекты Maven, и получать информацию о classpath прямо из них, так что теперь работает и дополнение имен для классов из сторонних библиотек.&amp;nbsp; Например, вот так (Это дополнение при работе с кодом Apache Tika):&lt;br /&gt;
&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://picasaweb.google.com/lh/photo/tFFmyk0aLM8ApIUjHRoBptMTjNZETYmyPJy0liipFm0?feat=embedwebsite"&gt;&lt;img src="https://lh5.googleusercontent.com/-lAuMwu9biXk/UIaGuAY2MeI/AAAAAAAAJ80/i3NUpqC3x4U/s400/OutlookExtractor.java_002.png" height="268" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;br /&gt;&lt;br /&gt;
P.P.S. If you found error, or typo - please write comment on page, or fork &lt;a href="https://github.com/alexott/alexott.github.com"&gt;source code on github&lt;/a&gt; (it's enough to fix only .muse file), and create pull request :-)&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/fCnoDM6VmQc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/495851551468565049/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=495851551468565049" title="Комментарии: 26" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/495851551468565049?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/495851551468565049?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/fCnoDM6VmQc/cedet.html" title="Новая версия статьи про CEDET" /><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><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh5.googleusercontent.com/-lAuMwu9biXk/UIaGuAY2MeI/AAAAAAAAJ80/i3NUpqC3x4U/s72-c/OutlookExtractor.java_002.png" height="72" width="72" /><thr:total>26</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2012/10/cedet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMHSHY7eSp7ImA9WhJbFko.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-9038843391490053436</id><published>2012-09-25T16:24:00.000+01:00</published><updated>2012-09-26T16:13:59.801+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-09-26T16:13:59.801+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="presentations" /><category scheme="http://www.blogger.com/atom/ns#" term="fp" /><category scheme="http://www.blogger.com/atom/ns#" term="conference" /><category scheme="http://www.blogger.com/atom/ns#" term="clojure" /><title>Выступление про Clojure на ITSea 2012</title><content type="html">На прошлой неделе я рассказывал про Clojure на небольшой конференции ITSea (совмещенной с купанием в море и т.п. :-), и затем еще давал небольшой мастер-класс на тему практического использования Clojure. Слайды &lt;a href="http://www.slideshare.net/alexott/clojure-lisp-for-the-modern-world"&gt;доступны на slideshare&lt;/a&gt; (а вот записи выступления к сожалению не было):&lt;br /&gt;
&lt;iframe src="http://www.slideshare.net/alexott/slideshelf" width="490px" height="470px" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:none;" allowfullscreen&gt;&lt;/iframe&gt;
Данный постинг является дополнением к этим слайдам, и содержит ссылки на разные ресурсы, упоминавшиеся в рассказе:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://clojure.org/"&gt;Сайт языка&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://alexott.net/ru/fp/books/"&gt;Список доступных книг про Clojure&lt;/a&gt; (разделы про конкретные языки в обзоре литературы по ФП)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://alexott.net/ru/clojure/clojure-intro/index.html"&gt;Введение в Clojure на русском языке &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://alexott.net/ru/clojure/video.html"&gt;Список видео-лекций и презентаций про Clojure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://planet.clojure.in/"&gt;Planet Clojure&lt;/a&gt; - аггрегатор блогов&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.clojure.org/display/doc/Getting+Started"&gt;Getting started with Clojure&lt;/a&gt; - описание первых шагов, включая установку и настройку средств разработки &lt;/li&gt;
&lt;li&gt;Интерактивные ресурсы/учебники: &lt;a href="http://www.4clojure.com/problems"&gt;4Clojure&lt;/a&gt;, &lt;a href="http://tryclj.com/"&gt;TryClojure&lt;/a&gt;, &lt;a href="http://himera.herokuapp.com/index.html"&gt;Himera&lt;/a&gt;, &lt;a href="https://github.com/relevance/labrepl"&gt;labrepl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Списки рассылки: &lt;a href="https://groups.google.com/forum/?hl=ru&amp;amp;fromgroups#!forum/clojure"&gt;clojure&lt;/a&gt;, &lt;a href="https://groups.google.com/forum/?hl=ru&amp;amp;fromgroups#!forum/clojure-russian"&gt;clojure-russian&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;IDE/редактора (остальные редактора/IDE описаны в подразделах Getting Started): &lt;a href="http://dev.clojure.org/display/doc/Getting+Started+with+Eclipse+and+Counterclockwise"&gt;Eclipse&lt;/a&gt;, &lt;a href="http://dev.clojure.org/display/doc/Getting+Started+with+La+Clojure+and+IntelliJ+IDEA"&gt;IntelliJ IDEA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Средства сборки: &lt;a href="http://alexott.net/ru/clojure/ClojureMaven.html"&gt;поддержка Clojure в Maven&lt;/a&gt;, &lt;a href="https://github.com/technomancy/leiningen"&gt;Leiningen &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Библиотеки/фреймворки:
&lt;ul&gt;
&lt;li&gt;Web: &lt;a href="https://github.com/ring-clojure/ring"&gt;Ring&lt;/a&gt;, &lt;a href="https://github.com/weavejester/compojure"&gt;Compojure&lt;/a&gt;, &lt;a href="http://www.webnoir.org/"&gt;Noir, &lt;/a&gt;&lt;a href="https://github.com/weavejester/hiccup"&gt;Hiccup&lt;/a&gt;, &lt;a href="https://github.com/weavejester/lein-ring"&gt;lein-ring&lt;/a&gt;, &lt;a href="https://github.com/clojure/clojurescript"&gt;ClojureScript&lt;/a&gt;, &lt;a href="http://clojurescriptone.com/"&gt;ClojureScript One&lt;/a&gt;, l&lt;a href="https://github.com/emezeske/lein-cljsbuild"&gt;ein-cljsbuild&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SQL: &lt;a href="http://sqlkorma.com/"&gt;Korma&lt;/a&gt;, &lt;a href="https://github.com/clojure/java.jdbc"&gt;clojure.java.jdbc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;NoSQL: &lt;a href="http://clojuremongodb.info/"&gt;Monger&lt;/a&gt; (MongoDB), &lt;a href="https://github.com/clojure-clutch/clutch"&gt;Clutch&lt;/a&gt; (CouchDB), &lt;a href="https://github.com/compasslabs/clojure-hbase-schemas"&gt;clojure-hbase-schemas&lt;/a&gt; (HBase)&lt;/li&gt;
&lt;li&gt;GUI: &lt;a href="https://github.com/daveray/seesaw"&gt;Seesaw&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/clojure/core.logic"&gt;core.logic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dev.clojure.org/display/doc/Clojure+Contrib"&gt;Contrib libraries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Внутреннее устройство persistent коллекций: &lt;a href="http://blog.higher-order.net/2009/02/01/understanding-clojures-persistentvector-implementation/"&gt;вектора&lt;/a&gt;, &lt;a href="http://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/"&gt;отображения&lt;/a&gt; (maps)&lt;/li&gt;
&lt;/ul&gt;
&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/tP5liUfCgz0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/9038843391490053436/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=9038843391490053436" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/9038843391490053436?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/9038843391490053436?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/tP5liUfCgz0/clojure-itsea-2012.html" title="Выступление про Clojure на ITSea 2012" /><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/2012/09/clojure-itsea-2012.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQBRnw_eip7ImA9WhVaE0k.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-5469424786351625282</id><published>2012-06-10T13:56:00.003+01:00</published><updated>2012-06-10T17:05:57.242+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-10T17:05:57.242+01:00</app:edited><title>Вышел GNU Emacs 24.1!</title><content type="html">После длительной разработки, была выпущена новая версия GNU Emacs - 24.1. Среди основных изменений в данной версии можно отметить следующие:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;система пакетов, которая позволяет скачивать и устанавливать пакеты из внешних источников - как официальных, так и сторонних&lt;/li&gt;
&lt;li&gt;поддержка отображения и редактирования текстов на языках, где текст пишется справа-налево&lt;/li&gt;
&lt;li&gt;&amp;nbsp;поддержка lexical scoping в Emacs Lisp&lt;/li&gt;
&lt;li&gt;улучшения в системе дополнений (completion) - большинство пакетов теперь используют одинаковый метод показа дополнений&lt;/li&gt;
&lt;li&gt;встроенная поддержка тем оформления &lt;/li&gt;
&lt;li&gt;улучшения в интеграции с внешними библиотеками - GTK+3, ImageMagic, GNU TLS, etc.&lt;/li&gt;
&lt;/ul&gt;
Более подробную информацию можно найти в поставке GNU Emacs (файл &lt;a href="http://www.gnu.org/software/emacs/NEWS.24.1"&gt;etc/NEWS&lt;/a&gt;) и в статьях, перечисленных на &lt;a href="http://wikemacs.org/wiki/GNU_Emacs_24"&gt;странице wikemacs&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/fdAD6IoLY0E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/5469424786351625282/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=5469424786351625282" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/5469424786351625282?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/5469424786351625282?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/fdAD6IoLY0E/gnu-emacs-241.html" title="Вышел GNU Emacs 24.1!" /><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/2012/06/gnu-emacs-241.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkICRno5fSp7ImA9WhVbF0k.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-8043059456422970356</id><published>2012-06-03T17:17:00.004+01:00</published><updated>2012-06-03T17:22:47.425+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-06-03T17:22:47.425+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="education" /><category scheme="http://www.blogger.com/atom/ns#" term="NLP" /><title>Впечатления о курсе "Natural Language Processing"</title><content type="html">Продолжая традицию постоянного обучения, я не смог не пройти мимо еще одного из курсов предлагаемых &lt;a href="https://www.coursera.org/"&gt;Coursera&lt;/a&gt;. После курсов прошедших прошлой осенью, у меня осталось очень хорошее впечатление о них. Среди большого набора новых курсов я выбрал курс &lt;a href="https://www.coursera.org/course/nlp"&gt;Natural Language Processing&lt;/a&gt; (NLP) - та тема, которая меня давно интересовала. А на этой неделе я наконец-то получил сертификат об окончании этого курса, и решил написать по свежим следам...&lt;br /&gt;
Курс длится 8 недель и преподается двумя известными специлистами в этой области - Dan Jurafsky &amp;amp; Christopher Manning (оба из университета Stanford). В качестве основы для курса взяты две книги: &lt;a href="http://www.amazon.com/gp/product/0131873210/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0131873210"&gt;Speech &amp;amp; Language Processing, 2ed&lt;/a&gt; и &lt;a href="http://www.amazon.com/gp/product/0521865719/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=aleottshompag-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0521865719"&gt;Introduction to Information Retrieval&lt;/a&gt; (можно найти и онлайн-версии обоих книг - в виде последних снапшотов перед отравкой в издательство). Так получилось, что обе книги у меня уже были достаточно давно, но все не доходили руки сесть за их чтение. Хочется отметить, что читать книги все-таки требовалось, чтобы лучше понять то, что объяснялось в лекциях.&lt;br /&gt;
Каждую неделю необходимо было прослушать примерно 2 часа лекций, ответить на набор вопросов, и выполнить домашнее задание (в виде программы). В качестве языка программирования можно было использовать Java или Python - каждую неделю публиковалось новое задание, которое содержало заготовку кода, куда надо было вписать свое решение. Одним из отличий от осенних курсов было то, что на выполнение заданий отводилось больше времени - две недели (эти сроки иногда увеличивались - в зависимости от сложности задания и технических проблем).&lt;br /&gt;
Первые три недели были достаточно простыми - разбирали использование регулярных выражений для NLP, моделирование языков, spell correction и классификацию текстов с помощью Naive Bayes - задания выполнялись достаточно быстро.&lt;br /&gt;
А вот недели 4-6 были достаточно сложными - рассматривались maximum entropy модели, вычленение именованных объектов и отношений между ними, part of speech tagging, а также вероятностный парсинг текста.&amp;nbsp; 5-е и 6-е задания были самыми сложными в этом курсе (стоит отметить, что много народу просто пропустило 6-ю домашнюю работу) - необходимо было уметь программировать на достаточно хорошем уровне. Но зато было очень интересно смотреть как твоя программа выдает корректную структуру даже для очень сложных предложений с правильно присвоенными частями речи.&lt;br /&gt;
7-е задание было очень легким - надо было запрограммировать индексирование текста и вычисление tf-idf. А вот 8-е, хоть и казалось несложным, но требовало достаточно много времени для доводки регулярных выражений, которые должны были извлекать кусочки информации из входных данных. Времени к сожалению было не особо много, так что я сдал первый работающий вариант, за который получил около 70% от макс. оценки.&lt;br /&gt;
В итоге, после прохождения всего курса, я набрал 93% от макс. кол-ва баллов. Также вспомнил/научился как программировать на питоне - языке на котором я писал очень редко, а в основном читал код. И даже применил новые знание на практике, соорудив категоризатор текста на базе HBase/Clojure/Hadoop в виде эксперементального модуля для нашего продукта.&lt;br /&gt;
&lt;br /&gt;
Так что если вам интересны вопросы information retrieval/natural language processing - я очень рекомендую этот курс - он дает очень хорошее представление об этих областях и формирует основу для дальнейшего изучения.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/hhAm4CR2-RY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/8043059456422970356/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=8043059456422970356" title="Комментарии: 6" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8043059456422970356?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/8043059456422970356?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/hhAm4CR2-RY/natural-language-processing.html" title="Впечатления о курсе &quot;Natural Language Processing&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>6</thr:total><feedburner:origLink>http://alexott-ru.blogspot.com/2012/06/natural-language-processing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04NQnwyeip7ImA9WhVXFUw.&quot;"><id>tag:blogger.com,1999:blog-2145365503775784580.post-2846300617728437076</id><published>2012-04-15T18:46:00.000+01:00</published><updated>2012-04-15T18:46:33.292+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-15T18:46:33.292+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.4!</title><content type="html">А между тем, незаметно подкрался релиз новой версии языка Clojure - 1.4.&lt;br /&gt;
Rich Hickey называет этот релиз в основном maintenance, хотя есть и достаточно крупные изменения:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Расширяемая процедура чтения (reader) - разработчик может указать функцию чтения для своих типов данных. Разработчик должен указать метку для своего типа данных, и соответствующую функцию чтения, и данная функция будет вызвана после того, как следующая (после метки) форма будет считана стандартным reader. Например, можно будет писать вот так:&lt;code&gt; &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#foo/bar [1 2 3]&lt;/span&gt; &lt;/code&gt;- в этом случае, после чтения метки, процедура чтения сначала считает форму &lt;code style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[1 2 3]&lt;/code&gt;, а затем вызовет процедуру связанную с данной меткой (если она определена) и передаст ей прочитанные данные. В состав новой версии вошла поддержка чтения двух новых типов - &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#inst&lt;/span&gt; - для времени и даты, и &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;#uuid&lt;/span&gt; - для UUID.&lt;code&gt;&lt;br /&gt;
&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Новый синтаксис для доступа к полям записей (унифицировано с ClojureScript) - теперь можно писать &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(.-field_name record-instance)&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Возможность контролировать поведение компилятора Clojure с помощью опций, указанных через переменную &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*compiler-options*&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;Остальные изменения включают в себя добавление новых функций в базовую библиотеку, достаточно много исправлений ошибки, оптимизации производительности. &lt;br /&gt;
Полный список изменений можно &lt;a href="https://github.com/clojure/clojure/blob/master/changes.md"&gt;найти в репозитории&lt;/a&gt;. Кроме того, может быть интересным &lt;a href="http://www.infoq.com/interviews/hickey-clojure-reader"&gt;интервью Rich Hickey&lt;/a&gt; в котором он рассказывает про некоторые изменения в новой версии.&lt;img src="http://feeds.feedburner.com/~r/alexott-ru/~4/uo9FaANDZRI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://alexott-ru.blogspot.com/feeds/2846300617728437076/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2145365503775784580&amp;postID=2846300617728437076" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/2846300617728437076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2145365503775784580/posts/default/2846300617728437076?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/alexott-ru/~3/uo9FaANDZRI/clojure-14.html" title="Clojure 1.4!" /><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/2012/04/clojure-14.html</feedburner:origLink></entry><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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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></feed>
