<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Владимир Чижов &#187; Технологии</title>
	<atom:link href="http://vladimir-chizhov.ru/categories/technologies/feed/" rel="self" type="application/rss+xml" />
	<link>http://vladimir-chizhov.ru</link>
	<description>Мизантроп и латентный диссидент</description>
	<lastBuildDate>Tue, 06 Apr 2010 11:44:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>R.I.P.</title>
		<link>http://vladimir-chizhov.ru/2009/12/rip-computerra/</link>
		<comments>http://vladimir-chizhov.ru/2009/12/rip-computerra/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 20:21:34 +0000</pubDate>
		<dc:creator>Vladimir Chizhov</dc:creator>
				<category><![CDATA[Общество]]></category>
		<category><![CDATA[Технологии]]></category>

		<guid isPermaLink="false">http://vladimir-chizhov.ru/?p=358</guid>
		<description><![CDATA[В дополнение к предыдущему «всхлипу». Днём позже приходит новость о том, что через неделю мы расстанемся с любимой Компьютеррой. Было много хорошего, много плохого. В этом балансе поочерёдно побеждали обе стороны. Но ни одна из них никогда не опускалась ниже оп­ре­делён­но­го уровня. Фтыкайте дальше в свой космо и не за­пари­вай­тесь. Ваша жизнь уже сложилась. Сложилась прекрасно. Также и закончится, я уверен. Не начавшись.]]></description>
			<content:encoded><![CDATA[<p>В дополнение к <a href="http://vladimir-chizhov.ru/2009/12/trends-show/" target="_blank">предыдущему «всхлипу»</a>.</p>
<p>Днём позже <a href="http://exler.livejournal.com/1133580.html" target="_blank">приходит новость</a> о том, что через неделю мы расстанемся с любимой <a href="http://www.computerra.ru" target="_blank">Компьютеррой</a>. Было много хорошего, много плохого. В этом балансе поочерёдно побеждали обе стороны. Но ни одна из них никогда не опускалась ниже оп­ре­делён­но­го уровня.</p>
<p>Фтыкайте дальше в свой космо и не за­пари­вай­тесь. Ваша жизнь уже сложилась. Сложилась прекрасно. Также и закончится, я уверен.</p>
<p>Не начавшись.</p>
]]></content:encoded>
			<wfw:commentRss>http://vladimir-chizhov.ru/2009/12/rip-computerra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Врезка&#8221; на чистом XSLT</title>
		<link>http://vladimir-chizhov.ru/2009/06/insertion-in-pure-xslt/</link>
		<comments>http://vladimir-chizhov.ru/2009/06/insertion-in-pure-xslt/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 20:43:28 +0000</pubDate>
		<dc:creator>Vladimir Chizhov</dc:creator>
				<category><![CDATA[Технологии]]></category>

		<guid isPermaLink="false">http://vladimir-chizhov.ru/?p=265</guid>
		<description><![CDATA[А вы знаете, как средствами XSLT вставить в «выходной» документ содержимое внешнего XML-файла в виде текста? Если не знаете, могу подсказать:) &#60;xsl:text disable-output-escaping="yes"&#62;&#38;lt;![CDATA[&#60;/xsl:text&#62; &#60;xsl:copy-of select="document(./@src)"/&#62; &#60;xsl:text disable-output-escaping="yes"&#62;]]&#38;gt;&#60;/xsl:text&#62;]]></description>
			<content:encoded><![CDATA[<p>А вы знаете, как средствами <acronym title="The Extensible Stylesheet Language Transformations" lang="en">XSLT</acronym> вставить в «выходной» документ содержимое внешнего XML-файла в виде текста? Если не знаете, могу подсказать:)</p>
<pre>&lt;xsl:text disable-output-escaping="yes"&gt;&amp;lt;![CDATA[&lt;/xsl:text&gt;
  &lt;xsl:copy-of select="document(./@src)"/&gt;
&lt;xsl:text disable-output-escaping="yes"&gt;]]&amp;gt;&lt;/xsl:text&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://vladimir-chizhov.ru/2009/06/insertion-in-pure-xslt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git и русские имена файлов</title>
		<link>http://vladimir-chizhov.ru/2009/06/git-and-russian-filenames/</link>
		<comments>http://vladimir-chizhov.ru/2009/06/git-and-russian-filenames/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 20:31:51 +0000</pubDate>
		<dc:creator>Vladimir Chizhov</dc:creator>
				<category><![CDATA[Технологии]]></category>
		<category><![CDATA[cyrillic]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[rtfm]]></category>
		<category><![CDATA[русский]]></category>

		<guid isPermaLink="false">http://vladimir-chizhov.ru/?p=262</guid>
		<description><![CDATA[Развлечения ради использую для нужд ведения личных «проектов» расп­ре­делён­ную систему контроля версий git. Просто для того, чтобы «по ходу дела» с ней поближе поз­на­комить­ся. И сразу же я столкнулся с уди­витель­ным для сегодняшних времён поведением — русские имена файлов отоб­ра­жались в нечитаемом виде. Простое русское «привет» выглядело как: "\320\277\321\200\320\265\320\262\320\265\320\264" Но удивительно не столько это, а то, что как я ни старался, я не смог найти в сети решение этой проблемы [...]]]></description>
			<content:encoded><![CDATA[<p>Развлечения ради использую для нужд ведения личных «проектов» <a href="http://vladimir-chizhov.ru/2009/04/dvcs-and-dags/" target="_blank">расп­ре­делён­ную систему контроля версий</a> git. Просто для того, чтобы «по ходу дела» с ней поближе поз­на­комить­ся. И сразу же я столкнулся с уди­витель­ным для сегодняшних времён поведением — русские имена файлов отоб­ра­жались в нечитаемом виде. Простое русское «привет» выглядело как:</p>
<pre>"\320\277\321\200\320\265\320\262\320\265\320\264"</pre>
<p>Но удивительно не столько это, а то, что как я ни старался, я не смог найти в сети решение этой проблемы (а для меня это дей­стви­тель­но проблема, так как в одном из «проектов» русские имена файлов ис­поль­зу­ют­ся активно и обоснованно, т. е. отказаться от них невозможно). Пришлось применить принцип RTFM в самом примитивном виде — открыть <tt>man git-config</tt> и читать от корки до… до второй корки было ещё очень далеко и решение, к счастью, об­на­ружи­лось достаточно быстро: опция <tt>core.quotepath</tt> — вот то, что было нужно мне и, возможно, пригодится кому-то ещё.</p>
]]></content:encoded>
			<wfw:commentRss>http://vladimir-chizhov.ru/2009/06/git-and-russian-filenames/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DVCS and DAGs</title>
		<link>http://vladimir-chizhov.ru/2009/04/dvcs-and-dags/</link>
		<comments>http://vladimir-chizhov.ru/2009/04/dvcs-and-dags/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 09:44:10 +0000</pubDate>
		<dc:creator>Vladimir Chizhov</dc:creator>
				<category><![CDATA[Технологии]]></category>

		<guid isPermaLink="false">http://vladimir-chizhov.ru/?p=242</guid>
		<description><![CDATA[Перевод статьи Эрика Синка (Eric Sink) — DVCS and DAGs (Part 1 and Part 2). Прим. переводчика: В этой статье я буду ис­поль­зо­вать ори­гиналь­ные анг­ло­языч­ные сокращения DVCS и DAG для обозначения расп­ре­делён­ных систем контроля версий (Distributed Version Control System — DVCS) и нап­равлен­ных ацикличных графов (Directed Acyclic Graph — DAG). Часть 1 Есть две категории людей: Те, кто пытается делить всё на две [...]]]></description>
			<content:encoded><![CDATA[<p><em>Перевод статьи Эрика Синка (Eric Sink) — DVCS and DAGs (<a href="http://www.ericsink.com/entries/dvcs_dag_1.html" target="_blank">Part 1</a> and <a href="http://www.ericsink.com/entries/dvcs_dag_2.html" target="_blank">Part 2</a>).</em></p>
<p><em>Прим. переводчика: В этой статье я буду ис­поль­зо­вать ори­гиналь­ные анг­ло­языч­ные сокращения DVCS и DAG для обозначения расп­ре­делён­ных систем контроля версий (Distributed Version Control System — DVCS) и нап­равлен­ных ацикличных графов (Directed Acyclic Graph — DAG).</em><br />
<span id="more-242"></span></p>
<h3>Часть 1</h3>
<p>Есть две категории людей:</p>
<ol>
<li>Те, кто пытается делить всё на две категории.</li>
<li>Те, кто этого не делает.</li>
</ol>
<p>Я один из первых. :-)</p>
<p>Есть две категории систем контроля версий:</p>
<ol>
<li>Те, в которых история — это Линия.</li>
<li>Те, в которых история — это Нап­равлен­ный Ацикличный Граф (DAG).</li>
</ol>
<p>Тра­дици­он­ные инструменты (такие как Subversion и Vault) тяготеют к ведению истории как Линии. В DVCS (таких как Git и Mercurial) история — это DAG. Разница между этими двумя моделями довольно интересна.</p>
<p>Линейная модель испытана и работает. История — это пос­ле­дова­тель­ность версий, одна за другой.<br />
<img class="aligncenter size-full wp-image-246" title="1761_image001" src="http://vladimir-chizhov.ru/wp-content/uploads/2009/04/1761_image001.jpg" alt="1761_image001" width="500" height="100" /></p>
<p>Чтобы создать новую версию необходимо:</p>
<ol>
<li>Получить последнюю версию.</li>
<li>Внести изменения.</li>
<li>За­фик­си­ровать (<em>commit</em>) сделанные изменения.</li>
</ol>
<p>Люди любят линейную модель за её простоту. Она даёт точный ответ на вопрос, какая версия является последней.</p>
<p>Но у линейной модели есть одна большая проблема: вы можете создать новую версию только в том случае, если она основана на последней версии. И часто случается следующее:</p>
<ol>
<li>Я получаю из репозитория последнюю версию. В момент, когда я её получил, это была версия 3.</li>
<li>Я вношу туда каике-то изменения.</li>
<li>Пока я это делаю, кто-то создаёт версию 4.</li>
<li>Когда я собираюсь за­фик­си­ровать мои изменения, я не могу этого сделать, так как они не основаны на текущей версии. «Базой» для моих изменений была версия 3, которая была актуальной на тот момент, когда я начал работу.</li>
</ol>
<p><img class="aligncenter size-full wp-image-247" title="1761_image002" src="http://vladimir-chizhov.ru/wp-content/uploads/2009/04/1761_image002.jpg" alt="1761_image002" width="500" height="175" /></p>
<p>Линейная модель истории не позволит мне создать версию 5 так, как показано на картинке. Вместо этого я буду вынужден получить изменения, сделанные от 3-ей к 4-й версии, и «слить» их со своей версией.</p>
<p>Очевидный вопрос: Что случится, если мы разрешим за­фик­си­ровать 5-ю версию на основе 3-ей? Наша история перестанет быть Линией. И превратится в DAG.</p>
<p>А почему мы должны это делать?</p>
<p>Основным пре­иму­щест­вом DAG-модели в том, что она не прерывает раз­ра­бот­чи­ка в тот момент, когда он пытается за­фик­си­ровать результат своей работы. В этом плане DAG — это, возможно, более точное отражение того, что реально происходит в команде, прак­ти­ку­ющей па­рал­лель­ную разработку (<em>здесь использован не совсем точный перевод термина «concurrent development», в котором акцент делается на том, что параллельно про­из­во­димые раз­ра­бот­чи­ками изменения часто делаются в одном и том же коде и часто конфликтуют — прим. пер.</em>). Версия 5 была основана 3-ей, так почему бы не отразить этот факт?</p>
<p>Правда, выясняется, что есть причины этого не делать. В этом графе мы не знаем, какая версия «последняя». И это приводит ко множеству проблем:</p>
<ul>
<li>Предположим, нам нужны изменения в версиях 4 и 5 для выпуска релиза. В данный момент мы не можем этого получить. В системе нет версии, которая включала бы оба набора изменений.</li>
<li>Наша система сборки настроена на ав­то­мати­чес­кую сборку последней версии. Что она должна делать в этой ситуации?</li>
<li>Даже если мы соберём обе версии, 4-ю и 5-ю, какая из них должна быть передана в QA для тес­ти­рова­ния?</li>
<li>Если разработчик хочет обновить своё дерево до последней версии, какую из них ему предпочесть?</li>
<li>Когда разработчик хочет сделать какие-то изменения, какую версию он должен взять за основу?</li>
<li>Наш менеджер проекта хочет знать, какие задачи выполнены и сколько работы ещё осталось сделать. Его понимание «сделано» очень тесно связано с понятием «последний». Если он не может понять, какая версия последняя, его мозг плавится в попытках обновить диаграмму Гантта.</li>
</ul>
<p>Да, это печальная картина. Мир, такой, каким мы его знаем, буквально рушится у нас на глазах.</p>
<p>Дабы избежать со­сущест­во­вания собак и кошек в состоянии непрерывной массовой истерии, средства, ис­поль­зу­ющие DAG-модель ведения истории, делают всё возможное, чтобы помочь нам разрешить путаницу. Ответ тот же, что и для линейной модели — нам нужно слияние (<em>merge</em>). Но вместо того, чтобы требовать от раз­ра­бот­чи­ка делать слияние перед фиксацией изменений, мы позволяем сделать это слияние позднее.</p>
<p><img class="aligncenter size-full wp-image-248" title="1761_image003" src="http://vladimir-chizhov.ru/wp-content/uploads/2009/04/1761_image003.jpg" alt="1761_image003" width="500" height="174" /></p>
<p>Кому-то требуется создать версию, включающую все изменения, сделанные в версиях 4 и 5. Когда эта версия будет за­фик­си­рова­на, она будет содержать стрелки, указывающие на обеих её «родителей».</p>
<p>Порядок восс­та­нов­лен. Мы снова знаем, какая из версий «последняя». Если кто-нибудь вспомнит о том, что надо бы пе­резаг­ру­зить нашего менеджера, он скорее всего тут же сообразит, что этот граф выглядит почти как линия. И за исключением того, что между версиями 3 и 6 случилось что-то непонятное и запутанное, <em>это и есть</em> Линия. Но самое лучшее для нашего менеджера — сильно не переживать по этому поводу.</p>
<p>Чего этот менеджер не знает, так это того, что данный конкретный кризис — мелочь. Он думает, что его старая парадигма полностью разрушена, но в один прекрасный день он придёт в офис и обнаружит вот это:<br />
<img class="aligncenter size-full wp-image-249" title="1761_image004" src="http://vladimir-chizhov.ru/wp-content/uploads/2009/04/1761_image004.jpg" alt="1761_image004" width="500" height="353" /></p>
<p>&amp;@#!</p>
<p>И что теперь?</p>
<p>Если вы живёте в рамках линейной модели, этот граф для вас — абсолютный кошмар. У него ЧЕТЫРЕ оконечных узла. Всё, что требует понимания того, какая версия является последней, обречено на провал, включая вы­ше­опи­сан­но­го менеджера, который сейчас, вероятно, свернулся калачиком в своём кабинете и надеется, что мама не забыла положить ему любимые печенюшки к макаронам.</p>
<p>Линейная модель выглядит в такие моменты весьма прив­ле­катель­ной. И это хорошее обоснование того, что 99,44% раз­ра­бот­чи­ков используют SCM-средства, основанные на линейной модели ведения истории (да, я собирал такую статистику).</p>
<p>Но всё же, несмотря на весь этот очевидный хаос, мы должны напомнить себе об основном пре­иму­щест­ве DAG-модели: она более точно описывает реальный ход дел в работе прог­раммис­та. Она не заставляет раз­ра­бот­чи­ков прогибаться под свои желания, как это делает линейная модель. Когда разработчик хочет что-то за­фик­си­ровать — он это делает. И DAG попросту записывает ровно то, что дей­стви­тель­но произошло.</p>
<p>Многие команды всегда будут пред­по­читать линейную модель. И в этом нет ничего плохого. Жизнь проще при таком подходе.</p>
<p>Но для некоторых других команд DAG-модель может оказаться весьма полезной. А каким-то командам она вообще может достаться «в нагрузку». Просто потому, что им потребуется ис­поль­зо­вать DVCS по каким-то иным причинам. DVCS-средства используют DAG-модель потому, что у них нет выбора. Если мы не можем пред­по­лагать наличия постоянного соединения с центральным сервером, у нас нет другого пути и мы не можем заставить раз­ра­бот­чи­ков вписывать всю свою работу в линейную модель.</p>
<p>Поэтому нам нужно найти пути, как управляться с DAG. И как же нам быть?</p>
<p>Один из вариантов — это рест­рук­ту­риро­вать каждую операцию. Если вы говорите доктору «это настоящая пытка, когда возникает не­об­хо­димость определить последнюю версию», доктор скажет вам «прекратите пытаться это делать». Вместо этого всегда точно указывайте, какой узел ис­поль­зо­вать:</p>
<ul>
<li>Система сборки не собирает последний узел. Вместо этого она собирает ровно тот, который мы ей укажем. Или, может быть, она собирает каждый узел.</li>
<li>QA тестирует те сборки, которые кто-то считает необходимым про­тес­ти­ровать.</li>
<li>Раз­ра­бот­чи­ки не обновляют своё дерево до «последнего». Вместо этого, они смотрят на граф, выбирают узел, и обновляются до него.</li>
</ul>
<p>Я не говорю, что этот подход це­лесо­об­ра­зен. Я всего навсего хочу заметить, что он <em>те­оре­тичес­ки</em> корректен. До тех пор, пока вы в состоянии точно указать узел, который вы хотите ис­поль­зо­вать, каждая из этих операций может быть выполнена.</p>
<p>Но как нам указать узел? Одно из обс­то­ятель­ств, которое делает этот подход проб­ле­матич­ным, — это то, что эти узлы часто имеют сложные имена. К примеру, в Git имя узла — это что-то вроде <tt>e69de29bb2d1d6434b8b29ae775ad8c2e48c5391</tt>. Раз­ра­бот­чи­ки находят такой способ именования не слишком интуитивно-понятным.</p>
<p>Все DVCS-средства используют DAG. И все они делают много разных вещей, чтобы-либо пре­дотв­ра­тить «кризис мно­жест­вен­ных оконечных узлов», либо помочь команде управляться с этим. Но все они делают это немного по-своему.</p>
<p>К счастью, это даёт мне удобную возможность разделить их все на 2 группы:</p>
<ol>
<li>Те, которые решают эту проблему тем способом, который мне нравится.</li>
<li>И те, которые решают эту проблему тем способом, который мне не нравится.</li>
</ol>
<h3>Часть 2</h3>
<p>На первую часть этой статьи я получил два вида зас­лу­жива­ющих внимания отзывов (<em>Эрик Синк, автор ори­гиналь­ной статьи, опубликовал её в двух частях с разницей во времени в одну неделю, чем и объясняется наличие реакции читателей отдельно на её первую часть — прим. пер.</em>):</p>
<ol>
<li>Несколько людей обвинили меня в расп­рос­тра­нении страха, не­уве­рен­ности и сомнений (<em>в оригинале автор использует расп­рос­тра­нён­ную сленговую абб­ре­ви­ату­ру FUD — Fear Uncertainly and Doubt, не имеющую прямого аналога в русской речи, — прим. пер.</em>) в отношении линейной модели, потому как я лишь вскользь упомянул о проблемах с DAG-моделью и остановился буквально в шаге от того, чтобы заявить, что DAG-модель может стать лекарством от рака, остановить глобальное потепление и принести мир и спокойствие на Ближний Восток.</li>
<li>Некоторые люди спрашивали, как я нарисовал такие классные диаграммы.</li>
</ol>
<p>Прежде, чем начать вторую часть, позвольте кратко ответить на оба этих отзыва.</p>
<h4>Мой ответ в защиту DVCS</h4>
<p>Да, моя компания (<em><a href="http://www.sourcegear.com/" target="_blank">SourceGear</a>, — прим. пер.</em>) раз­ра­баты­ва­ет систему контроля версий (Vault), основанную на линейной модели ведения истории. Поэтому любая DVCS — это, в оп­ре­делён­ной степени, прямой конкурент моему продукту.</p>
<p>Я прекрасно сознаю, что нарушаю целый ряд правил:</p>
<ul>
<li>Предс­та­вите­лям бизнес-об­щест­вен­ности, таким как я, не полагается говорить что-либо хорошее о своих конкурентах.</li>
<li>Наша работа — бояться изменений и расп­рос­тра­нять этот страх среди других.</li>
<li>Нам полагается делать вид, что мы не знаем о том, что любой выбор имеет свои побочные эффекты, и утверждать, что наш вариант лучше в любой ситуации.</li>
</ul>
<p>Моя мама с лёгкостью подтвердит, что я не всегда хорошо соблюдаю правила:-)</p>
<p>Просто дело в том, что я нахожу эту тему интересной. Я проработал в индустрии контроля версий более десяти лет. Я пишу книгу на эту тему. Вот что я делаю. Вот что мне интересно.</p>
<p>На самом деле.</p>
<p>Но здесь происходит нечто большее, чем просто я в роли ка­пита­лис­ти­чес­ко­го мятежника.</p>
<p><em>Фанаты Git, вам стоит немного остыть.</em></p>
<p>Серьёзно, ярые защитники Git делают этот мир непригодным для жизни. Git в самом деле отличная штука, но просто он не является правильным выбором во всех без исключения ситуациях.</p>
<p>В их защиту надо признать, что в этом вопросе яблоко от яблони упало недалеко. Когда люди начинают ин­те­ресо­вать­ся DVCS, одной из первых вещей, на которую они натыкаются, становится <a href="http://www.youtube.com/watch?v=4XpnKHJAok8" target="_blank">видео</a> с пре­зен­та­ци­ей Линуса Торвальдса о Git, записанное в 2007-м году. И там они видят человека, который, кажется, тоже этого не понимает.</p>
<p>Парни, Subversion — это, возможно, самое популярное на данный момент средство контроля версий в мире. Без малого каждый, кто использует систему контроля версий сегодня, использует ту, что основана на линейной модели ведения истории. И они используют эти средства успешно и продуктивно. Когда кто-то от­ка­зыва­ет­ся признавать какую-либо пригодность этой модели, они выглядят неумными.</p>
<p>Видео Торвальдса наделало много вреда. Такая позиция — это большое ра­зоча­рова­ние для людей, ин­те­ресу­ющих­ся тем, что нового появляется в мире контроля версий.</p>
<p>Поэтому, мои дорогие почитатели Git, если вы пытаетесь пре­дос­те­речь людей от ис­поль­зо­вания DVCS и хотите быть уверенными в том, что они не изменят своим сегодняшним подходам, тогда можете продолжать в том же духе, у вас отлично получается.</p>
<p>Но если вы в самом деле хотите помочь миру увидеть пре­иму­щест­ва Git и аналогичных средств, тогда осознайте, что люди делали свою работу продуктивно и до их появления.</p>
<h4>Мой ответ по поводу тех классных диаграмм</h4>
<p>Эти картинки были нарисованы художником-ил­люст­ра­тором компании SourceGear, Джоном Вулли (John Woolley), который также создал все иллюстрации к <a href="http://www.sourcegear.com/TEM/TEMcomic.html" target="_blank">книге комиксов «Evil Mastermind»</a>. Всю офор­ми­тель­скую работу и создание иллюстраций для моей готовящейся к выходу книге об управлении исходными кодами также делает Джон.</p>
<p>Тем не менее, поскольку картинки Джона получили гораздо больше похвалы, чем моя «тысяча слов», я решил поз­лобс­тво­вать и отказался включать какие-либо его иллюстрации во вторую часть статьи. :-)</p>
<h4>ОК, давайте побольше поговорим про графы</h4>
<p>Как я уже говорил в первой части, если DAG-у позволить расти без всякого управления, всё может прев­ра­тить­ся в настоящую неразбериху. DAG-и проще создавать. Линии проще ис­поль­зо­вать. Как только мы начинаем по максимуму ис­поль­зо­вать DAG-модель, чтобы за­дей­ство­вать все её пре­иму­щест­ва, следующее, что сразу же происходит — нам хочется вернуть Линии обратно.</p>
<p>Вот почему в любой DVCS есть возможности, которые могут быть ис­поль­зо­ваны для того, чтобы рост DAG-а был управляемым. Эти возможности придуманы для того, чтобы помешать раз­ра­бот­чи­кам фиксировать изменения, избегая при этом всякой от­ветс­твен­ности за порождаемую за­путан­ность, которая растёт каждый раз, когда мы создаём новую точку ветвления.</p>
<p>Другими словами, каждая DVCS содержит возможности, которые позволяют раз­ра­бот­чи­ками взять фрагмент графа и трактовать его как линию.</p>
<h4>Git</h4>
<p>Git управляет ростом DAG-а путём поддержки именованных веток (<em>branches</em>). Вы лишены возможности за­фик­си­ровать изменения, если их «родитель» — не оконечный узел («лист»).</p>
<p>Таким образом, если я использую команду Git <tt>checkout</tt>, чтобы обновить мою рабочую копию репозитория до узла, не являющегося оконечным, Git проявляет вежливую заботу обо мне:</p>
<pre>eric$ git checkout 9542b
Note: moving to "9542b" which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b
HEAD is now at 9542b5f... initial</pre>
<p>Если вы фиксируете изменения, всегда основанные только на оконечном узле, то ваша история остаётся очень похожей на линию.</p>
<h4>Mercurial</h4>
<p>Исторически, Mercurial описывался как под­держи­ва­ющий только одну ветку на один репозиторий. Сравнения с Git часто фо­куси­рова­лись на очевидном недостатке — отсутствии поддержки ветвления внутри одного репозитория (<em>здесь перевод не со­от­ветс­тву­ет ори­гиналь­но­му тексту, так как в ком­мента­ри­ях к статье автор признал наличие опечатки в этом месте, — прим. пер.</em>).</p>
<p>Я говорю в прошедшем времени, так как я слышал, что в Mercurial добавлены некоторые возможности в этой области.</p>
<p>Я упомянул Mercurial здесь, чтобы не оставить и его фанатов в стороне. Я не могу говорить с позиции большого опыта работы с этой системой.</p>
<p>Но всё же я считаю возможным упоминать Mercurial как подт­вер­жде­ние моей точки зрения: в ранних (по меньшей мере) версиях Mercurial управлял ростом графа, препятствуя его ветвлению. К тому же, это спо­собс­тво­вало всеобщему восприятию Mercurial как очень простого в ис­поль­зо­вании средства.</p>
<h4>Bazaar</h4>
<p>Этот инструмент — это DVCS, которую я использовал больше всего, но я всё же не могу пока считать себя экспертом по ней. По моему опыту, я бы оха­рак­те­ризо­вал Bazaar как систему, которая усердно трудится над контролем за ростом DAG-а.</p>
<p>Каждый раз, когда я пытаюсь отправить изменения из моего локального репозитория на центральный сервер, Bazaar требует от меня сделать слияние с другими изменениями из оконечного узла. Ровно так же, как сделала бы любая система с линейной моделью.</p>
<p>Но, что пожалуй здорово, Bazaar даёт мне возможность не ис­поль­зо­вать центральный сервер, как настоящая DVCS. Но в этом режиме действуют те же самые ключевые ограничения: я не могу за­фик­си­ровать какие-либо изменения, если они не основаны на конечном узле в репозитории.</p>
<p>Когда я использую Bazaar, я испытываю ощущение, что использую средство с линейной моделью.</p>
<h4>Мои пред­почте­ния</h4>
<p>В этом отношении мне ближе всего подход Git к решению этой проблемы.</p>
<p>Bazaar, похоже, верит в то, что ветвление DAG-а допустимо только в том случае, если оно происходит в отдельных экземплярах репозитория, и должно быть устранено прежде, чем изменения из одного репозитория будут перенесены в другой.</p>
<p>Мне нравится способность Git переключать мою локальную копию репозитория через команду <tt>«git checkout имя_ветки»</tt>. Я понимаю, что людям, не привыкшим к постоянной мысли о DAG-е, эта возможность кажется непонятной. Но мне она нравится.</p>
<p>Попрошу заметить, что мне по-прежнему нравятся средства с линейной моделью, такие как Subversion и Vault. Я просто хочу сказать, что средство с DAG-моделью должно действовать похожим образом.</p>
<h4>Fossil</h4>
<p>DVCS, которая в последнее время интригует меня больше всего — это <a href="http://fossil-scm.org/index.html/doc/tip/www/index.wiki" target="_blank">Fossil</a>. Она написана Ричардом Хиппом (D. Richard Hipp), создателем <a href="http://sqlite.org/" target="_blank">SQLite</a>.</p>
<p>У Fossil есть ряд интересных воз­можнос­тей. Наиболее су­щест­вен­ная — это встроенная поддержка баг-трекинга. Это область, в которой все остальные DVCS уступают ей. Они дают вам расп­ре­делён­ное управление версиями, но когда приходит время раз­ра­бот­чи­ку обновить информацию в баг-трекере, мир снова становится цент­ра­лизо­ван­ным.</p>
<p>Так или иначе, я пока только лишь начинаю пристально прис­матри­вать­ся к Fossil, но мне нравится как на его сайте описана проблема ветвления:</p>
<blockquote><p>Иметь в дереве более одного оконечного узла обычно считается не­жела­тель­ным, поэтому обычно ветвлений либо полностью избегают, как на рис. 1, либо быстро устраняют, как на рис. 3 (<em>имеются ввиду рисунки в этой статье, а не на сайте fossil, — прим. пер.</em>). Но иногда кому-то требуется иметь несколько оконечных узлов. К примеру, проект может иметь один конечный узел, который предс­тав­ля­ет последнюю версию раз­ра­баты­ва­емой версии продукта, а второй узел — последнюю «стабильную» (про­тес­ти­рован­ную) версию. Когда несколько оконечных узлов це­лесо­об­разны — мы называем это ветвлением, а не форком. (<em>Тут важно по­чувс­тво­вать разницу между анг­ло­языч­ны­ми терминами branch и fork. Автор хочет подчеркнуть по­ложи­тель­ный смысл термина branch (ветка) и в какой-то степени от­ри­цатель­ный характер форка (fork), — прим. пер.</em>).</p></blockquote>
<p>Прекрасно. В результате у меня создалось впечатление, что Fossil в этом отношении работает аналогично Git. Когда DAG раз­ветв­ля­ет­ся, сложность уве­личи­ва­ет­ся.</p>
]]></content:encoded>
			<wfw:commentRss>http://vladimir-chizhov.ru/2009/04/dvcs-and-dags/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML-&gt;text</title>
		<link>http://vladimir-chizhov.ru/2008/07/html2text/</link>
		<comments>http://vladimir-chizhov.ru/2008/07/html2text/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 21:01:15 +0000</pubDate>
		<dc:creator>Vladimir Chizhov</dc:creator>
				<category><![CDATA[Технологии]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://vladimir-chizhov.ru/?p=15</guid>
		<description><![CDATA[Задача: подручными средствами из HTML-кода страницы получить максимально простое (но пригодное для человеческого восприятия) текстовое представление (с разбиением на абзацы, форматированием списков и т.п.). Решение: xsltproc (часть пакета libxslt в большинстве дистрибутивов Linux); XSL-шаблон в полсотни строк, включая достаточно подробные комментарии, на написание которого был потрачен дождливый питерский вечер. Небольшой нюанс: запускать xsltproc нужно с [...]]]></description>
			<content:encoded><![CDATA[<p>Задача: подручными средствами из HTML-кода страницы получить максимально простое (но пригодное для человеческого восприятия) текстовое представление (с разбиением на абзацы, форматированием списков и т.п.).</p>
<p>Решение:</p>
<ul>
<li><a href="http://www.xmlsoft.org/XSLT/" target="_blank">xsltproc</a> (часть пакета libxslt в большинстве дистрибутивов Linux);</li>
<li><a href="http://vladimir-chizhov.ru/wp-content/uploads/2008/07/html-split.xsl">XSL-шаблон</a> в полсотни строк, включая достаточно подробные комментарии, на написание которого был потрачен дождливый питерский вечер.</li>
</ul>
<p>Небольшой нюанс: запускать xsltproc нужно с опцией <code>--html</code>, указывающей оному на соответствующий формат входного документа. Пример:</p>
<p><code>$ xsltproc --html ./html-split.xsl ./test.html &gt; result.txt</code></p>
]]></content:encoded>
			<wfw:commentRss>http://vladimir-chizhov.ru/2008/07/html2text/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	<div id="sharepage">
    <div class="title"><a rel="nofollow" href="http://blog.sjinks.org.ua/php/wordpress/202-onebutton-better-version-of-odnaknopka/">Add to Social Bookmarks</a></div>
    <ul class="clearfix">
        <li id="blink" title="Add to Blink"><a rel="external nofollow" href="http://www.blinklist.com/index.php?Action=Blink/addblink.php&amp;url={url}&amp;title={title}&amp;description={title}">Blink</a></li>
        <li id="delicious" title="Add to del.ici.ous"><a rel="external nofollow" href="http://del.icio.us/post?url={url}&amp;title={title}">del.ici.ous</a></li>
        <li id="digg" title="Add to Digg"><a rel="external nofollow" href="http://digg.com/submit?phase=2&amp;url={url}">Digg</a></li>
        <li id="furl" title="Add to Furl"><a rel="external nofollow" href="http://www.furl.net/storeIt.jsp?u={url}&amp;t={title}">Furl</a></li>
        <li id="google" title="Add to Google"><a rel="external nofollow" href="http://fusion.google.com/add?feedurl={url}">Google</a></li>
        <li id="simpy" title="Add to Simpy"><a rel="external nofollow" href="http://simpy.com/simpy/LinkAdd.do?href=&amp;title={title}&amp;note={title}&amp;_doneURI={url}&amp;v=6&amp;src=bookmarklet">Simpy</a></li>
        <li id="spurl" title="Add to Spurl"><a rel="external nofollow" href="http://www.spurl.net/spurl.php?v=3&amp;url={url}&amp;title={title}&amp;blocked={title}">Spurl</a></li>
        <li id="ymyweb" title="Add to Y! MyWeb"><a rel="external nofollow" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u={url}&amp;t={title}&amp;d=&amp;ei=UTF-8">Y! MyWeb</a></li>
        <li id="bobrdobr" title="Add to BobrDobr"><a rel="external nofollow" href="http://bobrdobr.ru/addext.html?url={url}&amp;title={title}">BobrDobr</a></li>
        <li id="mrwong" title="Add to Mister Wong"><a rel="external nofollow" href="http://www.mister-wong.ru/index.php?action=addurl&amp;bm_url={url}&amp;bm_description={title}">Mr. Wong</a></li>
        <li id="yabm" title="Add to Yandex.Bookmarks"><a rel="external nofollow" href="http://zakladki.yandex.ru/userarea/links/addfromfav.asp?bAddLink_x=1&amp;lurl={url}&amp;lname={title}">Yandex.Bookmarks</a></li>
        <li id="text20" title="Add to Text 2.0"><a rel="external nofollow" href="http://text20.ru/add/?source={url}&amp;title={title}&amp;text={title}">Text 2.0</a></li>
        <li id="news2" title="Add to News2"><a rel="external nofollow" href="http://news2.ru/add_story.php?url={url}">News2</a></li>
        <li id="addscoop" title="Add to AddScoop"><a rel="external nofollow" href="http://myscoop.ru/add/?URL={url}&amp;title={title}">AddScoop</a></li>
        <li id="ruspace" title="Add to RuSpace"><a rel="external nofollow" href="http://www.ruspace.ru/index.php?link=bookmark&amp;action=bookmarkNew&amp;bm=1&amp;url={url}&amp;title={title}">RuSpace</a></li>
        <li id="rumarkz" title="Add to RUmarkz"><a rel="external nofollow" href="http://rumarkz.ru/bookmarks/?action=add&amp;popup=1&amp;address={url}&amp;title={title}">RUmarkz</a></li>
        <li id="memori" title="Add to Memori"><a rel="external nofollow" href="http://memori.ru/link/?sm=1&amp;u_data[url]={url}&amp;u_data[name]={title}">Memori</a></li>
        <li id="googlebm" title="Add to Google Bookmarks"><a rel="external nofollow" href="http://www.google.com/bookmarks/mark?op=add&amp;bkmk={url}&amp;title={title}">Google Bookmarks</a></li>
        <li id="pisali" title="Add to Pisali"><a rel="external nofollow" href="http://pisali.ru/load_article/">Pisali</a></li>
        <li id="smi2" title="Add to SMI 2"><a rel="external nofollow" href="http://smi2.ru/add/">SMI 2</a></li>
        <li id="myplace" title="Add to Moe Mesto"><a rel="external nofollow" href="http://moemesto.ru/post.php?url={url}&amp;title={title}">Moe Mesto</a></li>
        <li id="bm100" title="Add to Sto Zakladok"><a rel="external nofollow" href="http://www.100zakladok.ru/save/?bmurl={url}&amp;bmtitle={title}">100 Zakladok</a></li>
        <li id="wow" title="Add to Vaau!"><a rel="external nofollow" href="http://www.vaau.ru/submit/?action=step2&amp;url={url}">Vaau!</a></li>
        <li id="technorati" title="Add to Technorati"><a rel="external nofollow" href="http://technorati.com/faves?add={url}">Technorati</a></li>
        <li id="rucity" title="Add to RuCity"><a rel="external nofollow" href="http://rucity.com/bookmarks.php?action=add&amp;address={url}&amp;title={title}&amp;description={title}">RuCity</a></li>
        <li id="linkstore" title="Add to LinkStore"><a rel="external nofollow" href="http://linkstore.ru/servlet/LinkStore?a=add&amp;url={url}&amp;title={title}">LinkStore</a></li>
        <li id="newsland" title="Add to NewsLand"><a rel="external nofollow" href="http://newsland.ru/News/Add/type/news/">NewsLand</a></li>
    </ul>
</div>
</channel>
</rss>
