<?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; Paul Chubatyy</title>
	<atom:link href="http://blog.xobb.me/author/xobb/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xobb.me</link>
	<description>Ховайтесь в жито!</description>
	<lastBuildDate>Sun, 29 Jan 2012 13:26:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Щоб не забути</title>
		<link>http://blog.xobb.me/2012/01/%d1%89%d0%be%d0%b1-%d0%bd%d0%b5-%d0%b7%d0%b0%d0%b1%d1%83%d1%82%d0%b8/</link>
		<comments>http://blog.xobb.me/2012/01/%d1%89%d0%be%d0%b1-%d0%bd%d0%b5-%d0%b7%d0%b0%d0%b1%d1%83%d1%82%d0%b8/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 13:26:16 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[miscelaneous]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=785</guid>
		<description><![CDATA[Есть три буддийских способа смотреть телевизор. В сущности, это один и тот же способ, но на разных стадиях тренировки он выглядит по-разному. Сначала ты смотришь телевизор с выключенным звуком. Примерно полчаса в день, свои любимые передачи. Когда возникает мысль, что по телевизору говорят что-то важное и интересное, ты осознаешь ее в момент появления и тем [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Есть три буддийских способа смотреть телевизор. В сущности, это один и тот же способ, но на разных стадиях тренировки он выглядит по-разному. Сначала ты смотришь телевизор с выключенным звуком. Примерно полчаса в день, свои любимые передачи. Когда возникает мысль, что по телевизору говорят что-то важное и интересное, ты осознаешь ее в момент появления и тем самым нейтрализуешь. Сперва ты будешь срываться и включать звук, но постепенно привыкнешь. Главное, чтобы не возникало чувства вины, когда не можешь удержаться. Сначала так со всеми бывает, даже с ламами. Потом ты начинаешь смотреть телевизор с включенным звуком, но отключенным изображением. И наконец, начинаешь смотреть выключенный телевизор. Это, собственно, главная техника, а первые две — подготовительные. Смотришь все программы новостей, но телевизор не включаешь. Очень важно, чтобы при этом была прямая спина, а руки лучше всего складывать на животе — правая ладонь снизу, левая сверху. Это для мужчин, а для женщин наоборот. И ни на секунду не отвлекаться. Если так смотреть телевизор десять лет подряд хотя бы по часу в день, можно понять природу телевидения. Да и всего остального тоже.</p></blockquote>
<p>Виктор Пелевин, Generation П.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2012/01/%d1%89%d0%be%d0%b1-%d0%bd%d0%b5-%d0%b7%d0%b0%d0%b1%d1%83%d1%82%d0%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZCE і разноє.</title>
		<link>http://blog.xobb.me/2012/01/zces-%d1%96-%d1%80%d0%b0%d0%b7%d0%bd%d0%be%d1%94/</link>
		<comments>http://blog.xobb.me/2012/01/zces-%d1%96-%d1%80%d0%b0%d0%b7%d0%bd%d0%be%d1%94/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 19:43:10 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[miscelaneous]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zce]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=779</guid>
		<description><![CDATA[Вчора здав теста на Zend Certified Engineer. Півтора тижня назад купив машину. Певно не скоро знову тут напишу. Давно не було корцінок, а ця зараз частенько попадається.]]></description>
			<content:encoded><![CDATA[<p>Вчора здав теста на Zend Certified Engineer. Півтора тижня назад купив машину. Певно не скоро знову тут напишу. Давно не було корцінок, а ця зараз частенько попадається.</p>
<div id="attachment_780" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.xobb.me/wp-content/uploads/2012/01/x_8b72fd0e.jpg"><img class="size-full wp-image-780" title="jews" src="http://blog.xobb.me/wp-content/uploads/2012/01/x_8b72fd0e.jpg" alt="" width="600" height="423" /></a><p class="wp-caption-text">Такі діла</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2012/01/zces-%d1%96-%d1%80%d0%b0%d0%b7%d0%bd%d0%be%d1%94/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Командна розробка великого проекту. Продовження</title>
		<link>http://blog.xobb.me/2011/12/%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%b0-%d1%80%d0%be%d0%b7%d1%80%d0%be%d0%b1%d0%ba%d0%b0-%d0%b2%d0%b5%d0%bb%d0%b8%d0%ba%d0%be%d0%b3%d0%be-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d1%83-%d0%bf/</link>
		<comments>http://blog.xobb.me/2011/12/%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%b0-%d1%80%d0%be%d0%b7%d1%80%d0%be%d0%b1%d0%ba%d0%b0-%d0%b2%d0%b5%d0%bb%d0%b8%d0%ba%d0%be%d0%b3%d0%be-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d1%83-%d0%bf/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 20:21:21 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[miscelaneous]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[flow]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitorious]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=735</guid>
		<description><![CDATA[Це продовження попередньої записки. Організації такої схеми розробки сильно допомагає git або будь-яка інша децентралізована система контролю версій. Хоча технічні деталі стосуватимуться git, їх, мабуть, можна використати з іншою системою такою як mercurial чи bazaar. Тут можна похоліварити, я б почитав аргументовані коментарі щодо кожної з систем. Окрім власне самої системи контролю версій нам потрібно [...]]]></description>
			<content:encoded><![CDATA[<p>Це продовження <a title="Командна розробка великого проекту" href="http://blog.xobb.me/2011/12/git-branching-improved/">попередньої записки</a>.</p>
<p>Організації такої схеми розробки сильно допомагає git або будь-яка інша децентралізована система контролю версій. Хоча технічні деталі стосуватимуться git, їх, мабуть, можна використати з іншою системою такою як <a title="Офіційний сайт" href="http://mercurial.selenic.com/">mercurial</a> чи <a title="Офіційний сайт" href="http://bazaar.canonical.com/en/">bazaar</a>. Тут можна похоліварити, я б почитав аргументовані коментарі щодо кожної з систем. Окрім власне самої системи контролю версій нам потрібно буде якийсь інтерфейс для відправки коду для перегляду, власне самого перегляду і обговорення. Користуючись git ви маєте надзвичайно крутий інструмент на платній основі — <a title="Тут все зрозуміло" href="https://github.com/">github</a>. Якщо ж hosted-версія такого програмного забезпечення не підходить для бізнесу (з різних міркувань: безпеки, оплати, інші), тоді вам в пригоді стануть інші подібні системи: <a title="Gitorious" href="https://gitorious.org/">gitorious</a>, <a title="Gitlab" href="http://gitlabhq.com/">gitlab</a> (<a href="http://habrahabr.ru/blogs/Git/135276/">огляд на хабрахабрі</a>), <a title="Демо" href="http://luna-tool.org/btd">luna-tool</a> (<a title="Автор пише" href="http://habrahabr.ru/blogs/open_source/133306/">стаття на хабрахабрі</a>). Варто відзначити, що останні дві системи доволі нові, відтак можуть не мати достатнього функціональності для тієї схеми, що я тут розповідаю і я їх не пробував особисто, проте вони швидко розвиваються і мають корені з недалекого східного зарубіжжя. В цьому записі я зупинюсь на gitorious, так як схема роботи побудована з використанням цієї системи.</p>
<p><span id="more-735"></span></p>
<h3>Встановлення gitorious</h3>
<p>Власне починається усе з встановлення. <a title="На вікі проекту" href="http://gitorious.org/gitorious/pages/Installation">Інструкції до встановлення</a> можна подивитись у вікі проекту. Рекомендую не встановлювати руками, бо з цим безліч мороки (я це робив двічі, обидва рази це мені зайняло приблизно 2 дні, я не рубі програміст). Якщо ви розробляєте на рубі щодня, то для вас це буде мабуть доволі легко. Для інсталяції є <a title="На гітхабі, як би це не було парадоксально" href="https://github.com/rosenfeld/gitorious-cookbooks">рецепти для chef</a>.</p>
<h3>Команди</h3>
<p>Тут і надалі я буду використовувати <a href="https://gitorious.org/">gitorious.org</a> для прикладів і скріншотів.</p>
<p>Після встановлення і авторизації, ви побачите приблизно наступну картинку.</p>
<div id="attachment_738" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.xobb.me/wp-content/uploads/2011/12/dashboard.png"><img class="size-medium wp-image-738 " title="gitorious-dashboard" src="http://blog.xobb.me/wp-content/uploads/2011/12/dashboard-600x394.png" alt="Приборна панель Gitorious" width="600" height="394" /></a><p class="wp-caption-text">Приборна панель Gitorious</p></div>
<p>Після цього приступимо до створення команд. Для цього у верхньому меню вибираємо Teams, потім Create Team справа.</p>
<div id="attachment_743" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.xobb.me/2011/12/%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%b0-%d1%80%d0%be%d0%b7%d1%80%d0%be%d0%b1%d0%ba%d0%b0-%d0%b2%d0%b5%d0%bb%d0%b8%d0%ba%d0%be%d0%b3%d0%be-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d1%83-%d0%bf/create_team/" rel="attachment wp-att-743"><img class="size-medium wp-image-743" title="create_team" src="http://blog.xobb.me/wp-content/uploads/2011/12/create_team-600x483.png" alt="Форма створення команди" width="600" height="483" /></a><p class="wp-caption-text">Форма створення команди</p></div>
<p>Після цього додамо розробників в команду (думаю після встановлення ви створили аккаунти для розробників). Останні кроки варто повторити стільки разів, скільки команд у вас є.</p>
<h3>Репозиторії</h3>
<p>Далі створюємо проект і репозиторій з кодом проекту. Цей процес я описувати не буду, щоб не нагромаджувати статтю інформацією, яка не відноситься до основної ідеї. Припустимо, що на цьому етапі репозиторій вже є і почнемо створювати командні клони. На сторінці репозиторію нажимаємо кнопку <strong>Clone </strong>та бачимо наступну форму:</p>
<div id="attachment_744" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.xobb.me/wp-content/uploads/2011/12/team_clone.png"><img class="size-medium wp-image-744" title="team_clone" src="http://blog.xobb.me/wp-content/uploads/2011/12/team_clone-600x416.png" alt="Форма створення клону репозиторія" width="600" height="416" /></a><p class="wp-caption-text">Форма створення клону репозиторія</p></div>
<p>Зауважте, що потрібно робити саме клон для <strong>Group</strong>, а не персональний. В дропдауні будуть групи, до яких ви належите. Задаємо назву репозиторію і готово. Як результат у команди буде своя копія репозиторію. В новостворений репозиторій лід команди буде відправляти коміти напряму, а інші члени команди повинні зробити персональні клони. Це робиться в спосіб, вказаний вище, тільки потрібно вибрати <strong>Me</strong> на формі створення клону.</p>
<p>Після цього команди і девелопери матимуть свої репозиторії. Також, створені репозиторії можна поділити на рівні, як зображено на рисунку нижче.</p>
<div id="attachment_755" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.xobb.me/wp-content/uploads/2011/12/repository-levels.png"><img class="size-medium wp-image-755" title="repository-levels" src="http://blog.xobb.me/wp-content/uploads/2011/12/repository-levels-600x450.png" alt="Рівні репозиторії" width="600" height="450" /></a><p class="wp-caption-text">Рівні репозиторіїв.</p></div>
<h3>Процеси розробника</h3>
<p>Після налаштування команд і репозиторіїв пропоную ознайомитись з наступними процесами. Власне тут починається сам жир статті, до цього моменту була тільки підготовка до роботи. В описі процесів я рухатимусь знизу вверх з позиції розробника.</p>
<p>Перш за все розробник робить локальний клон свого публічного репозиторію. Це відбувається за допомогою наступної команди:</p>
<pre>git clone git@gitorious.org:~xobb/gitorious/xobbs-feature-team-mainline.git</pre>
<p>Також необхідно буде добавити репозиторій своєї команди</p>
<pre>git remote add upstream git@gitorious.org:+feature-team/gitorious/feature-team-mainline.git</pre>
<p>та головний репозиторій для оновлень</p>
<pre>git remote add blessed git://gitorious.org/gitorious/mainline.git</pre>
<p>Відповідно у розробника буде три наступних ремоута, які він використовуватиме щодня.</p>
<ul>
<li>origin — власний репозиторій для відправлення власних змін.</li>
<li>upstream — командний репозиторій для інтеграції власних змін з кодом інших</li>
<li>blessed — головний репозиторій для оновлень власного репозиторію.</li>
</ul>
<p>Припустимо, що розробник отримує завдання. Його кроки виглядають наступним чином:</p>
<ol>
<li>оновлення з головного репозиторію</li>
<li>створення локальної гілки з кодом, що вирішує завдання</li>
<li>відправлення локальної гілки в публічний репозиторій</li>
<li>повідомлення свого тім ліда про те, що завдання виконано і його необхідно переглянути, та відправити в головний репозиторій.</li>
</ol>
<p>Пройдемо ці кроки на технічному рівні. Оновлення з головного репозиторію відбувається наступною інструкцією:</p>
<pre>git pull blessed</pre>
<p>Тепер створимо гілку для виконання задачі:</p>
<pre>git checkout -b new-feature</pre>
<p>Тут розробник вносить зміни в код. Що ще розказувати, за цим одним реченням написано мільйон книжок і статей, як це вірно робити. Коли все готово, тоді розробник відправляє зміни в свій публічний репозиторій:</p>
<pre>git push origin new-feature</pre>
<p>Як ви мабуть помітили, попередні кроки були зроблені без використання gitorious, ця функціональність є в будь-якої розподіленої системи контролю версій. Колись, на ранніх етапах розвитку git, розробник відправляв листа своєму ліду з проханням переглянути і змерджити код, даючи необхідні для цього дані: url власного публічного репозиторію, назву гілки. Це звісно дуже сумний і драматичний результат роботи. Щоб такого не було, нам на допомогу приходить gitorious.<br />
Відправивши гілку з готовим кодом в публічний репозиторій, розробник створює мердж запит для повідомлення тім ліда. Це виглядає наступним чином:</p>
<div id="attachment_758" class="wp-caption aligncenter" style="width: 590px"><a href="http://blog.xobb.me/wp-content/uploads/2011/12/merge_request_create.png"><img class="size-medium wp-image-758" title="merge_request_create" src="http://blog.xobb.me/wp-content/uploads/2011/12/merge_request_create-580x600.png" alt="Створення мердж запиту" width="580" height="600" /></a><p class="wp-caption-text">Форма створення мердж запиту</p></div>
<p>Вибачайте за якість цього скріншоту, я їх з двох ліпив і аж спеціально Gimp поставив. Зверніть увагу на секцію Select commits, там можна вибрати ті коміти, що ви хочете включити в мердж запит. Коли ви натиснете кнопку <strong>Create merge request </strong>то лід отримає повідомлення і також зручний інтерфейс для перегляду змін, з можливістю пострічкового коментування коду, версійністю. Дивіться скріншот нижче.</p>
<div id="attachment_767" class="wp-caption aligncenter" style="width: 610px"><a href="http://blog.xobb.me/wp-content/uploads/2011/12/merge_request_review.png"><img class="size-medium wp-image-767" title="merge_request_review" src="http://blog.xobb.me/wp-content/uploads/2011/12/merge_request_review-600x418.png" alt="Перегляд мердж запиту" width="600" height="418" /></a><p class="wp-caption-text">Інтерфейс перегляду мердж запиту</p></div>
<p>На цьому етапі робота розробника закінчується і ми переключаємось на тім ліда, який власне займеться кодом далі. Розробник в свою чергу може приступати до виконання наступного завдання.</p>
<h3>Процеси тім ліда</h3>
<p>Так як тім лід теж зазвичай залучений в процесі розробки, то він теж працює з репозиторієм, але в силу того, що нікому переглядати його код, то він працює з <strong>командним репозиторієм</strong> напряму. Відповідно тім лід клонує командний репозиторій:</p>
<pre>git clone git@gitorious.org:+feature-team/gitorious/feature-team-mainline.git</pre>
<p>І додає головний репозиторій для отримання оновлень та відправлення своїх змін та від інших членів команди.</p>
<pre>git remote add upstream git@gitorious.org:gitorious/mainline.git</pre>
<p>Припустимо, що тім лід задоволений якістю коду, що розробник йому запропонував мердж запитом і він хоче його прийняти. Для цього потрібно виконати наступну інструкцію:</p>
<pre>git pull origin refs/merge-requests/1</pre>
<p>1 в даному випадку зазначає номер мердж запиту. Відповідно код, отриманий при мердж запиті потрібно відправити в головний репозиторій. Зробимо це:</p>
<pre>git push upstream</pre>
<h3>Висновки</h3>
<p>Власне на цьому можна закінчувати статтю, проте ще якось варто б підсумувати. Ця схема роботи працює. Її введенню передував перехід проекту з svn на git. З часу впровадження суттєво знизився колективний стрес в командах, код став стабільніше і проект більш керованим. Розробники почали більше експериментувати, перестали боятись вносити значні зміни в код, робити рефакторинг коду. Більше того, в процесі почались довгострокові зміни в незалежних гілках з великими новими напрацюваннями, що значно полегшать розробку, проте не являються основними в системі.</p>
<p>Також зверніть увагу, що при операціях <em>pull</em> і <em>push </em>я не вказував гілки. Зазвичай це потрібно робити! Інакше ви можете отримати не той результат, який очікуєте.</p>
<p>Такий підхід я б не назвав фінальним. Його можна удосконалювати в багатьох аспектах. Для прикладу введення посади реліз менеджера зможе вирішити момент з динамічним формуванням релізів. Тобто людина збиратиме з командних репозиторіїв мердж реквести з готовим функціоналом і формуватиме реліз на вимогу включаючи тільки певні функціональні модулі. Я б з радістю почитав про інші схеми роботи.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2011/12/%d0%ba%d0%be%d0%bc%d0%b0%d0%bd%d0%b4%d0%bd%d0%b0-%d1%80%d0%be%d0%b7%d1%80%d0%be%d0%b1%d0%ba%d0%b0-%d0%b2%d0%b5%d0%bb%d0%b8%d0%ba%d0%be%d0%b3%d0%be-%d0%bf%d1%80%d0%be%d0%b5%d0%ba%d1%82%d1%83-%d0%bf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Командна розробка великого проекту</title>
		<link>http://blog.xobb.me/2011/12/git-branching-improved/</link>
		<comments>http://blog.xobb.me/2011/12/git-branching-improved/#comments</comments>
		<pubDate>Fri, 02 Dec 2011 21:04:39 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[miscelaneous]]></category>
		<category><![CDATA[branching]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[theory]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=704</guid>
		<description><![CDATA[Мабуть всі програмісти, які використовують гіт в тій чи іншій мірі стикались з успішною моделлю розгалуження в Git (чи з перекладом на хабрі). Дана схема чудесно працює в «гомогенному середовищі програмістів», де команда приблизно має рівний досвід, бачення коду. Що я пояснювати буду, програмісти приблизно одного рівня. Також цей підхід чудового підходить продуктовим компаніям, які добре [...]]]></description>
			<content:encoded><![CDATA[<p>Мабуть всі програмісти, які використовують гіт в тій чи іншій мірі стикались з <a title="Successful Git branching model" href="http://nvie.com/posts/a-successful-git-branching-model/">успішною моделлю розгалуження в Git</a> (чи з перекладом на <a title="Удачная модель ветвления в Git" href="http://habrahabr.ru/blogs/Git/106912/">хабрі</a>). Дана схема чудесно працює в «гомогенному середовищі програмістів», де команда приблизно має рівний досвід, бачення коду. Що я пояснювати буду, програмісти приблизно одного рівня. Також цей підхід чудового підходить продуктовим компаніям, які добре знають роудмапу свого проекта заздалегідь і можуть вести розробку згідно цього плану. Мінусами даної схеми роботи є те, що в ній не передбачено багато бюрократичних моментів, які впливають на якісну розробку програмного забезпечення, вважаючи, що продуктові компанії людські проблеми вирішують на рівні людей. Про це можна написати окрему статтю на тему чим продуктова компанія відрізняється від аутсорсингової, але зараз не про це.</p>
<p>Аутсорсингові компанії зазвичай мають більше бюрократичних правил (які, чесно кажучи, оправдані), що необхідно слідувати під час розробки. Від релізу до релізу потрібно робити код рев’ю, планувати спрінти, розділяти відповідальність на групи розробників всередині команди. Такий процес провокує взаємодію між людьми. Як відомо, коли проблема стосується людей то її вирішення значно складніше і менш універсальне, чим рішення, що знаходиться в технічній сфері.</p>
<p>Отож як гіт може допомогти нам в код рев’ю, поділ відповідальності на групи розробників і оформлення релізів? Давайте розглянемо на прикладах. Уявимо що в нас є декілька feature-команд, що займаються розробкою нового функціоналу до уявного продукту і декілька maintenance-команд, що займаються підтримкою існуючої системи і мінорними покращеннями до продукту. На схемі 1 нижче зображено все що ми тут науявляли.</p>
<div class="wp-caption aligncenter" style="width: 490px"><a href="https://docs.google.com/drawings/d/1-Vh7OfVzsD3V_mz2oXOAazaKBs8K4gEFGZ1HmyRF2Zo/edit?hl=en_US"><img title="Так воно зазвичай є" src="https://docs.google.com/drawings/pub?id=1-Vh7OfVzsD3V_mz2oXOAazaKBs8K4gEFGZ1HmyRF2Zo&amp;w=480&amp;h=360" alt="" width="480" height="360" /></a><p class="wp-caption-text">Схема 1</p></div>
<p>Звісно кожна команда створює свої гілки в основному репозиторії, там собі девелопає успішно, обмінюється комітами, але все-ж залишається гетерогенною групою програмістів. Тому перше, що варто зробити це надати кожній групі свого публічного репозиторію. Мабуть група має якогось лідера (team-lead, старший інженер). Ось його публічний репозиторій може виступати в якості групового публічного репозиторію. Відповідно ми отримуємо групи двох рівнів: старші інженери і девелопери.</p>
<p>Старші інтежени рулять командним репозиторієм і комітяться туди безпосередньо, а девелопери ролять клони і девелопають в своїх клонах, відправляючи мердж реквести.</p>
<p>Відповідно ми наближаємось до схеми <a title="Вікіпедія як положено" href="http://p2pfoundation.net/Linux_-_Governance#Linux_Governance" target="_blank">диктаторів-лейтенантів</a>, яка характерна для розробки ядра Лінукса, тільки без диктатора. Хоча позицію диктатора може займати скраміський реліз менеджер. ВІн власне буде відповідальний за оформлення релізу, вибиратиме стабільні бранчі і включатиме їх в реліз.</p>
<p>Якщо вас ця тема зацікавила ,залиште будь ласка відгука і я розгорну її детальніше. Маю досвід впроваждення такої схеми в проект з 15+ девелоперами в 4 командах. Такі діла.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2011/12/git-branching-improved/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Upgrade</title>
		<link>http://blog.xobb.me/2011/11/upgrade/</link>
		<comments>http://blog.xobb.me/2011/11/upgrade/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 17:13:33 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[amd]]></category>
		<category><![CDATA[driver]]></category>
		<category><![CDATA[radeon hd5xxx]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=729</guid>
		<description><![CDATA[Нарешті вийшов драйвер для amd. Качаєм.]]></description>
			<content:encoded><![CDATA[<p>Нарешті вийшов драйвер для amd. <a title="Linux Radeon HD5xxxx driver" href="http://support.amd.com/us/gpudownload/linux/Pages/radeon_linux.aspx">Качаєм</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2011/11/upgrade/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Downgrade</title>
		<link>http://blog.xobb.me/2011/11/downgrade/</link>
		<comments>http://blog.xobb.me/2011/11/downgrade/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 22:54:18 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[downgrade]]></category>
		<category><![CDATA[maverick]]></category>
		<category><![CDATA[oneiric]]></category>
		<category><![CDATA[sony vaio]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=722</guid>
		<description><![CDATA[Хм, вперше за час переходу на linux (а це з 7го року) робив даунгрейд системі. В силу того, що мануал для Natty не працює для Oneiric`a, то прийшлось рухатись вниз. Відеокартку реально шкода, на відкритих дровах вона просто вмирає геть чисто. Так як під рукою був тільки 10.10 (maverick), то прийшлось даунгрейдитись до нього. KDE [...]]]></description>
			<content:encoded><![CDATA[<p>Хм, вперше за час переходу на linux (а це з 7го року) робив даунгрейд системі. В силу того, що <a title="Vaio VPC-EA вентилятор і відеокартка" href="http://blog.xobb.me/2011/08/vaio-vpc-ea-%d0%b2%d0%b5%d0%bd%d1%82%d0%b8%d0%bb%d1%8f%d1%82%d0%be%d1%80-%d1%96-%d0%b2%d1%96%d0%b4%d0%b5%d0%be%d0%ba%d0%b0%d1%80%d1%82%d0%ba%d0%b0/">мануал для Natty</a> не працює для Oneiric`a, то прийшлось рухатись вниз. Відеокартку реально шкода, на відкритих дровах вона просто вмирає геть чисто. Так як під рукою був тільки 10.10 (maverick), то прийшлось даунгрейдитись до нього. KDE там до-речі теж прикольно виглядає. Ще нема стільних обоїв, всьо трохи попрощє.</p>
<p>З того софта, що я використовую, все відмінно працює і на маверіку.</p>
<p>P.S.: Аля, пробач мене будь ласка, я мав піти спати в 12ій, але трохи затримався.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2011/11/downgrade/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Rauschfaktor &#8211; Der Sonnensegler</title>
		<link>http://blog.xobb.me/2011/10/rauschfaktor-der-sonnensegler/</link>
		<comments>http://blog.xobb.me/2011/10/rauschfaktor-der-sonnensegler/#comments</comments>
		<pubDate>Tue, 25 Oct 2011 18:32:58 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[music]]></category>
		<category><![CDATA[cafe abstrait]]></category>
		<category><![CDATA[lounge]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=716</guid>
		<description><![CDATA[Оце недавно почав знову слухати лаунджа. Викачую поволе ту колекцію, яка в мене колись була (~70гб торрентів) лаунджової музики. Наразі викачав найулюбленішу збірку — Cafe Abstrait. Вже навіть забув за цю композицію, проте плеєр на неї рандомно потратив. Насолоджуйтесь, це мабуть найкраща лаунджова композиція всіх часів.]]></description>
			<content:encoded><![CDATA[<p>Оце недавно почав знову слухати лаунджа. Викачую поволе ту колекцію, яка в мене колись була (~70гб торрентів) лаунджової музики. Наразі викачав найулюбленішу збірку — <a title="15 років кстаті" href="http://www.cafeabstrait.de/">Cafe Abstrait</a>. Вже навіть забув за цю композицію, проте плеєр на неї рандомно потратив. Насолоджуйтесь, це мабуть найкраща лаунджова композиція всіх часів.</p>
<p><a href="http://blog.xobb.me/2011/10/rauschfaktor-der-sonnensegler/"><em>Click here to view the embedded video.</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2011/10/rauschfaktor-der-sonnensegler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One of these nights</title>
		<link>http://blog.xobb.me/2011/10/one-of-these-nights/</link>
		<comments>http://blog.xobb.me/2011/10/one-of-these-nights/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 15:37:57 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[music]]></category>
		<category><![CDATA[oldies]]></category>
		<category><![CDATA[the eagles]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=702</guid>
		<description><![CDATA[Шось мене сьогодні потягнуло на сигари, а з ними на oldies. Вашій увазі представляється The Eagles з композицією One of These Nights.]]></description>
			<content:encoded><![CDATA[<p>Шось мене сьогодні потягнуло на сигари, а з ними на oldies. Вашій увазі представляється <strong>The Eagles</strong> з композицією <strong>One of These Nights</strong>.</p>
<p><a href="http://blog.xobb.me/2011/10/one-of-these-nights/"><em>Click here to view the embedded video.</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2011/10/one-of-these-nights/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git 1.7.7</title>
		<link>http://blog.xobb.me/2011/10/git-1-7-7/</link>
		<comments>http://blog.xobb.me/2011/10/git-1-7-7/#comments</comments>
		<pubDate>Sat, 15 Oct 2011 20:41:33 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=699</guid>
		<description><![CDATA[Обновився git до 1.7.7. З одного боку мінорна зміна, з іншого ця зміна упростить життя кожному більш-менш користувачу системи контролю версій. З ченджлога видрав для себе два моменти, які дуже поможуть в подальшій роботі. git status &#8211;include-untracked Або ж просто -u стешне ще й нові файли, які наразі не під версійним контролем. Так як я стешусь [...]]]></description>
			<content:encoded><![CDATA[<p>Обновився git до 1.7.7. З одного боку мінорна зміна, з іншого ця зміна упростить життя кожному більш-менш користувачу системи контролю версій. З <a title="Шо змінилось з git 1.7.6" href="https://raw.github.com/gitster/git/master/Documentation/RelNotes/1.7.7.txt">ченджлога</a> видрав для себе два моменти, які дуже поможуть в подальшій роботі.</p>
<h3>git status &#8211;include-untracked</h3>
<p>Або ж просто <strong>-u </strong>стешне ще й нові файли, які наразі не під версійним контролем. Так як я стешусь по декілька разів на день і переключаюсь на інші бранчі, то ця фіча мені дуже пригодиться. Думаю вам теж сподобається.</p>
<h3>git submodule update</h3>
<p>Трохи його поремонтували. Коли ставалась помилка, то апдейт тупо вмирав. Тепер же він не буде вмирати, а просто вкінці роботи скаже вам про помилки. Знову ж таки зручність во всє поля.</p>
<p>Кароче, якщо я вас не переконав апдейтнутись, то ваші справи. А я апдейчусь.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2011/10/git-1-7-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Деревина наше всьо</title>
		<link>http://blog.xobb.me/2011/10/mongo-trees/</link>
		<comments>http://blog.xobb.me/2011/10/mongo-trees/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 20:26:55 +0000</pubDate>
		<dc:creator>Paul Chubatyy</dc:creator>
				<category><![CDATA[miscelaneous]]></category>
		<category><![CDATA[document-oriented database]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[rdbms]]></category>
		<category><![CDATA[relational database]]></category>

		<guid isPermaLink="false">http://blog.xobb.me/?p=685</guid>
		<description><![CDATA[Давайте напишу шось по темі, бо вже давно цього не робив і ті 3 з половиною читача обідяться. Про шо писати? Давайте про Mongo напишу. Це будуть більше роздуми людини, яка переламує звивину за звивиною мігруючи з реляційної бази даних до документоорієнтованої. Кому цікаво дує під кат. Дерева замість списків Your mother is so fat, [...]]]></description>
			<content:encoded><![CDATA[<p>Давайте напишу шось по темі, бо вже давно цього не робив і ті 3 з половиною читача обідяться. Про шо писати? Давайте про <a title="Документо орієнтована база даних" href="http://www.mongodb.org/">Mongo</a> напишу. Це будуть більше роздуми людини, яка переламує звивину за звивиною мігруючи з реляційної бази даних до документоорієнтованої. Кому цікаво дує під кат.</p>
<h2><span id="more-685"></span>Дерева замість списків</h2>
<blockquote><p>Your mother is so fat, she sat on a binary tree and turned it into a linked list in O(1) time.</p></blockquote>
<p>Ех, крутий я. Як хароший писатєль вже починаю з цитати невідомих людей.</p>
<p>Давайте намутимо приклад такий, навколо якого будемо це все обговорювати. Допустимо у нас є сутність <em>подорож</em>. Вона складається з точки відправлення, точки прибуття, зупинок, що будуть зроблені під час подорожі (тобто якихось <em>локацій</em>). Також що ж за подорож без людей. Вона сама по собі не може бути, тому ми маємо <em>людей</em>, які подорожують. Також для повноти експерименту вкажемо <em>дату відправлення</em> і <em>дату прибуття</em> для подорожі. І ми ці подорожі каталожимо: кожен приходить, каже що був в такій і такій подорожі з такою і такою людиною.</p>
<p>Для людини, яка має достатньо досвіду з реляційними базами даних одразу стане перед очима наступна схема реалізації згаданого вище:</p>
<p><img src="https://docs.google.com/drawings/pub?id=1akUdry2ilKDd58Z5OaHN8XE76mb3hYangjkBJHGgSGA&amp;w=1440&amp;h=1080" alt="" /></p>
<p>Малював на швидкоруч в гуглодоці, так шо вибачайте за карявість, але надіюсь що суть донесена. Маємо три зв’язка один до багатьох і два зв’язки багато до багатьох. Тепер припустимо, ми хочемо знайти всі подорожі, що почались з Тернополя за вересень минулого року. Для цього робимо наступного запита:</p>
<script type='text/javascript' src='https://gist.github.com/1281983.js?file=get%20all%20trips%20from%20Ternopil%20in%20September.sql'></script>
<p>Однак з документноорієнтованим сховищем все трішки не так. В нас немає аналогу джойна, тому ми повинні імпровізувати. Взагалі-то мабуть це не буде імпровізація, тут скоріше поломка мозгів сталась. Буквально як Лінус казав, якщо людина дуже довго користується SVN або CVS, то вона втрачає розуміння і бачення того, як би мала виглядати система контролю версій. Так от, працюючи з плоскими структурами ми забуваємо як би мала виглядати деревовидна.</p>
<p>Хех, містере Хобб, скажете ви. А ми тут з пустині сад зробимо і на вашу деревляну структуру навішаємо купку зв’язків. У нас є можливість до реквеста чіпляти айдішки користувачів, локацій, а зв’язки багато-до-багатьох ми ващє в масиви позапихуємо і буде в нас навіть без сурогатних сутностей, як це положено в реляційній моделі. І шо на це скажете?</p>
<p>Дійсно, після тривалої роботи з реляційними базами даних таке бажання не приховаєш. Англійською є гарненьке слово temptation. Проте, якщо ви звернете увагу, вищезгадана задача з вибіркою подорожей з Тернополя за вересень стане ох як нетривіальною. Сильно-сильно нетривіальною.</p>
<h2>І що ж робити?</h2>
<p>Та воду слівать. Треба сісти і не піддаватись бажанню робити зв’язки, а робити вкладення. Дерева для того і дерева, щоб мати гілки. Тому визначаємо основні сутності нашого каталогу подорожей і ставимо їх во главу столу. Очевидним шо в каталозі подорожей, подорожі будуть основною сутністю. Також важливою сутністю будуть користувачі. Але ось локації без контексту подорожей не мають ніякого сенсу. Тому об’єкт подорожі у нас виглядатиме наступним чином:</p>
<script type='text/javascript' src='https://gist.github.com/1281983.js?file=journey.json'></script>
<p>Зверніть увагу, так як ми сутність користувача не вносимо в дерево, тому ми використовуємо зв’язок по унікальному ідентифікатору (<strong>MongoId</strong>). Тут абсолютно up to developer що використовувати. Хлопці з 10gen <a title="Офіційна документація" href="http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-SummaryofBestPractices">говорять</a>:</p>
<blockquote><p>If performance is an issue, embed.</p></blockquote>
<p>Я не став перевантажувати об’єкт MongoDate. Цей тип рекомендується викоритосувати для збереження будь-якої часової інформації. Ну ви поняли.</p>
<p>З такою схемою запит на отримання усіх подорожей по критерію буде доволі таки простий:</p>
<script type='text/javascript' src='https://gist.github.com/1281983.js?file=query.js'></script>
<h2>Денормалізація</h2>
<p>Замість висновків. Прихильники реляційного підходу одразу помічають денормалізацію, перевантаженість однієї сутності іншою і т.д. Насправді документоорієнтовані бази даних не мають ступенів нормалізації і тут потрібно керуватись прагматичним началом в підході. Спочатку незручно, але згодом розумієш, що заради швидкодії і зручності можна пожертвувати якимись абстрактними нормами формалізації.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xobb.me/2011/10/mongo-trees/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

