<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Namespaces matter</title>
	
	<link>http://demiurg.com.ua/blog</link>
	<description>Dmitry Guyvoronsky personal blog</description>
	<lastBuildDate>Sat, 22 Oct 2011 16:20:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/dreamiurg" /><feedburner:info uri="dreamiurg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Virtualization with vagrant @ PyCon Ukraine 2011</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/UsxLNviUuYE/</link>
		<comments>http://demiurg.com.ua/blog/2011/10/22/virtualization-with-vagrant-pycon-ukraine-2011/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 16:20:25 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Anything]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[fabric]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[vagrant]]></category>
		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=357</guid>
		<description><![CDATA[I attended PyCon Ukraine 2011 today, and gave a brief talk about usage of VMs in development. Although presentation itself was based on my previous one made for CQG, it was significantly reworked for wide audience. Let me know if I missed anything. And here is screencast of demo project deployment with help of Vagrant [...]]]></description>
			<content:encoded><![CDATA[<p>I attended <a href="http://ua.pycon.org/">PyCon Ukraine 2011</a> today, and gave a brief talk about usage of VMs in development. Although presentation itself was based on my previous one made for CQG, it was significantly reworked for wide audience.</p>
<p>Let me know if I missed anything.</p>
<p style="text-align: center;"><iframe src="http://www.slideshare.net/slideshow/embed_code/9831087" width="400" height="337" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>
<p>And here is screencast of demo project deployment with help of Vagrant and Fabric.</p>
<p style="text-align: center;">
<p><object width="500" height="281"><param name="movie" value="http://www.youtube.com/v/O3-MNsowgHc?version=3&#038;feature=oembed"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/O3-MNsowgHc?version=3&#038;feature=oembed" type="application/x-shockwave-flash" width="500" height="281" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/UsxLNviUuYE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2011/10/22/virtualization-with-vagrant-pycon-ukraine-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2011/10/22/virtualization-with-vagrant-pycon-ukraine-2011/</feedburner:origLink></item>
		<item>
		<title>Using git to get version information</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/4jcdApG9jdA/</link>
		<comments>http://demiurg.com.ua/blog/2011/10/03/using-git-to-get-version-information/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 20:16:56 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[English]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sphinx]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=344</guid>
		<description><![CDATA[From time to time you need to get project version information and use it somewhere &#8211; in project documentation, in About box or include it in website footer. I use git for my projects, and find it very convenient to let git to provide version info instead of hardcoding it into the source code. There [...]]]></description>
			<content:encoded><![CDATA[<p>From time to time you need to get project version information and use it somewhere &#8211; in project documentation, in About box or include it in website footer.</p>
<p>I use git for my projects, and find it very convenient to let git to provide version info instead of hardcoding it into the source code. There are several possible ways to ask git for version information, including <a href="http://progit.org/book/ch7-2.html">keyword expansion</a> &#8211; and some of them are described in <a href="http://stackoverflow.com/questions/62264/dealing-with-svn-keyword-expansion-with-git-svn">this stackoverflow post</a>. For me, <a href="http://man.he.net/man1/git-describe">git describe</a> works best, since it doesn&#8217;t modify sources on checkout (comparing to keyword expansion) and provides version information in format that could be used in other git commands such as <em>git diff</em>.</p>
<h2>Sidenote: git describe</h2>
<p><em>git describe</em> returns information about state of working tree or any particular commit. There are several command line switches to consider, but in most cases &#8220;<em>git describe &#8211;tags &#8211;always</em>&#8221; will work just fine for everyone. The command finds the most recent tag that is reachable from a commit, and if the commit itself is pointed at by the tag, shows the tag. Otherwise, it suffixes the tag name with the number of additional commits and the abbreviated object name of the commit.</p>
<pre class="brush: bash; title: ; notranslate">
$ git describe --tags --always
v0.1.3-16-ge1b5922
</pre>
<h2>Note on performance</h2>
<p>Keep in mind that running git every time you need version information may not be the best idea. When source code changes are rare and performance is important (e.g. production website) it is wise to get information only once, then store it for later use. In other cases, when changes are often and performance is not critical, it may be ok to query git every time.</p>
<h2>Example: including version information in Sphinx documentation</h2>
<p><a href="http://sphinx.pocoo.org/">Sphinx</a> is a tool that makes it easy to create intelligent and beautiful documentation, and it is often used in Python world. Project version information is stored in Sphinx configuration file and is embedded auto-generated project documentation. Since Sphinx itself is written in Python, getting version info is simple. First, add the following lines to your docs/conf.py:</p>
<pre class="brush: python; title: ; notranslate">
from subprocess import Popen, PIPE

def get_version():
  &quot;&quot;&quot; Returns project version as string from 'git describe' command. &quot;&quot;&quot;
  pipe = Popen('git describe --tags --always', stdout=PIPE, shell=True)
  version = pipe.stdout.read()

if version:
  return version
else:
  return 'X.Y'
</pre>
<p>Then, replace hardcoded <em>version</em> and <em>release</em> values:</p>
<pre class="brush: python; title: ; notranslate">
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = get_version().lstrip('v')
# The full version, including alpha/beta/rc tags.
release = version
</pre>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/4jcdApG9jdA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2011/10/03/using-git-to-get-version-information/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2011/10/03/using-git-to-get-version-information/</feedburner:origLink></item>
		<item>
		<title>Виртуализация разработки + vagrant как удобное средство для ее автоматизации</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/f5DT_YPUEy0/</link>
		<comments>http://demiurg.com.ua/blog/2011/07/15/virtualization-with-vagrant/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 12:49:15 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Russian]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[vagrant]]></category>
		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=336</guid>
		<description><![CDATA[Выложил в сеть слайды своей презентации о виртуализации разработки ПО и использовании vagrant для автоматизации рутинных задач по управлению VM. Тема достаточно объемная, постараюсь более подробно описать в следующих постах.]]></description>
			<content:encoded><![CDATA[<p>Выложил в сеть слайды своей презентации о виртуализации разработки ПО и использовании <a href="http://vagrantup.com/" target="_blank">vagrant</a> для автоматизации рутинных задач по управлению VM. Тема достаточно объемная, постараюсь более подробно описать в следующих постах.</p>
<p style="text-align: center;"><iframe src="http://www.slideshare.net/slideshow/embed_code/8660447" width="400" height="337" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/f5DT_YPUEy0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2011/07/15/virtualization-with-vagrant/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2011/07/15/virtualization-with-vagrant/</feedburner:origLink></item>
		<item>
		<title>Замена фонта консоли Windows на более подходящий</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/urEya5H3XTI/</link>
		<comments>http://demiurg.com.ua/blog/2011/06/10/how-to-change-windows-console-font/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 15:59:13 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Anything]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[font]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=270</guid>
		<description><![CDATA[Одна из вещей, которая раздражает в Windows &#8211; ограниченность настроек консоли aka cmd.exe. В частности, выбор шрифтов сводится к Consolas, Lucida Console и невнятным Raster Fonts: В то же время, есть большое количество других фонтов, которые хорошо подходят для задач программирования и администрирования. Неплохой список можно найти в этой статье или тут, лично я же предпочитаю использовать Inconsolanta. [...]]]></description>
			<content:encoded><![CDATA[<p>Одна из вещей, которая раздражает в Windows &#8211; ограниченность настроек консоли aka cmd.exe. В частности, выбор шрифтов сводится к Consolas, Lucida Console и невнятным Raster Fonts:</p>
<p><img class="aligncenter" title="Windows Console Properties" src="http://pix.am/qOyE.png" alt="" width="386" height="474" /></p>
<p>В то же время, есть большое количество других фонтов, которые хорошо подходят для задач программирования и администрирования. Неплохой список можно найти <a title="Лучшие шрифты для программирования" href="http://habrahabr.ru/blogs/typography/120316/" target="_blank">в этой статье</a> или <a title="Monospace/Fixed Width Programmer's Fonts" href="http://www.lowing.org/fonts/" target="_blank">тут</a>, лично я же предпочитаю использовать <strong><a href="http://www.levien.com/type/myfonts/inconsolata.html" target="_blank">Inconsolanta</a></strong>.</p>
<p>Как оказалось, подключить ваш любимый фонт к консоли можно, хотя это требует некоторых действий с реестром, за наводку спасибо <a href="http://www.hanselman.com/blog/UsingConsolasAsTheWindowsConsoleFont.aspx" target="_blank">Скотту</a>:</p>
<ul>
<li>Откройте <strong>HKLM/Software/Microsoft/Windows NT/CurrentVersion/Console/TrueTypeFont</strong>. Вы увидите несколько значений, соответствующим Lucida и Consolas.</li>
<li>Создайте новый String Value. Название должно состоять из нолей и быть на один символ длиннее предыдущего подобного названия. Так, в моем случае имя ключа &#8211; &#8220;000&#8243;.</li>
<li>Значение ключа &#8211; название фонта. Вообще на фонты накладываются некоторые ограничения, подробнее о них вы можете прочесть в <a href="http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q247815" target="_blank">MS Knowledge Base</a>.</li>
<li><strong>Reboot</strong>. Без этого шрифты не подхватятся.</li>
</ul>
<p><img class="aligncenter" title="RegEdit" src="http://pix.am/zR65.png" alt="" width="702" height="394" /></p>
<p>Все. После перезагрузки новый фонт можно настроить в качестве фонта по умолчанию и ваша консоль станет удобнее.</p>
<p>Хорошая альтернатива танцам с бубном вокруг реестра &#8211; <a href="http://sourceforge.net/projects/console/" target="_blank">open-source проект Console2</a>. Как пишут авторы:</p>
<p style="padding-left: 30px;"><em>Console is a Windows console window enhancement. Console features include: <strong>multiple tabs</strong>, text editor-like text selection, different background types, alpha and color-key <strong>transparency</strong>, <strong>configurable font</strong>, different window styles.</em></p>
<p>Console2 недавно поднялся до второй версии, и выглядит довольно-таки неплохо, с успехом заменяя стандартные средства.</p>
<p style="text-align: center;"><img class="aligncenter" title="Console2" src="http://pix.am/z1k6.png" alt="" width="573" height="364" /></p>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/urEya5H3XTI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2011/06/10/how-to-change-windows-console-font/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2011/06/10/how-to-change-windows-console-font/</feedburner:origLink></item>
		<item>
		<title>Использование github для хранения персональных настроек</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/N3PjEXmlHPE/</link>
		<comments>http://demiurg.com.ua/blog/2011/03/27/using-github-to-share-personal-settings-between-servers/#comments</comments>
		<pubDate>Sun, 27 Mar 2011 20:34:09 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Anything]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=253</guid>
		<description><![CDATA[Проблема унификации персональных настроек среды знакома каждому, кто работает на нескольких компьютерах. При работе в unix/linux/*bsd у каждого довольно быстро появляется свой любимый набор aliases, bash-functions, PS1 и переменных среды, которые облегчают работу. Не стоит забывать и о настройках других программ, таких, как vim, emacs или git. По счастью, большая часть настроек хранится на *unix-системах [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-255 alignleft" style="margin-bottom: 10px; margin-right: 15px;" title="preferences" src="http://demiurg.com.ua/blog/wp-content/uploads/2011/03/System-Preferences-icon.png" alt="" width="128" height="128" />Проблема унификации персональных настроек среды знакома каждому, кто работает на нескольких компьютерах. При работе в unix/linux/*bsd у каждого довольно быстро появляется свой любимый набор aliases, bash-functions, PS1 и переменных среды, которые облегчают работу. Не стоит забывать и о настройках других программ, таких, как vim, emacs или git.</p>
<p>По счастью, большая часть настроек хранится на *unix-системах в простых текстовых файлах и может быть легко скопирована на новый сервер. Однако, при росте количества серверов вы неизбежно сталкиваетесь с ограничениями такого подхода. Какую версию считать основной мастер-копией? Что, если в вашем парке несколько операционных систем и настройки разнятся от одной системы к другой? Что делать, наконец, если мастер-копию настроек возможно быстро скачать не на все сервера &#8211; скажем, она лежит на вашей основной рабочей машине в офисе компании за файрволлом?</p>
<p>Появление distributed version control systems, таких, как <a href="http://git-scm.com/">git</a> и <a href="http://mercurial.selenic.com/">mercurial</a>, вкупе с возможностью хостить свои персональные репозитории в облаках позволяет значительно уменьшить эти проблемы. Я воспользовался публичным хостингом на <a href="https://github.com/">github</a>, однако, если вы не хотите давать доступ к вашим настройкам &#8211; есть и другие варианты (например, <a href="http://unfuddle.com">unfuddle</a> предлагает <a href="http://unfuddle.com/about/tour/plans">бесплатный</a> приватный хостинг git и svn репо).</p>
<p><span id="more-253"></span><br />
<span style="font-size: 26px; font-weight: bold;">Последовательность действий</span></p>
<ol>
<li>Зарегистрируйтесь <a href="https://github.com/signup">на github</a>.</li>
<li><a href="https://github.com/repositories/new">Создайте</a> новый персональный репо для ваших настроек.</li>
<li>Склонируйте его на ваш компьютер (git clone &lt;url&gt;).</li>
<li>Отредактируйте ваши ~/.bashrc, ~/.vimrc и прочие файлы персональных настроек, вынеся оттуда универсальные aliases, функции и прочие общие настройки в отдельные файлы в вашем клоне репо.</li>
<li>Включите универсальные настройки в ~/.bashrc (source ~/path/to/aliases.sh)</li>
<li>git add &amp;&amp; git commit</li>
<li>Клонируйте настройки на другие сервера и отредактируйте соответствующие .bashrc (как указано в пункте 6).</li>
</ol>
<p>В качестве примера приведу <a href="https://github.com/dreamiurg/bash-ext">репо с моими настройками</a>, алиасы в aliases.sh, функции, как несложно догадаться, в functions.sh.</p>
<pre class="brush: bash; title: aliases.sh; notranslate">
alias md='mkdir -p'
alias h='history'
alias j='jobs -l'
alias which='type -a'
...
</pre>
<p>А вот как выглядит ~/.bashrc на моих серверах. Клон репо находится в ~/etc/bash-ext.</p>
<pre class="brush: bash; title: ~/.bashrc; notranslate">
# Include gloablly defined aliases and functions
source ~/etc/bash-ext/aliases.sh
source ~/etc/bash-ext/functions.sh

__define_colors
__set_prompt
...
</pre>
<h1>Плюсы и минусы такого подхода</h1>
<h2>Плюсы</h2>
<ul>
<li>Копия настроек на каждой системе поднимается за минуты</li>
<li>Возможность иметь историю изменений на каждой системе без необходимости доступа к центральному серверу (если вы используете dvcs &#8211; git, hg, etc.)</li>
<li>Возможность иметь кастомные версии настроек, скажем, для разных ОС или целей (git branch freebsd &amp;&amp; git checkout freebsd&#8230;)</li>
<li>Возможность иметь универсальные настроки для команды или рабочей группы</li>
</ul>
<h2>Минусы</h2>
<ul>
<li>Вам понадобится git (hg, svn, bazaar..) клиент на каждой машине. Впрочем, установка нужного пакета &#8211; дело нескольких минут.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/N3PjEXmlHPE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2011/03/27/using-github-to-share-personal-settings-between-servers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2011/03/27/using-github-to-share-personal-settings-between-servers/</feedburner:origLink></item>
		<item>
		<title>Введение в git</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/mtTHO59X-KU/</link>
		<comments>http://demiurg.com.ua/blog/2011/03/18/introduction-to-git/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 15:07:19 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Anything]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[howto]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=230</guid>
		<description><![CDATA[Выложил в публичный доступ мою презентацию &#8220;Introduction to git&#8221;. В первую очередь она рассчитана на разработчиков (а на кого же еще?), речь идет не только о том, как git использовать, но и о дизайне, предпросылках для создания git, внутренней структуре репо и многом другом.]]></description>
			<content:encoded><![CDATA[<p>Выложил в публичный доступ мою презентацию &#8220;Introduction to git&#8221;. В первую очередь она рассчитана на разработчиков (а на кого же еще?), речь идет не только о том, как git использовать, но и о дизайне, предпросылках для создания git, внутренней структуре репо и многом другом.</p>
<p style="text-align: center;"><iframe src="http://www.slideshare.net/slideshow/embed_code/8660499" width="400" height="337" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/><br/></p>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/mtTHO59X-KU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2011/03/18/introduction-to-git/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2011/03/18/introduction-to-git/</feedburner:origLink></item>
		<item>
		<title>Настройка bash completion для git под Mac OS</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/lZmK-ehMmso/</link>
		<comments>http://demiurg.com.ua/blog/2011/03/17/git-bash-completion/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 20:36:56 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Anything]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=221</guid>
		<description><![CDATA[В последнее время я часто использую git для разных проектов и хочу поделиться несколькими советами, как сделать работу с ним удобнее. Одним из преимуществ git являются дешевые бранчи. Поскольку бранч &#8211; это просто файл в .git/refs/heads, который содержит id последнего коммита в этом бранче, создание нового бранча выполняется за очень небольшое время. При таких возможностях [...]]]></description>
			<content:encoded><![CDATA[<p>В последнее время я часто использую <a href="http://git-scm.com/">git</a> для разных проектов и хочу поделиться несколькими советами, как сделать работу с ним удобнее.</p>
<p>Одним из <a href="https://git.wiki.kernel.org/index.php/GitSvnComparison">преимуществ</a> git являются дешевые бранчи. Поскольку бранч &#8211; это <a href="http://progit.org/book/ch3-1.html">просто файл</a> в .git/refs/heads, который содержит id последнего коммита в этом бранче, создание нового бранча выполняется за очень небольшое время. При таких возможностях разумно использовать бранчи, что называется, &#8220;на все деньги&#8221;, что большинство программистов и делает.</p>
<p>Независимо от выбранной <a href="http://nvie.com/posts/a-successful-git-branching-model/">модели</a> использования бранчей, рано или поздно наступает момент, когда можно забыть, в каком бранче вы находитесь в данный момент и закоммитить код не туда. Хотя это некритично и ошибку можно <a href="http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html">легко исправить</a>, но таких ситуаций по возможности хотелось бы избегать. К счастью, информацию о имени бранча и прочие сведения довольно легко добавить в bash prompt, которая постоянно перед глазами.</p>
<p><span id="more-221"></span></p>
<h2>Установка git bash completion</h2>
<p>В состав git включены несколько полезных скриптов, среди которых &#8211; <a href="https://github.com/git/git/blob/master/contrib/completion/git-completion.bash">git-completion.bash</a>. После его подключения в списке completion для bash добавляются команды git, имена локальных и remote брачей, теги и многое другое. Кроме этого, скрипт определяет несколько полезных функций, которые можно использовать для получения информации об окружении.</p>
<pre class="brush: plain; title: ; notranslate">
$ git &lt;tab&gt;&lt;tab&gt;
add                 citool              gc                  notes               shortlog
am                  clean               get-tar-commit-id   pull                show
annotate            clone               grep                push                show-branch
apply               co                  gui                 rebase              st
archive             commit              help                reflog              stage
bisect              config              imap-send           relink              stash
blame               describe            init                remote              status
br                  diff                instaweb            repack              submodule
branch              difftool            last                replace             tag
bundle              fetch               log                 request-pull        whatchanged
checkout            filter-branch       merge               reset
cherry              flow                mergetool           revert
cherry-pick         format-patch        mv                  rm
ci                  fsck                name-rev            send-email
</pre>
<p>Если вы пользуетесь MacPorts, убедитесь, что git-core установлен с вариантом +bash_completion</p>
<pre class="brush: plain; title: ; notranslate">
$ sudo port install git-core +bash_completion
---&gt;  Computing dependencies for git-core
---&gt;  Cleaning git-core
</pre>
<p>Если вы установили git из исходников, поищите &#8211; скрипт должен лежать где-то в системе.</p>
<pre class="brush: bash; title: ; notranslate">
$ locate git-completion
/opt/local/share/doc/git-core/contrib/completion/git-completion.bash
</pre>
<h2>Настройка bash prompt</h2>
<p>Добавьте следующие строчки в ~/.bashrc</p>
<pre class="brush: bash; title: ; notranslate">
source /path/to/git-completion.bash

function __set_prompt
{
    # Configure Colors:
    WHITE='&#92;&#48;33[1;37m'
    LIGHTGRAY='033[0;37m'
    GRAY='&#92;&#48;33[1;30m'
    BLACK='&#92;&#48;33[0;30m'
    RED='&#92;&#48;33[0;31m'
    LIGHTRED='&#92;&#48;33[1;31m'
    GREEN='&#92;&#48;33[0;32m'
    LIGHTGREEN='&#92;&#48;33[1;32m'
    BROWN='&#92;&#48;33[0;33m'
    YELLOW='&#92;&#48;33[1;33m'
    BLUE='&#92;&#48;33[0;34m'
    LIGHTBLUE='&#92;&#48;33[1;34m'
    PURPLE='&#92;&#48;33[0;35m'
    PINK='&#92;&#48;33[1;35m'
    CYAN='&#92;&#48;33[0;36m'
    LIGHTCYAN='&#92;&#48;33[1;36m'
    DEFAULT='&#92;&#48;33[0m'

    export PS1=&quot;\[${GREEN}\]\u.\h\[${LIGHTBLUE}\]&quot;' $(__git_ps1 &quot;(%s) &quot;)'&quot;\[${BROWN}\]\w \[${DEFAULT}\]\\$ &quot;
}
__set_prompt
</pre>
<p><strong>Update: </strong>цвета в PS1 нужно заключать в \[\], иначе bash будет некорректно рассчитывать длину приглашения и в терминале перевод строки будет обрабатываться некорректно:</p>
<pre class="brush: plain; title: ; notranslate">123amiurg ~ $ 1234567890</pre>
<p>После настройки, если текущий каталог находится под контролем git, в командной строке будет отображаться имя текущего бранча.</p>
<p><a href="http://demiurg.com.ua/blog/wp-content/uploads/2011/03/screen-capture.png"><img class="alignnone size-full wp-image-224" title="bash with git completion" src="http://demiurg.com.ua/blog/wp-content/uploads/2011/03/screen-capture.png" alt="" width="729" height="499" /></a></p>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/lZmK-ehMmso" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2011/03/17/git-bash-completion/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2011/03/17/git-bash-completion/</feedburner:origLink></item>
		<item>
		<title>Рассказ о марафоне #soft24, часть 1</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/FWjW3W0rkMA/</link>
		<comments>http://demiurg.com.ua/blog/2010/08/20/create-software-in-24-hours/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 15:51:57 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Anything]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[report]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=175</guid>
		<description><![CDATA[Прошла неделя, страсти улеглись, и я хочу немного рассказать о прошедшем на прошлых выходных марафоне по разработке приложений soft24. Но сначала &#8211; спасибо всем, кто принимал участие. Ребята, с вами было интересно общаться и работать над идеями и кодом, я с удовольствием приму участие и в следующих &#8220;забегах&#8221;. И, конечно, отдельное большое спасибо организаторам (и в [...]]]></description>
			<content:encoded><![CDATA[<p>Прошла неделя, страсти улеглись, и я хочу немного рассказать о прошедшем на прошлых выходных <a href="http://soft24.tim.com.ua/" target="_blank">марафоне по разработке приложений soft24</a>.</p>
<p>Но сначала &#8211; спасибо всем, кто принимал участие. Ребята, с вами было интересно общаться и работать над идеями и кодом, я с удовольствием приму участие и в следующих &#8220;забегах&#8221;. И, конечно, отдельное большое спасибо организаторам (и в первую очередь <a href="http://tim.com.ua/about/" target="_blank">Тимофею Евграшину</a>).</p>
<h3>Угнать за 80 секунд</h3>
<p>Вкратце об идее: участники собираются вместе (в буквальном смысле, удаленная работа отпадает) и создают законченный продукт за ограниченное время. В Украине уже проходило несколько подобных мероприятий, на которых люди создавали <a href="http://filmza24chasa.livejournal.com/" target="_blank">фильмы</a> и <a href="http://24godyny.livejournal.com/" target="_blank">журналы</a> за 24 часа. Мы же собрались под одной крышей, чтобы создать софт.</p>
<p><a href="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-all.jpg"><img class="aligncenter size-medium wp-image-179" title="soft24-all" src="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-all-300x200.jpg" alt="" width="300" height="200" /></a></p>
<p>Все вышло как нельзя лучше, и в качестве бонуса мы получили массу удовольствия от самого процесса. Но обо всем по порядку.</p>
<p><span id="more-175"></span><span style="line-height: 23px; font-size: 21px;">Атмосфера</span></p>
<p>Представьте себе 25-30 программистов, которые видят друг друга в первый раз, но уже горят желанием создать что-то этакое, потом прикрутить еще что-то вот такое, повесить бантик и покрасить в малиновый, чтобы вышло ОГОГО. Представили? Теперь равномерно накрошите программистов по залу, обеспечьте wifi, раскидайте десяток-другой <a href="http://www.google.com/images?q=bean+bag+chairs" target="_blank">bean bag chairs</a>, пару бильярдных столов, литров 50 кофе, полцентнера шоколадок и.. знаете, лучше идите-ка спать домой, потому что поспать здесь у вас точно не получится.</p>
<blockquote><p>&#8220;Он добавил картошки, лука, посолил и поставил аквариум на огонь&#8221; (народное творчество)</p></blockquote>
<p><a href="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-chairs.jpg"><img class="aligncenter size-medium wp-image-184" title="soft24-chairs" src="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-chairs-300x225.jpg" alt="" width="300" height="225" /></a></p>
<h3>Программист и PR-щик &#8211; братья навек</h3>
<p>На мой взгляд, очень хорошей идеей было собрать вместе не только программистов и дизайнеров, но и PR-щиков с журналистами. Пока одни увлеченно рисовали модели на доске и копались в коде, другие не менее увлеченно бегали по залу с фотоаппаратами, снимали скетчи, брали интервью, проводили видеотрансляции и развлекались как могли.</p>
<p><a href="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-pr.jpg"><img class="aligncenter size-medium wp-image-183" title="soft24-pr" src="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-pr-300x200.jpg" alt="" width="300" height="200" /></a></p>
<p>На этом месте я, пожалуй, остановлюсь, и передам привет девушке Гале, которая с самого начала взяла в свои руки контроль над программистами. Я имел неосторожность в задумчивости прогуляться с кофе в сторону PR-команды, где моя праздношатающаяся личность тут же привлекла внимание:</p>
<blockquote><p>- (Галя) Ти хто?</p>
<p>- (Я) Э-э-э.. с утра был программистом..</p>
<p>- То чого сюди приперся? Іди програмуй!</p>
<p>- Да я это.. да мне бы.. я так, хожу-думаю..</p>
<p>- Думати? Думати можна. Думай.</p></blockquote>
<h3>Старт</h3>
<p>В 10 утра субботы мы запустили на большом экране обратный отсчет и время пошло. Представиться и рассказать о себе и своих скиллах несложно, чуть сложнее ясно описать идею своего приложения (сервиса, программы) в паре фраз. С другой стороны, если идею приложения сложно объяснить &#8211; возможно, оно будет понятно и интересно только узкому кругу людей? За 10 минут stand-up обсуждения идей мы набросали штук 15, потом разбились их на команды и принялись за работу.</p>
<p><a href="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-discuss.jpg"><img class="aligncenter size-medium wp-image-180" title="soft24-discuss" src="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-discuss-300x200.jpg" alt="" width="300" height="200" /></a></p>
<p>Если кто-то не знает &#8211; будучи предоставленными самим себе, разработчики быстро запрягают и не менее быстро едут. Представление, знакомство, обсуждение и выбор идей, формирования команд и согласование инструментов и правил разработки заняло немного времени, и в 12:14 наша команда уже чекинила первые строчки. Поневоле вспоминаются некоторые компании, в которых 3 менеджера на 1 работника.</p>
<blockquote><p>ххх: думаю, очень показательно, что из всех факультетов именно у нас, менеджмента, не получилось организовать вечеринку в честь получения дипломов&#8230; (<a href="http://bash.org.ru/quote/407610" target="_blank">bash.org.ru</a>)</p></blockquote>
<h3>Bare essentials</h3>
<p>Несколько советов тем, кто будет участвовать в подобных проектах. В условиях ограниченного времени на первое место выходит четкая постановка целей, хорошее распределение работы и, конечно, умение быстро писать код. А еще &#8211; умение отсекать ненужное. Кстати, все эти моменты хорошо описаны в книге <a href="http://gettingreal.37signals.com/" target="_blank">Getting Real</a> от известной студии <a href="http://37signals.com/" target="_blank">37signals</a>.</p>
<p><a href="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-board.jpg"><img class="aligncenter size-medium wp-image-181" title="soft24-board" src="http://demiurg.com.ua/blog/wp-content/uploads/2010/08/soft24-board-201x300.jpg" alt="" width="201" height="300" /></a></p>
<p>Для начала набросайте на бумаге список функций, необходимых для первого релиза. Потом посмотрите на написанное критически и, скрепя сердце, вычеркните половину списка. Затем соберитесь с силами и избавьтесь еще от половины. Оставьте только то, без чего ваше приложение совершенно не сможет работать, и приступайте.</p>
<p>Во-вторых, <a href="http://en.wikipedia.org/wiki/Release_early,_release_often" target="_blank">release early, release often</a>. Чем раньше вы получите работающий скелет приложения, чем раньше вы попробуете его в деле, тем скорее определите, что имеет значение для пользователя, а что &#8211; лишь красивые, но бесполезные плюшки. В конце концов, как говорят в Одессе &#8211; &#8220;вам шашечки или ехать&#8221;?</p>
<p>И, наконец, научитесь делить работу. Не толкайтесь локтями на одном участке проекта. Скажем, один человек занимается UI, другой ядром, третий рисует графику. Или один работает над базой, второй тестирует, третий спит. В крайнем случае пишет код один, остальные варят ему кофе и делают массаж. Главное &#8211; не нужно всей толпой набрасываться на один кусок, и уж тем более не нужно добавлять людей в надежде сделать работу быстрее.</p>
<blockquote><p>Assigning more programmers to a project running behind schedule will make it even later, because of the time required for the new programmers to learn about the project, as well as the increased communication overhead. (<a href="http://en.wikipedia.org/wiki/The_Mythical_Man-Month#The_mythical_man-month" target="_blank">The mystical man-month</a>)</p></blockquote>
<h3>Продолжение следует</h3>
<p>На сегодня закончу на этом. Следующая часть через несколько дней.</p>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/FWjW3W0rkMA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2010/08/20/create-software-in-24-hours/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2010/08/20/create-software-in-24-hours/</feedburner:origLink></item>
		<item>
		<title>Pin font и svn-клиенты под Mac OS</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/aeQXaWDVaSY/</link>
		<comments>http://demiurg.com.ua/blog/2010/04/22/pin-font/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 19:25:24 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Anything]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[macos]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=138</guid>
		<description><![CDATA[Pinfont На досуге немного поигрался с django + python, вспомнил молодость. Получился своего рода полный цикл разработки веб-приложения, со скетчами, с несколькими итерациями кода, системой контроля версий (svn) и, в финале, выкатка рабочей версии на &#8220;production&#8221; хостинг. pinfont text generator v0.1 &#124; images by garnenka. Далее о выборе svn-клиента, Mac OS и удобстве пользователя. Version, Cornerstone и [...]]]></description>
			<content:encoded><![CDATA[<h3>Pinfont</h3>
<p style="text-align: left;">На досуге немного поигрался с <a href="http://www.djangoproject.com/" target="_blank">django</a> + python, вспомнил молодость. Получился своего рода полный цикл разработки веб-приложения, со скетчами, с несколькими итерациями кода, системой контроля версий (svn) и, в финале, выкатка рабочей версии на &#8220;production&#8221; хостинг.</p>
<p style="text-align: center;"><a title="pins" href="http://demiurg.com.ua/pinfont/"><img class="aligncenter" src="http://farm5.static.flickr.com/4005/4543501869_cecb955932_o.jpg" alt="pins" width="397" height="166" /></a></p>
<p style="text-align: center;"><a title="pins" href="http://demiurg.com.ua/pinfont/"></a><a href="/pinfont/" target="_self">pinfont text generator v0.1</a> | <em>images by <a href="http://www.flickr.com/photos/rebrom/" target="_blank">garnenka</a>.</em></p>
<p>Далее о выборе svn-клиента, Mac OS и удобстве пользователя.</p>
<p><span id="more-138"></span></p>
<h3>Version, Cornerstone и usability в мелочах</h3>
<p>В процессе работы узнал, какие svn-клиенты существуют под Mac OS (помимо, конечно, командной строки). Соцсоревнование между <a href="http://versionsapp.com/" target="_blank">Versions</a> и <a href="http://www.zennaware.com/" target="_blank">Cornerstone</a> последний выиграл с небольшим отрывом за более удобный интерфейс и предупредительное отношение к пользователю.</p>
<p>Хорошее <a href="http://jadeohlhauser.com/2008/c_vs_v/" target="_blank">сравнение Versions vs. Cornerstone</a> (равно, как и некоторых других клиентов) можно найти у <a href="http://jadeohlhauser.com/">Jade Ohlhauser</a>. Теме выбора клиента также посвящено <a href="http://stackoverflow.com/questions/899/best-subversion-client-for-mac-os" target="_blank">обсуждение на Stackoverflow</a> и даже статья <a href="http://en.wikipedia.org/wiki/Comparison_of_Subversion_clients" target="_blank">Comparison of Subversion clients</a> на Wikipedia.</p>
<p>Лирическое отступление. Хочу отметить, что удобству в мелочах уделяют внимание многие хорошие программы под Mac OS. В упомянутом уже Cornerstone, например, диалог подключения к новому репозиторию бережно распарсил скопированный мной в клипборд url репозитория:</p>
<p style="text-align: center;"><a href="http://demiurg.com.ua/blog/wp-content/uploads/2010/04/Screen-shot-2010-04-22-at-23.04.30-.png"><img class="size-medium wp-image-140  aligncenter" title="Cornerstone Add Repository" src="http://demiurg.com.ua/blog/wp-content/uploads/2010/04/Screen-shot-2010-04-22-at-23.04.30--250x300.png" alt="" width="250" height="300" /></a></p>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/aeQXaWDVaSY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2010/04/22/pin-font/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2010/04/22/pin-font/</feedburner:origLink></item>
		<item>
		<title>Bit counting, обзор методов</title>
		<link>http://feedproxy.google.com/~r/dreamiurg/~3/VGCrzBUbRBM/</link>
		<comments>http://demiurg.com.ua/blog/2010/04/11/bit-counting/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 18:25:32 +0000</pubDate>
		<dc:creator>Dmitry Guyvoronsky</dc:creator>
				<category><![CDATA[Anything]]></category>
		<category><![CDATA[Russian]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://demiurg.com.ua/blog/?p=121</guid>
		<description><![CDATA[Одна из классических задач в программировании (по крайней мере, о способах ее решения упоминает Дональд Кнут в своем классическом труде) &#8211; подсчет выставленных в &#8220;1&#8243; бит в числе. Зачем? Почему эта задача важна? Во-первых, она интересна сама по себе &#8211; есть несколько способов решения, которые кардинально отличаются производительностью и выбор правильной реализации может значительно ускорить [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright wp-image-128" title="binary-pillow" src="http://demiurg.com.ua/blog/wp-content/uploads/2010/04/binary-pillow.jpg" alt="" width="200" />Одна из классических задач в программировании (по крайней мере, о способах ее решения упоминает Дональд Кнут в своем <a href="http://en.wikipedia.org/wiki/The_Art_of_Computer_Programming" target="_blank">классическом труде</a>) &#8211; подсчет выставленных в &#8220;1&#8243; бит в числе.</p>
<h3>Зачем?</h3>
<p>Почему эта задача важна? Во-первых, она интересна сама по себе &#8211; есть несколько способов решения, которые кардинально отличаются производительностью и выбор правильной реализации может значительно ускорить ваш код. Во-вторых, у нее много практических применений &#8211; например, в протоколах маршрутизации или <a href="http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20000038731_2000043852.pdf">поиска</a>. И, в-третьих, она <a href="http://www.google.com/search?q=interview+questions+bit+counting" target="_blank">встречается</a> на собеседованиях в крупных компаниях, так что будет не лишним немного освежить свои знания.</p>
<p>Поиск в сети даст достаточно подробностей, здесь же я хочу привести краткую сводку фактов.</p>
<p>Методы подсчета можно условно разделить на три области &#8211; <strong>shifting</strong>, <strong>algebraic logic </strong>и <strong>table lookup</strong>.</p>
<p><span id="more-121"></span></p>
<h3>Shifting</h3>
<p>С первыми, в принципе, все понятно &#8211; они занимаются посчетом битов в числе, постепенно сдвигая его вправо. Небольшие вариации (обнуление самого правого единичного бита вместо сдвига всего числа) могут дать выигрыш в скорости, если заранее известно, что в данных преобладают &#8220;0&#8243; или, наоборот, &#8220;1&#8243;. В целом, это самая медленная группа методов подсчета.</p>
<h3>Algebraic logic</h3>
<p>Методы этой группы основаны различных математических операциях, например, на группировке битов внутри числа в несколько проходов. Так, один из методов сначала разбивает биты в числе попарно, переводя кол-во единиц в каждой паре в бинарное представление (00 -&gt; 00, 01 -&gt; 01, 10 -&gt; 01, 11 -&gt; 10), потом по 4 бита, 8 и так далее. Группа методов работает в среднем в несколько (у меня &#8211; порядка 4) раз быстрее, чем итеративный подсчет.</p>
<h3>Table lookup</h3>
<p>Наконец, последняя группа методов сначала строит таблицы вида [число]-&gt;[количество выставленных в "1" битов] и потом пользуется ими для быстрого получения значения. Варьируется  в основном только размер таблиц (8-16-&#8230; бит). Эти методы самые быстрые, особенно на больших объемах данных, когда потери времени на расчет таблиц незначительны по сравнению со временем самого подсчета.</p>
<h3>Сравнение производительности</h3>
<p>Вот конкретные результаты прогона различных алгоритмов на моей машине (Darwin Kernel Version 10.3.0, Intel Core 2 Duo 2.26 GHz). Собрано с оптимизацией под скорость (-O3 и еще куча опций). Исходники - <a href="https://github.com/dreamiurg/bitcount" target="_blank">https://github.com/dreamiurg/bitcount</a>.</p>
<pre class="brush: bash; title: ; notranslate">
8-bit lookup table calculation took 0.32 ms
16-bit lookup table calculation took 2.34 ms

---&gt; Shitfing methods
Iterated        4.646 sec   21.524 Mcps
Sparse          3.475 sec   28.775 Mcps
Dense           3.670 sec   27.251 Mcps

---&gt; Algebraic methods
Parallel        1.172 sec   85.328 Mcps
Nifty           1.204 sec   83.083 Mcps
Hakmem          1.217 sec   82.193 Mcps

---&gt; Table lookup methods
Precomp 8       0.732 sec  136.684 Mcps
Precomp 16      0.688 sec  145.268 Mcps
</pre>
<p>Как видим, самый медленный метод отличается от самого быстрого практически <strong>в 7 раз</strong>, при этом потери на создание таблиц минимальны и измеряются миллисекундами.</p>
<h4>Дальнейшее чтение</h4>
<p>Конкретные алгоритмы легко найти в сети. Среди хороших ресурсов для начала &#8211; статья &#8220;<a href="http://gurmeetsingh.wordpress.com/2008/08/05/fast-bit-counting-routines/" target="_self">Puzzle: Fast Bit Counting</a>&#8220;, к ней и отсылаю к ней за деталями. Кроме того, обратите внимание на статью &#8220;<a href="http://graphics.stanford.edu/~seander/bithacks.html" target="_blank">Bit Twiddling Hacks</a>&#8220;, которая содержит море полезной информации по различным операциям над битами и битовыми массивами.</p>
<img src="http://feeds.feedburner.com/~r/dreamiurg/~4/VGCrzBUbRBM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://demiurg.com.ua/blog/2010/04/11/bit-counting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://demiurg.com.ua/blog/2010/04/11/bit-counting/</feedburner:origLink></item>
	</channel>
</rss>

