<?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:thr="http://purl.org/syndication/thread/1.0">
  <id>http://piranha.org.ua/</id>
  <title>Amazon Byteﬂow</title>
  <updated>2010-03-28T17:41:03Z</updated>
  <author>
    <name>Alexander Solovyov</name>
  </author>
  <link href="http://piranha.org.ua/" rel="alternate" />
  <generator uri="http://hg.piranha.org.ua/cyrax/">cyrax</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/AmazonByteflow" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="amazonbyteflow" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <id>/blog/2010/03/28/project-root/</id>
    <title type="html">Управление проектами в Емаксе</title>
    <updated>2010-03-28T00:00:00Z</updated>
    <published>2010-03-28T00:00:00Z</published>
    <category term="emacs" /><category term="software" />
    <link href="http://piranha.org.ua/blog/2010/03/28/project-root/" rel="alternate" />
    <content type="html">&lt;p&gt;У Емакса какое-то подобие проектов из коробки появилось только в 23 версии, и то
очень простое - только переменные директорий (directory variables, что-то типа
file variables, только хранящиеся в отдельном файле - &lt;code&gt;.dir-locals.el&lt;/code&gt;). По
большей части потому, что über-решения нету, и разным людям нравятся разные
решения. Вот я и решил вкратце рассказать о том, что нравится мне.&lt;/p&gt;
&lt;p&gt;Пару лет назад я прочитал статью в каком-то блоге об одном из подобных решений и
попробовал его использовать. Как-то это решение (это был &lt;code&gt;eproject&lt;/code&gt;, что ли) не
прижилось и я пошëл искать альтернативы. Перепробовав какое-то количество, я
взял &lt;code&gt;project-root&lt;/code&gt;, прикрутив к нему несколько понравившихся фич от других
проектов. Теперь можно сказать, что мне действительно удобно - использую &lt;a href="http://piranha.org.ua/project-root/"&gt;эту
штуку&lt;/a&gt; уже больше года и доволен. :)&lt;/p&gt;
&lt;p&gt;Вся идея заключается в том, что вручную указывать путь к проекту (как это
сделано в большинстве - если не всех - IDE) - не очень удобно. У большинства
проектов есть какой-то характерный файл (или набор файлов) в корне. К примеру,
&lt;code&gt;manage.py&lt;/code&gt; у джанговых проектов, или директория &lt;code&gt;.hg&lt;/code&gt; у проекта, который лежит
в репозитории меркуриала. В результате можно определять проект по наличию таких
файлов; моя текущая конфигурация выглядит примерно таким образом:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(setq project-roots
      `(("Django project"
         :root-contains-files ("manage.py")
         :filename-regex ,(regexify-ext-list '(py html css js sh))
         :exclude-paths '("contrib"))
        ("Sphinx documentation"
         :root-contains-files ("Makefile" "conf.py")
         :filename-regex ,(regexify-ext-list '(py rst))
         :exclude-paths '("_build"))
        ("Python project with buildout"
         :root-contains-files ("../../buildout.cfg")
         :filename-regex ,(regexify-ext-list '(py)))
        ("Generic Python project"
         :root-contains-files ("setup.py")
         :filename-regex ,(regexify-ext-list '(py)))
        ("Generic Mercurial project"
         :root-contains-files (".hg"))
        ("Generic git project"
         :root-contains-files (".git"))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Интересно посмотреть на определение проекта с билдаутом - из-за того, что обычно
расположение директорий там выглядит как&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;proj/
    buildout.cfg
    src/
        proj/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;то приходится так извращаться, чтоб лишние файлы не попадали. :) Кроме того,
легко видно, что можно задать директории, которые нужно игнорировать и
регулярное выражение для файлов, которые хочется найти. :)&lt;/p&gt;
&lt;p&gt;Что это даëт? Это даëт возможность &lt;code&gt;project-root&lt;/code&gt;'у определить, что он находится
в проекте, и включает работу клëвого макроса &lt;code&gt;with-project-root&lt;/code&gt;. В принципе он
практически ничем не занимается, кроме как изменением текущей директории на
корень проекта - но этого хватает, чтоб заработали предопределëнные команды,
которые я повесил на кнопки вот так:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(global-set-key (kbd "C-c p f") 'project-root-find-file)
(global-set-key (kbd "C-c p g") 'project-root-grep)
(global-set-key (kbd "C-c p a") 'project-root-ack)
(global-set-key (kbd "C-c p d") 'project-root-goto-root)
(global-set-key (kbd "C-c p l") 'project-root-browse-seen-projects)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Наиболее часто используемая из них - &lt;code&gt;find-file&lt;/code&gt;, которая показывает в
минибуфере список файлов (в виде &lt;code&gt;file\parentdir\parentdir&lt;/code&gt; - обратный путь к
корню проекта), давая выбрать один из них с помощью ido-mode - т.е. вся
вкуснотища типа flex matching'а работает&lt;sup id="fnref:f1"&gt;&lt;a href="#fn:f1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;. :)&lt;/p&gt;
&lt;p&gt;Отступлю от темы и вкратце расскажу, что такое &lt;a href="http://www.emacswiki.org/emacs/InteractivelyDoThings"&gt;ido&lt;/a&gt;. Это такой клëвый пакет в
емаксе, который позволяет сильно облегчить работу в минибуфере своим
автодополнением и удобным переходом между соседними значениями (он показывает
сразу все возможные значения одновременно - и это удобно). Я его использую
вместо обычного открытия файла, для перехода между буферами, и вот с той же
целью он используется в &lt;code&gt;project-root&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Не думаю, что нужно описывать &lt;code&gt;grep&lt;/code&gt; или &lt;code&gt;ack&lt;/code&gt;, которые просто запускают
соответствующую программу от корня проекта - результаты запуска, как обычно,
показываются в буфере со ссылками на найденные значения (так что можно легко
перейти к нужному файлу/строке). &lt;code&gt;goto-root&lt;/code&gt; тоже не делает ничего особенного,
просто открывает &lt;code&gt;dired&lt;/code&gt; в корне проекта.&lt;/p&gt;
&lt;p&gt;А вот &lt;code&gt;browse-seen-projects&lt;/code&gt; - очень интересная штука. Дело в том, что
&lt;code&gt;project-root-find-file&lt;/code&gt; при первом открытия проекта добавляет его в список
проектов в файле &lt;code&gt;~/.emacs.d/.project-roots&lt;/code&gt; и сохраняет этот файл. А
&lt;code&gt;browse-seen-projects&lt;/code&gt; создаëт новый буфер в режиме &lt;code&gt;org-mode&lt;/code&gt; и добавляет туда
все проекты - в виде ссылок на их директории, конечно. ;) Так что можно довольно
быстро и удобно прыгнуть к нужному проекту.&lt;/p&gt;
&lt;p&gt;В основном функциональность этого кусочка кода я описал, еще информацию можно
почерпнуть на &lt;a href="http://piranha.org.ua/project-root/"&gt;страничке&lt;/a&gt; project-root'a и в его исходниках. Естественно, что
до идеального состояния его можно точить и точить, так что патчи - велкам. :)&lt;/p&gt;
&lt;div class="footnote"&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id="fn:f1"&gt;
&lt;p&gt;надо только не забыть установить &lt;code&gt;ido-enable-flex-matching&lt;/code&gt; в &lt;code&gt;t&lt;/code&gt;.
&amp;#160;&lt;a href="#fnref:f1" rev="footnote" title="Jump back to footnote 1 in the text"&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AmazonByteflow/~4/bA8uSEZ2K8I" height="1" width="1"/&gt;</content>
  </entry>

  <entry>
    <id>/blog/2010/03/14/mapsapi/</id>
    <title type="html">Google Maps API vs API Яндекс.Карт</title>
    <updated>2010-03-15T15:37:25Z</updated>
    <published>2010-03-14T00:00:00Z</published>
    <category term="programming" />
    <link href="http://piranha.org.ua/blog/2010/03/14/mapsapi/" rel="alternate" />
    <content type="html">&lt;p&gt;Описанный в &lt;a href="http://piranha.org.ua/blog/2010/03/14/locations/"&gt;прошлом посте&lt;/a&gt; сервис &lt;a href="http://locations.in.ua/"&gt;Дислокации&lt;/a&gt; использовал с самого
начала Яндекс.Карты как движок карт. Причин на то было несколько - я думал, что
они будут распознавать адреса лучше, чем гуглевские; у них значительно лучше
документация, чем у &lt;a href="http://mapia.ua/"&gt;Мапии&lt;/a&gt;; нет вопросов с получением ключика к АПИ, в
отличии от &lt;a href="http://maps.visicom.ua/"&gt;Визикома&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;В результате я написал всë с их использованием, и в основном был доволен - в
документации описано всë подробно, с кучей примеров. Всë работало, я был
доволен. :)&lt;/p&gt;
&lt;p&gt;Но мне предложили перейти на карты от гугля - у них значительно больше охват по
территориям (геокодер знает о моëм родном Кривом Роге, в отличии от яндексового
:), плюс они лучше распознают адреса (которые встречаются, как оказалось, в
довольно стрëмном виде). Почему сервис не перешëл - я в принципе всë сделал и
оно заработало - это отдельный вопрос: гугль ограничивает количество запросов к
геокодеру в 15000 в день (это мало, текст со страницы адресов отделений ВТБ24
- 1500 строк) плюс ограничивает частоту запросов - 5 запросов в секунду уже
перебор, два - обычно всë ок, но бывают траблы. Это по-моему неприемлемо, ждать
пару минут, пока оно раздуплится. :)&lt;/p&gt;
&lt;p&gt;Но в посте я хотел затронуть совсем другой вопрос - о разнице в АПИ. В
некоторых местах логичнее гугль: функция обработы результатов поиска адреса в
виде коллбека к геокодеру это явно более стандартный подход, чем использование
событий; в некоторых - яндекс: мне кажется более логичным на карту добавлять
оверлей (&lt;code&gt;map.addOverlay(mark)&lt;/code&gt;), а не обратное (&lt;code&gt;mark.setMap(map)&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Но проблема лежит глубже. Во-первых, документация АПИ у гугла значительно хуже -
хуже структурирована, в некоторых местах приходилось догадываться
экспериментально (не могу вспомнить, где), примеров меньше. Базовых возможностей
(всякие крутые штуки типа прокладывания маршрутов я не щупал, но у яндекса они
только для Москвы - минус серьëзный) тоже меньше - к примеру, внешний вид карты
надо предопределять до создания карты. После того уже изменить ничего
невозможно, в отличии от яндексовых карт - там всë на лету меняется без проблем.&lt;/p&gt;
&lt;p&gt;Но самое плохое - это наличие абсолютно дурацких глюков. Например, если
выключить панель навигации, панель зума исчезает сама и добавить еë
невозможно. Если передвинуть панель зума направо, расположению элементов
управления на карте сносит крышу и оно принимает очень странный вид - даже в
примерах от гугля, где они показывают, как это клëво работает. :)&lt;/p&gt;
&lt;p&gt;С другой стороны, центр Киева (на счëт других городов лень смотреть :) у Яндекса
явно смещëн на юг - можно зайти на сайт и полюбоваться отрезанным севером. :) Но
улица Мазепы у гугла отсутствует и это настораживает - не Путин ли покопался? :D&lt;/p&gt;
&lt;p&gt;В общем и целом должен сказать, что бекенд у Google Maps лучше - у него куда более
обширная база и (в большинстве случаев) лучше работающий геокодер. Зато у
Яндекса лучше фронтенд - кроме всего прочего, увеличение региона, выделенного
правой кнопкой мышки, меня просто прëт. :) А учитывая нечеловечность
ограничителя геокодера у гугла, остаëтся ждать улучшений сервиса Яндекса. ;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPD.&lt;/strong&gt; Надо, правда, сказать, что я совсем пропустил мимо глаз то, что я
пользовался 3 версией API, которая еще находится в бета-тестировании, что
несколько извиняет гугль. :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AmazonByteflow/~4/bDbPawSk3PQ" height="1" width="1"/&gt;</content>
  </entry>

  <entry>
    <id>/blog/2010/03/14/locations/</id>
    <title type="html">Дислокации</title>
    <updated>2010-03-14T00:00:00Z</updated>
    <published>2010-03-14T00:00:00Z</published>
    <category term="service" />
    <link href="http://piranha.org.ua/blog/2010/03/14/locations/" rel="alternate" />
    <content type="html">&lt;p&gt;В жизни частенько приходится сталкиваться с тем, чтоб найти какое-то учреждение
- например, ближайшее отделение банка. И обычно этот процесс связан с просмотром
списка из кучи адресов и попыткой выудить глазами знакомые улицы - потому что
проверить все эти адреса по карте не представляется возможным вообще.&lt;/p&gt;
&lt;p&gt;Иногда у меня в голове появлялась мысль, что было бы хорошо это как-то
поправить. :) И вот последний раз, как мне пришлось срочно искать отделение
своего банка, я вернулся к ноуту и за пару часов набросал страничку, где можно
ввести десяток адресов и получить картинку их размещения на карте - и увидеть
визуально, куда податься. Встречайте - &lt;a href="http://locations.in.ua/"&gt;locations.in.ua&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Что клëво - оно совсем не требует работы мозга (или рук). Просто вставляете в
поле ввода кусок текста, в котором встречаются строки с адресами, сервис немного
зачищает их и пытается найти на карте. Те, что получилось найти, показывает на
карте и помечает зелëным маркером; те, что не получилось - помечает красным
маркером. Всë просто. :)&lt;/p&gt;
&lt;p&gt;Для еще большего упрощения на страничке &lt;a href="http://locations.in.ua/about.html#bookmarklet"&gt;about&lt;/a&gt; можно найти букмарклет,
который помогает даже не париться с копированием.&lt;/p&gt;
&lt;p&gt;В общем-то это и всë, welcome. :) На сайте есть кнопка Feedback, где можно
написать отзыв или оставить идею, если таковые появятся.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AmazonByteflow/~4/_2f486MKkiU" height="1" width="1"/&gt;</content>
  </entry>

  <entry>
    <id>/blog/2010/03/07/blog-reboot/</id>
    <title type="html">Перезагрузка блога</title>
    <updated>2010-03-07T00:00:00Z</updated>
    <published>2010-03-07T00:00:00Z</published>
    <category term="news" /><category term="blog" />
    <link href="http://piranha.org.ua/blog/2010/03/07/blog-reboot/" rel="alternate" />
    <content type="html">&lt;p&gt;Ну что, привет, в очередной раз на новый лад - я опять сменил себе движок
блога. :) И на этот раз уже не очень важно, что это - потому что он просто
генерирует статический сайт. ;)&lt;/p&gt;
&lt;p&gt;Я даже пошëл на столь экстремальный шаг, как отсутствие комментариев - обдумав
ситуацию, я понял, что пишу не ради комментариев, а ради того, чтоб поделиться с
читателями мнением, новостью и т.п.&lt;/p&gt;
&lt;p&gt;Надеюсь, что дизайн вам понравится, как нравится он мне - он достаточно
ненапряжный и чистый. Единственное, что мне не нравится - это иконка, которая
является ссылкой на блог в заголовке (третья справа). Заодно я планирую писать
почаще (3 поста за последние полгода - это не очень клëво, да?), потому что это
теперь сделать проще - все посты являются файлами в репозитории, которые без
проблем можно обновлять в редакторе, не открывая никакого сайта.&lt;/p&gt;
&lt;p&gt;В любом случае, как говорит Джереми Кларксон - hello and welcome! И прошу
прощения, если старые посты вдруг оказались новыми в ваших фидридерах. :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AmazonByteflow/~4/v7KpvrKxffw" height="1" width="1"/&gt;</content>
  </entry>

  <entry>
    <id>/blog/2009/12/02/mercurial-141/</id>
    <title type="html">Mercurial 1.4.1</title>
    <updated>2009-12-02T00:00:00Z</updated>
    <published>2009-12-02T00:00:00Z</published>
    <category term="hg" /><category term="news" />
    <link href="http://piranha.org.ua/blog/2009/12/02/mercurial-141/" rel="alternate" />
    <content type="html">&lt;p&gt;Хочу похвастаться - вышел &lt;a href="http://mercurial.selenic.com/wiki/WhatsNew#A1.4.1_-_2009-12-01"&gt;Меркуриал 1.4.1&lt;/a&gt;, замечательный тем, что в него
включили моë расширение - &lt;a href="http://mercurial.selenic.com/wiki/SchemesExtension"&gt;schemes&lt;/a&gt;. Это аналог алиасов, но только для
адресов. После его включения и добавления в &lt;code&gt;~/.hgrc&lt;/code&gt; таких строчек:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[schemes]
p = ssh://piranha.org.ua/hg/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;можно писать &lt;code&gt;hg push p://byteflow/&lt;/code&gt; вместо полного адреса. В расширении уже
есть предопределëнные ссылки:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;py = http://hg.python.org/
bb = https://bitbucket.org/
bb+ssh = ssh://hg@bitbucket.org/
gcode = https://{1}.googlecode.com/hg/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;{1}&lt;/code&gt; в &lt;code&gt;gcode&lt;/code&gt; означает, что первая часть урла (если считать их так:
&lt;code&gt;gcode://первая/вторая/етц/&lt;/code&gt;) будет вставлена в начало адреса, а не в конец.&lt;/p&gt;
&lt;p&gt;Остальные изменения - в основном мелкие фиксы для 1.4 (который, кстати, вышел
две недели назад).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AmazonByteflow/~4/ap2AjbxsOpE" height="1" width="1"/&gt;</content>
  </entry>

</feed>
