<?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/"
	
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>graywolf&#039;s lair &#187; Мережі та ІТ</title>
	<atom:link href="http://graywolf.org.ua/category/blog/it/feed/" rel="self" type="application/rss+xml" />
	<link>http://graywolf.org.ua</link>
	<description>Inhuman being&#039;s diary...</description>
	<lastBuildDate>Fri, 18 May 2012 16:36:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Музику &#8211; в хмари!</title>
		<link>http://graywolf.org.ua/2012/05/18/music-in-the-amazon-cloud/</link>
		<comments>http://graywolf.org.ua/2012/05/18/music-in-the-amazon-cloud/#comments</comments>
		<pubDate>Fri, 18 May 2012 16:31:26 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[Музика]]></category>
		<category><![CDATA[Щоденник]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[amazon cloud drive]]></category>
		<category><![CDATA[amazon cloud player]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[google drive]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=2269</guid>
		<description><![CDATA[Під час одного обговорення хмаркових засобів збереження даних (типу Google Drive та Dropbox) випадково дізнався, що Amazon виявляється теж пропонує безкоштовний варіант 5GB &#8220;домашнього&#8221; диску під назвою Amazon Cloud Drive. Тобто це не промисловий S3, але кажуть, що технологія типу &#8230; <a href="http://graywolf.org.ua/2012/05/18/music-in-the-amazon-cloud/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/clouddrive/"><img src="http://graywolf.org.ua/wp-content/uploads/2012/05/gra_header._V149420936_.png" alt="Amazon Cloud Drive" title="Amazon Cloud Drive" width="729" height="34" class="alignnone size-full wp-image-2273 colorbox-2269" /></a><br />
Під час одного обговорення хмаркових засобів збереження даних (типу <em>Google Drive</em> та <em>Dropbox</em>) випадково дізнався, що Amazon виявляється теж пропонує безкоштовний варіант 5GB &#8220;домашнього&#8221; диску під назвою <a href="http://www.amazon.com/clouddrive/" title="Amazon Cloud Drive">Amazon Cloud Drive</a>. Тобто це не промисловий S3, але кажуть, що технологія типу як схожа. Там є деяка специфіка роботи &#8211; він не робить клон файлів на вашому диску, а більше односторонній. Типу: &#8220;відправ мені цей каталог на ACD&#8221; і все, каталог на локальному диску можна видаляти. Спочатку мені здалося: якого дідька? Самий же ж кайф Дропбоксу і компанії &#8211; в синхронізації між різними девайсами. Незручно! Коли я почав копати далі, то виявив, що як і усіх інших конкурентів у них звісно ж є платні варіанти із більшим простором, але(!) з маленьким нюансом: починаючи з найдешевшого тарифу (<em>$20/рік</em>, тобто близько 160грн.) музика, що зберігається там не рахується як зайняти місце <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_rolleyes.gif' alt=':roll:' class='wp-smiley colorbox-2269' />  Тобто по факту: музику можна зберігати в необмежених кількостях. Вирішив перевірити &#8211; запрацювало! Щоправда лише для <em>mp3</em> <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley colorbox-2269' />  Так що любителі <em>ogg</em>, <em>flac</em> (lossless в хмарі &#8211; це диво було б) та інших нестандартних форматів поки що йдуть лісом.<br />
<span id="more-2269"></span><br />
<a href="https://www.amazon.com/gp/dmusic/mp3/player"><img src="http://graywolf.org.ua/wp-content/uploads/2012/05/acp.png" alt="Amazon Cloud Player" title="Amazon Cloud Player" width="243" height="62" class="alignright size-full wp-image-2271 colorbox-2269" style="float: right; margin: 0 0 0.5em 0.5em;" /></a>Тож вже ввечері мій диск з музлом став пустішати карколомними темпами ^_^ Але приємності на цьому не закінчилися. Хоча тут вже є деякі правові нюанси <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-2269' />  У Амазон є так званий <a href="https://www.amazon.com/gp/dmusic/mp3/player" title="Amazon Cloud Player">Amazon Cloud Player</a>, що дозволяє вам грати музику прямо з вашого хмарко-диску. Щоправда працює лише для США, але як виявилося це не велика проблема &#8211; достатньо один раз зайти на сайт за допомогою <a href="https://www.torproject.org/">Tor</a> з американським екзит-пойнтом (інструкція по <a href="http://kilesa.org.ua/2012/04/04/crunchyroll-outside-usa/">налаштуванню Tor</a>; для іншого сервісу, але ідея та сама). При цьому достатньо зробити це один раз &#8211; далі він вже не вимагає від вас американського IP для користування. Тобто виходить щось типу персонального <a href="http://grooveshark.com/">Grooveshark</a>. В принципі, останнім можна було б вільно користуватися (принаймні для відносно популярної музики) і не паритись з хмарками взагалі, якби я слухав музику виключно з компа. Але що робити, наприклад, з мобільними телефонами? Покриття <em>3G</em>, швидкість та ціна навіть у наших дешевих (порівняно з Європою) операторів все ще не дуже підходять для онлайн прослуховування музики, тобто локальну колекцію так чи інакше доводиться зберігати і вона займає достобіса місця (яке ж, виявляється, можна звільнити закачавши все назад в Інтернет <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley colorbox-2269' />  ). Виявилося, що є додаток <em>Amazon Cloud Player</em> для <em><a href="https://play.google.com/store/apps/details?id=com.amazon.mp3">Android</a></em> (та мабуть і для <em>iPhone</em> теж), який дозволяє як слухати музику з вашого інтернет-диску напряму, так і з легкістю закешувати необхідні альбоми чи треки перед виходом кудись на мобільний пристрій. Це, блін, просто рай якийсь! Щоправда знову ж таки додаток офіційно не доступний в Україні, тому довелося шукати <em>.apk</em> на файлопомийках.</p>
<p>Ось так приблизно виглядає плеєр в браузері:<br />
<div id="attachment_2272" class="wp-caption alignnone" style="width: 630px"><a href="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-shot.png"><img src="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-shot-1024x498.png" alt="Amazon Cloud Drive Sceenshot" title="Amazon Cloud Drive Sceenshot" width="620" height="301" class="size-large wp-image-2272 colorbox-2269" /></a><p class="wp-caption-text">Amazon Cloud Drive Sceenshot</p></div></p>
<p>А отак на мобільному телефоні:<br />
<div id="attachment_2277" class="wp-caption alignnone" style="width: 317px"><a href="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-mobile.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-mobile.jpg" alt="Amazon Cloud Player Android" title="Amazon Cloud Player Android" width="307" height="512" class="size-full wp-image-2277 colorbox-2269" /></a> <a href="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-mobile-2.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-mobile-2.jpg" alt="Amazon Clod Drive for Android (Play)" title="Amazon Clod Drive for Android (Play)" width="307" height="512" class="alignnone size-full wp-image-2278 colorbox-2269" /></a><p class="wp-caption-text">Amazon Cloud Player for Android</p></div></p>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2012/05/18/music-in-the-amazon-cloud/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2012/05/gra_header._V149420936_-150x34.png" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2012/05/gra_header._V149420936_.png" medium="image">
			<media:title type="html">Amazon Cloud Drive</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2012/05/gra_header._V149420936_-150x34.png" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2012/05/acp.png" medium="image">
			<media:title type="html">Amazon Cloud Player</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-150x62.png" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-shot.png" medium="image">
			<media:title type="html">Amazon Cloud Drive Sceenshot</media:title>
			<media:description type="html">Amazon Cloud Drive Sceenshot</media:description>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-shot-150x150.png" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-mobile.jpg" medium="image">
			<media:title type="html">Amazon Cloud Player Android</media:title>
			<media:description type="html">Amazon Cloud Player for Android</media:description>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-mobile-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-mobile-2.jpg" medium="image">
			<media:title type="html">Amazon Clod Drive for Android (Play)</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2012/05/acp-mobile-2-150x150.jpg" />
		</media:content>
	</item>
		<item>
		<title>jp2ua transliteration jQuery widget</title>
		<link>http://graywolf.org.ua/2012/04/19/jp2ua-transliteration-jquery-widget/</link>
		<comments>http://graywolf.org.ua/2012/04/19/jp2ua-transliteration-jquery-widget/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 20:36:59 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Аніме]]></category>
		<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[japanese]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[uanime]]></category>
		<category><![CDATA[транслітерація]]></category>
		<category><![CDATA[українська]]></category>
		<category><![CDATA[японська мова]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=2185</guid>
		<description><![CDATA[Пару днів тому на форумі uanime підростаюче покоління перекладачів представило програмку для транслітерації ромаджі (англомовна транслітерація японської) в українську, на що Мінус-один влучно зауважив, що додатки такого рівня наразі пишуть під Веб, а софт тут просто overkill. Крім того, він &#8230; <a href="http://graywolf.org.ua/2012/04/19/jp2ua-transliteration-jquery-widget/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Пару днів тому на форумі <a href="http://uanime.org.ua/">uanime</a> підростаюче покоління перекладачів представило програмку для транслітерації ромаджі (англомовна транслітерація японської) в українську, на що <a href="http://kilesa.org.ua/">Мінус-один</a> влучно зауважив, що додатки такого рівня наразі пишуть під Веб, а софт тут просто overkill. Крім того, він дещо покритикував обраний підхід до створення словничка відповідностей, який містив виключення, в той час як в ідеалі всі правила транслітерації мають бути однозначними. Ну і найголовніше його побажання було &#8211; додати можливість транслітерувати кану, японський алфавіт (катакану та хірагану). Мене це зацікавило&#8230;<br />
<span id="more-2185"></span></p>
<h2>Передісторія</h2>
<p>Я подумав і вирішив, що задачка взагалі-то на кілька хвилин, але тому хотів піти складнішим шляхм і зробити її на <em>LISP</em>. У мене така жахлива хвороба &#8211; я не можу вчити нічого пов&#8217;язаного з IT поза контекстом хоч якогось прикладного застосування. Тому хоча мені хотілося б вивчити багато речей, але із-за того, що я не можу придумати собі прикладну задачу, в результаті не можу заставити підучити щось цікаве, але на перший погляд нетривіальне. Я трохи подумав як той Лісп розгортатити у вебі і зрештою вирішив не паритись, а підійти прагматичо (за останній рік мій &#8220;mindset&#8221; суттєво змінився і став орієнтований на кінцевий результат, а не на чергову &#8220;цікаву технологію&#8221;). Тому вирішив зробити віджет на Javascript, тим паче, що і тут у мене був маленький скелет у шафі &#8211; хотів попробувати написати плагін для <em>jQuery</em>, щоб коли наступного разу знову доведеться щось правити я в них вже розумівся трохи краще.</p>
<p>В результаті за пару годин придумав простенький алгоритм (перше, що прийшло в голову, тому приймаються будь-які суттєві пропозиції для вдосконалення), що працював на простому дереві для <em>pattern matching</em> (надалі просто &#8220;словник&#8221;) і побудував словник для <em>ромадж</em>і. На форумі <em>uanime</em> одразу ж почали <a href="http://uanime.org.ua/forum/viewtopic.php?p=27440#p27440">постити баги</a> <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-2185' />  а я нашвидкоруч поправляти словник, додаючи пропущені патерни. В той же час <em>Мінус-один</em> захопився ідеєю зробити словники для <em>хірагани</em> та <em>катакани</em>. Причому оновлював він їх для <em>кани</em> так швидко (і публікував прямо в форумні пости), що я вирішив <a href="https://github.com/ashenwolf/jp2ua-transliterate">залити скрипт</a> в якусь систему версійного контролю, де можна було б на льоту правити та оцінювати зміни і не зловживати форумом. До речі, в цьому плані <a href="http://github.com/">github</a> виявився дуже крутим зі своїм on-site редагуванням файлів та автопублікацією у веб через <a href="http://pages.github.com/">github pages</a>; <a href="https://bitbucket.org/">bitbucket</a> там близько не валявся. Варто зазнчаити, що більшу частину роботи тут зробив Мінус-один, бо словники з певних технічних міркувань містять все-таки багато повторень і я просто в шоці як йому вдалось так швидко і з мінімумом помилок наповнити дерево для двох алфавітів.</p>
<h2>Результат</h2>
<p><a name="jp2ua-result"></a><br />
Вийшла ось така формочка, яка транслітерує японську (увага! на сайтах, де цей допис кроспоститься скрипт не працюватиме, тому перевірити можна лише <a href="http://graywolf.org.ua/2012/04/19/jp2ua-transliteration-jquery-widget/#jp2ua-result">тут</a>):</p>
<div id="jp2ua-widget"></div>
<p>В сухому залишку: єдиний і неповторний транслітератор японського алфавіту в українську для <a href="http://uanime.org.ua/article/jap-ukr_translit.html">неофіційної японсько-української транслітерації</a> (прибічники Поліванова та інших можуть прийняти участь у створенні відповідних словників при бажанні).</p>
<p>Для мене ж профіт: вперше попрацював з git&#8217;ом та github&#8217;ом (з останнім я раніше лише пару раз скачував початкові коди якихось модулів та плагіни для redmine) та зробив свій перший екстеншн для jQuery.</p>
<h2>Куточок лінгвістичного маньяка</h2>
<p>Ще раз повторюся, що транслітерація ведеться виключно на словнику, який відповідає <a href="http://uanime.org.ua/article/jap-ukr_translit.html">цій статті</a> Мінус-одного на уаніме. Правила транслітерації зроблені там на основі здоровго глузду і не мають офіційного аналогу. Ці правила (майже) не використовуються в офіційних перекладах (єдиний, мабуть, вийняток &#8211; це &#8220;Міцубіші&#8221; <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-2185' />  ), але їх часто беруть за основу перекладачі-любителі, оскільки на слух вони більш точно відповідають японській вимові, аніж будь-яка з <a href="http://uk.wikipedia.org/wiki/%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%8F_%D1%8F%D0%BF%D0%BE%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D1%97_%D0%BC%D0%BE%D0%B2%D0%B8">офіційних систем</a>.</p>
<h2>Технічний куточок для підростаючого покоління</h2>
<p>Алгоритм жадібний (матчить найдовший можливий патерн) і рекурсивний (найбільша глибина рекурсії дорівнює довжині вхідного рядка + 1; не дуже гарно, але для того застосування де планується &#8211; вистачить). Вхідний словник &#8211; дерево шаблонів побудованих наступним чином:<br />
<img src="http://graywolf.org.ua/wp-content/uploads/2012/04/h2ua-graph.gif" alt="" title="h2ua-graph" width="171" height="242" class="alignnone size-full wp-image-2187 colorbox-2185" /><br />
В js це кодується через вкладний Object:</p>
<pre class="brush: jscript; title: ; notranslate">
var k2ua = {
...
    &quot;し&quot;: {
        &quot;~&quot;: &quot;ші&quot;,
        &quot;ゃ&quot;: &quot;шя&quot;,
        &quot;ゅ&quot;: &quot;шю&quot;,
        &quot;ょ&quot;: {
            &quot;~&quot;: &quot;шьо&quot;,
            &quot;う&quot;: &quot;шьоо&quot;,
        },
    },
...
};
</pre>
<p>Головний мінус цього підходу &#8211; те, що деякі правила (наприклад є символ, який подовжує попередню голосну) треба заносити шляхом дублювання солідних шматків дерева, що не дуже добре, але з іншого боку дозволяє тримати сам алгоритм дуже простим. Плюс знову ж таки прагматичний підхід &#8211; транслітерація практично не змінюється з часом, тому одного разу добре виправивши всі помилки можна далі не перейматись.</p>
<h2>І все-таки про LISP</h2>
<p>Вже потім я знайшов, що в інеті повно <a href="https://www.google.com.ua/search?ix=acb&#038;sourceid=chrome&#038;ie=UTF-8&#038;q=jscript+lisp+interpreter">інтерпретаторів</a> <em>LISP</em> написаних на javascript, але:</p>
<ul>
<li>не відомо чи вистачило б їх можливостей</li>
<li>з практично-користувацької точки зору це був би ще більший оверхед на підключення інтерпретатора</li>
</ul>
<p>Але оригінальна ідея не відкинута, а відкладена&#8230; на невідомий термін.<br />
<script type="text/javascript">
jQuery("#jp2ua-widget").jp2ua();
jQuery("#jap-src").val("かじうら ゆき");
jQuery("#source-map").val("h2ua");
jQuery("#source-map").change();
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2012/04/19/jp2ua-transliteration-jquery-widget/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2012/04/h2ua-graph-150x150.gif" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2012/04/h2ua-graph.gif" medium="image">
			<media:title type="html">h2ua-graph</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2012/04/h2ua-graph-150x150.gif" />
		</media:content>
	</item>
		<item>
		<title>OAuth2 &#8211; промінчик світла в темному царстві?</title>
		<link>http://graywolf.org.ua/2011/12/20/oauth2-the-guiding-light/</link>
		<comments>http://graywolf.org.ua/2011/12/20/oauth2-the-guiding-light/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 22:13:11 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[django-publicauth]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[itblog-ua]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[oauth2]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[vkontakte]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=2029</guid>
		<description><![CDATA[З давніх давен мене завжди харила необхідність реєстрації на сайтах. Чесно. Причому не з якихось там параноїдальних міркувань (мене це дуже мало бентежить), а банально: знову вводити ім&#8217;я користувача, придумувати пароль, тощо&#8230; І тому коли треба реєструватись на комусь сайті &#8230; <a href="http://graywolf.org.ua/2011/12/20/oauth2-the-guiding-light/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div style="float: left; margin: 0 10px 0 0;"><img class="colorbox-2029"  src="http://graywolf.org.ua/wp-content/uploads/2011/12/OAuth2-300x298.png" alt="OAuth2 logo" title="OAuth2 logo" width="300" height="298" /></div>
<p> З давніх давен мене завжди харила необхідність реєстрації на сайтах. Чесно. Причому не з якихось там параноїдальних міркувань (мене це дуже мало бентежить), а банально: знову вводити ім&#8217;я користувача, придумувати пароль, тощо&#8230; І тому коли треба реєструватись на комусь сайті доводиться через стандартну логін/пароль/e-mail процедуру це мене запросто може відлякнути від реєстрації взагалі. Потім з&#8217;явилися всякі OpenID, Facebook Connect, OAuth і життя стало налагоджуватись &#8211; реєстрації на одному з популярних сервісів типу Google/Facebook/Twitter зазвичай вистачає аби мати можливість логінитись на нормальні сайти в один клік: наприклад той самий Покупон ніколи б не отримав моїх грошиків ні за які знижки аби у нього не було реєстрації через Facebook та оплати по Webmoney, коли можна було придбати купончика фактично не торкаючись клавіатури, а просто в кілька тицків мишкою. І впевнений, що я такий не один. Тому останнім часом завжди коли доводиться писати сайт з реєстрацією мну намагається всунути туди реєстрацію через &#8220;3rd party&#8221; сервіси. Але ще рік тому це була нефігова проблема, бо усі ці сервіси використовували різні протоколи і незважаючи на те, що всі вони намагались зробити якнайкраще &#8211; виходило як завжди, бо об&#8217;єднати все це в якусь уніфіковану систему не так вже й тривіально. Чи не найбільше мене напрягав <a href="http://oauth.net/">OAuth</a>, бо при першому знайомстві з його процесом обмінами токенів наскоком без півлітри не розібратися. Причому мало того, кожен сервіс часто використовував свою варіацію протоколу, що знову ж таки ускладнювало написання гнучкого коду.<br />
<span id="more-2029"></span><br />
Коли довелося причіплювати мультиавторизацію останній раз, я вже поступово готувався засісти в ці окопи надовго. Хоча в цьому випадку було простіше &#8211; у <a href="https://www.djangoproject.com/">Django</a> принаймні добрі люди написали <a href="https://bitbucket.org/offline/django-publicauth/wiki/Home">django-publicauth</a>. Документація там бідненька, тому як правильно його заюзати довелося гуглити по коду інших open-source проектів, які його використовували. <em>Facebook</em> тим не менш завівся досить живенько, а от на <em>ВКонтакті</em> вже мило чекали перші граблі: модуль більше року не оновлювався і там API для авторизації встиг змінитися. Доктор сказав &#8220;Різати!&#8221; Як виявилося, російський недофейсбук встиг перейти на <a href="http://oauth.net/2/">OAuth2</a> і (о, диво!) там все було просто як гранчастий стакан (щоб отримати токен для подальших запитів треба зробити лише один редірект та один фоновий запит з мінімумом параметрів). Причому там все було настільки просто і так чудово лягло на архітектуру бекендів <em>django-publicauth</em>, що все пофіксилось буквально за пару годин (включно з вдуплянням в те як все парцює, першим прототипом та подальшим рефакторингом). Мало того, при пошуку інформації про новий протокол виявилося, що Google та Facebook вже теж його підтримують. Коротше кажучи, наступного вечора я переписав і ці дві системи під <em>OAuth2</em> і все працювало як швейцарський годинник. На все про все менше 8 годин часу і майже готовий патч. Кароче, вирішив я <a href="https://bitbucket.org/graywolf/django-publicauth">форкнути</a> <em>django-publicauth</em> на <a href="http://bitbucket.org">bitbucket</a> та влити туди свої правки <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_cool.gif' alt=':cool:' class='wp-smiley colorbox-2029' />  Єдина поки що паршива вівця &#8211; це <em>Twitter</em>, який поки не підтримує другу версію, але благо перша там працює нормально.</p>
<div style="text-align: center;"><img src="http://graywolf.org.ua/wp-content/uploads/2011/12/webflow.png" alt="OAuth2 server-side app flow" title="OAuth2 server-side app flow" width="682" height="464" class="aligncenter size-full wp-image-2033 colorbox-2029" style="border: none;" />
<p>OAuth2 flow for server-side applications</p>
</div>
<p>Ложка дьогтю: не дивлячись на простоту реалізації стандарт OAuth2 ще не затверджено остаточною. Існує кілька його драфтів і всі використовують свої власні інтерпретації. Але за рахунок його простоти складність правок під конкретну реалізацію зазвичай є справою перевизначення пари методів. Причому насправді відмінності дуже тупі. Вконтакт повертає JSON-відповідь із &#8220;зайвим&#8221; рівнем вкладеності, Гугл вимагає авторизувати токен через POST-запит, а Фейсбук повертає результат не в JSON, а в <a href="http://en.wikipedia.org/wiki/Query_string">urlencoded query string</a> <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_confused.gif' alt=':???:' class='wp-smiley colorbox-2029' />  </p>
<p>Стандартизація рулить <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_cool.gif' alt=':cool:' class='wp-smiley colorbox-2029' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2011/12/20/oauth2-the-guiding-light/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2011/12/OAuth2-300x298.png" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2011/12/OAuth2-300x298.png" medium="image">
			<media:title type="html">OAuth2 logo</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2011/12/OAuth2-300x298.png" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2011/12/webflow.png" medium="image">
			<media:title type="html">OAuth2 server-side app flow</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2011/12/webflow-150x150.png" />
		</media:content>
	</item>
		<item>
		<title>Garage48, Startup Mixer, DOU Hackaton і всі, всі, всі&#8230;</title>
		<link>http://graywolf.org.ua/2011/12/19/garage48-project/</link>
		<comments>http://graywolf.org.ua/2011/12/19/garage48-project/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 19:00:27 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[dou hackaton]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[garage48]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[startup mixer]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=2023</guid>
		<description><![CDATA[Мені отут подумалось, чи я єдиний кому цікаво було б якось прийняти участь у якомусь із названих у сабжі заходів? ^_^ Про Хакатон я знав раніше, але якось не склалося, а про два інших дізнався буквально нещодавно. Основна їх ідея &#8230; <a href="http://graywolf.org.ua/2011/12/19/garage48-project/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div style="float: left; margin: 0 10px 0 0;"><img class="colorbox-2023"  src="http://graywolf.org.ua/wp-content/uploads/2011/12/logo.gif" alt="Garage48 logo" title="Garage48 logo" width="148" height="34" /></div>
<p>Мені отут подумалось, чи я єдиний кому цікаво було б якось прийняти участь у якомусь із названих у сабжі заходів? ^_^ Про Хакатон я знав раніше, але якось не склалося, а про два інших дізнався буквально нещодавно. Основна їх ідея &#8211; написати робочий додаток/стартап за дуже обмежену кількість часу (24-48 годин, причому не робочих, а саме календарних!). Я подивився на список того, що <a href="http://garage48.org/highlights">клепали під час проведення Garage48</a> &#8211; вражає.</p>
<p>Отож, з того, що проводиться в Україні я знайшов три: <a href="http://garage48.org/">Garage48</a>, <a href="http://mixer.dou.ua/">Startup Mixer</a>, <a href="http://dou.ua/hackathon/">DOU Hackaton</a>. У першого основний приціл на практику і навчання саме створення і просування стартапів (на заходах присутні &#8220;наставники&#8221;, які допомагають правильно обрати цільову аудиторію, скерувати розробку в умовах обмеженого часу та &#8220;продаж&#8221; ідеї). Другий &#8211; наш український клон першого. Хакатон судячи з того, що я читав у відгуках менш бізнес-орієнтований і більше схоже на змагання &#8220;just for fun&#8221;: зібрались, попили пива, склепали прожку (хоча, що цікаво, судячи з відгуків продуктивність на Хакатонах була вищою ніж на проведеному на минулому тижні <em>Startup Mixer</em>). </p>
<p>Кароче, хацууууу! Схоже, що наступний захід &#8211; це <a href="http://garage48.org/events">Garage48</a> в травні 2012 в Києві. Треба придумати цікаву але компактну ідею і не провтикати дату як завжди.</p>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/LWEcmLRPBvI?hd=1"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2011/12/19/garage48-project/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2011/12/logo.gif" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2011/12/logo.gif" medium="image">
			<media:title type="html">Garage48 logo</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2011/12/logo.gif" />
		</media:content>
	</item>
		<item>
		<title>Перемогти посередність</title>
		<link>http://graywolf.org.ua/2011/11/16/beating-the-averages-translation/</link>
		<comments>http://graywolf.org.ua/2011/11/16/beating-the-averages-translation/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 13:05:55 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[Переклади]]></category>
		<category><![CDATA[itblog-ua]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[philosophy]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[переклад]]></category>
		<category><![CDATA[Пол Грем]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=2001</guid>
		<description><![CDATA[Нарешті в мене дійшли руки перекласти ще одну повчальну статтю Пола Грема про мови програмування, яку я вже згадував у минулому перекладі про &#8220;дух міста&#8221;. Зазвичай подібні &#8220;євангелістичні&#8221; речі я сприймаю вельми критично, оскільки я чудово знаю, що срібних куль &#8230; <a href="http://graywolf.org.ua/2011/11/16/beating-the-averages-translation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>Нарешті в мене дійшли руки перекласти ще одну повчальну <a href="http://www.paulgraham.com/avg.html">статтю</a> <a href="http://www.paulgraham.com/">Пола Грема</a> про мови програмування, яку я вже згадував у минулому перекладі про <a href="http://graywolf.org.ua/2011/07/26/cities-and-ambition/">&#8220;дух міста&#8221;</a>. Зазвичай подібні &#8220;євангелістичні&#8221; речі я сприймаю вельми критично, оскільки я чудово знаю, що срібних куль не існує, але тим не менш думаю, що основна ідея вірна. Читаючи статтю зробіть поправку на те, що вона написана в 2003-му, тобто майже десятиріччя тому і з тих пір дещо змінилося, а Lisp вже не одна така мова-д&#8217;Артаньян <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley colorbox-2001' /> </em></p>
<p><em>Велика подяка <a href="http://bunyk.wordpress.com/">Тарасу</a> за виправлення купи помилок <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-2001' /> </em></p>
<p style="clear: right; text-align: right;">Автор оригіналу: Пол Грем (<a href="http://www.paulgraham.com/bio.html">Paul Graham</a>)<br />
Оригінал: <a href="http://www.paulgraham.com/avg.html">Beating the Averages</a></p>
<div style="text-align: center;"><a href="http://www.flickr.com/photos/alicepopkorn/3704377275/" title="meditation by AlicePopkorn, on Flickr"><img class="colorbox-2001"  src="http://farm4.static.flickr.com/3454/3704377275_faa3b1b513.jpg" width="500" height="333" alt="meditation"/></a>
<p>Photo by <a href="http://www.flickr.com/photos/14111752@N07/3704377275/">AlicePopkorn</a></p>
</div>
<p>Влітку 1995-го я та мій друг Роберт Морріс запустили стартап під назвою <a href="http://docs.yahoo.com/docs/pr/release184.html">Viaweb</a>. Нашою метою було написати програмне забезпечення, що дозволило б користувачам створювати власні онлайн-магазини. Інновацією на той час було те, що наш софт працював на нашому сервері, а інтерфейсом були звичайні веб-сторінки.</p>
<p>Я впевнений, що у багатьох людей виникла подібна ідея в той час, але наскільки я знаю, Viaweb був першим web-додатком. Це виглядало настільки ново для нас, що ми навіть компанію назвали аби підкреслити це: <em>Viaweb</em>, бо наше програмне забезпечення працювало “через Веб” (англ. “via Web”, &#8211; прим. пер.), а не на персональному комп’ютері.</p>
<p>Іншою назвичністю було те, що наш софт було написано здебільшого на мові програмування Lisp. Це був один із найперших великих додатків націлених на кінцевого користувача, написаних на Lisp, який до того часу був прерогативою університетів та дослідницьких лабораторій. <a href="#note-1">[1]</a><br />
<span id="more-2001"></span></p>
<h4>Таємна зброя</h4>
<p>Ерік Реймонд написав ессе під назвою “Як стати хакером” і в ньому, окрім усього іншого, він розповідає майбутнім хакерам про мови, які варто вивчати. Він пропонує розпочати з Python та Java, тому що їх просто вивчити. Серйозний хакер також захоче вивчити C, аби хакати Unix, та Perl для системного адміністрування й cgi-скриптів. І нарешті справжні хакери-аксакали мають подумати про Lisp:</p>
<blockquote><p>Його варто вивчити хоча б заради просвітлення, яке ви отримаєте, коли нарешті осягнете його; цей досвід зробить вас кращим програмістом на решту вашого життя навіть якщо ви майже не будете його використовувати сам по собі.</p></blockquote>
<p>Це той самий аргумент, який ви чуєте, коли говорять про вивчення латини. Вона не забезпечить вас роботою, якщо ви, звісно, не мітите у професори, але покращить ваш розумовий процес і допоможе краще опанувати інші потрібні вам мови, наприклад англійську.</p>
<p>Але хвилиночку. Ця метафора не поширюється так сильно. Причина того, що знання латини не забезпечить вас роботою тому що нею ніхто не розмовляє. Якщо ви писатимете латиною, ніхто вас не зрозуміє. Але Lisp &#8211; це мова програмування і комп&#8217;ютер розмовляє тією мовою, якою до нього спілкуєтсья програміст.</p>
<p>Тож якщо Lisp зробить з вас кращого розробника, як стверджує Ерік, то чому не використовувати його? Якщо художнику дати пензля, який дозволить йому стати кращим художником, то мені здається, що він почав би використовувати його у всіх своїх роботах, чи не так? Я не намагаюсь поглузувати з Еріка Реймонда. В цілому його порада &#8211; слушна. Те що він каже про Lisp &#8211; це загальноприйнятий міф. Але в цьому міфі є суперечність: Lisp зробить вас кращим розробником, але ви не будете його використовувати.</p>
<p>А чому ні? Зрештою, мови програмування &#8211; це всього на всього інструменти. І якщо Lisp справді вирощує кращих програмістів, використовуйте це. А якщо ні, то кому він здався?</p>
<p>І це не теоретичне запитання. Програмне забезпечення &#8211; дуже конкурентний бізнес, схильний до природних монополій. І компанія, яка писатиме софт краще і швидше при інших рівних умовах витіснить конкурентів з ринку. І коли ви запускаєте стартап &#8211; ви це відчуєте дуже швидко. Стартап &#8211; це пан або пропав. Ви або станете багатим, або не отримаєте нічого. Якщо в стартапі ви зробите ставку на не ту технологію, конкуренти розмажуть вас по стінці.</p>
<p>Роберт та я, обидва знали Lisp непогано і ми не бачили жодної причини не довіритись власним інстинктам і обрати його. Ми знали, що всі інші пишуть софт на C++ чи Perl. Але ми також знали, що це ще нічого не означає. Якби ви обирали технологію з цих міркувань, то писали б під Windows. Коли ви обираєте технологію краще ігноруйте те що роблять інші і думайте лише про те, що працюватиме найкраще.</p>
<p>Це особливо справедливо по відношенню до стартапів. У великих компаніях ви можете робити лише те, що роблять інші великі компанії. Але у стартапі ви не можете робити те, що роблять інші стартапи. І я не думаю, що багато людей це розуміють навіть у стартапах.</p>
<p>Середня велика компанія росте приблизно на 10% за рік. Тож якщо ви керуєте великою компанією і працюєте як середньостатистична велика компанія, то ви можете розраховувати, що ви і зростати будете як середньостатистична велика компанія: на 10% в рік.</p>
<p>Звісно ж, ситуація зі стартапами &#8211; аналогічна. Якщо ви робите все як середній стартап, ви очікуєте на середню продуктивність. Проблема в тому, що для стартапа середня продуктивність дорівнює провалу. Коефіцієнт виживання у стартапів набагато менший за 50%. Тож якщо ви започатковуєте стартап &#8211; краще робіть щось дуже дивне. Якщо ви цього не робите &#8211; чекайте проблем.</p>
<p>Тоді в 1995 ми знали те, чого не розуміли наші конкуренти, а деякі не розуміють і досі: коли ви пишете ПЗ, яке працює на ваших серверах, то ви можете самі обрати будь-яку мову, яку захочете. Коли ви пишете програми для ПК, то ваші вподобання будуть схилятися до того, що найближче до ОС під яку ви пишете. Десять років тому (відносно моменту написання статті, тобто 2003 р., &#8211; прим. пер.) під розробкою ПЗ малося на увазі написання програм на C. Але з web-додатками, особливо коли у вас є програмні коди як ОС, так і мови програмування, ви можете обрати будь-яку мову.</p>
<p>Ця нова свобода, щоправда, палка з двома кінцями. Коли ви можете обирати будь-яку мову, треба вже замислитись на вибором: яку? Компанії, які роблять вигляд, що нічого не змінилося ризикують одного разу помітити, що їх конкуренти так не думають.</p>
<p>Якщо обирати будь-яку мову, то яку? Ми обрали Lisp. З одного боку очевидним було, що швидка розробка дуже важлива на цьому ринку. Ми розпочинали з чистого листа, тож компанія, яка могла б запропонувати нові можливості раніше інших, отримувала перевагу. Ми знали, що Lisp &#8211; це гарний вибір для того, аби писати софт швидко, а серверні додатки збільшували цей ефект тим, що ви могли релізитись тої ж хвилини, коли код було написано.</p>
<p>Якщо інші компанії не хотіли його використовувати &#8211; нам же ліпше. Він зробив нас передовиками, але ми не відмовлялись від будь-яких поступок. Коли ми розпочинали Viaweb, ми нічого не тямили в бізнесі. Ми нічого не знали про маркетинг, чи найм працівників, чи залучення інвестицій, чи роботу з клієнтами. У жодного з нас навіть не було досвіду справжньої роботи. Єдина річ, яку ми робили добре &#8211; це написання софту. І ми сподівались, що це допоможе нам. Ми використовували будь-яку перевагу, яку могли собі забезпечити.</p>
<p>Можна сказати, що використання Lisp було експериментом. Нашим припущенням було те, що пишучи софт на Lisp ми могли б впроваджувати нові можливості швидше за наших конкурентів. А оскільки Lisp дуже високорівневий, нам не потрібна була б велика команда розробників, тому наші витрати мали бути значно меншими. Якщо це так, то ми могли б запропонувати кращий продукт за менші гроші і отримати прибуток. Ми б забрали всіх користувачів, а конкуренти не отримали б жодного і пішли б з ринку. Це те на що ми сподівались.</p>
<p>Які ж результати нашого експерименту? В певному сенсі дивовижно, але це спрацювало. Ми мали багато конкурентів, приблизно 20-30, але жоден з них не міг з нами тягатись. Ми мали WYSIWYG-майстерню створення онлайн магазинів, яка працювала через web, але виглядала як додаток для ПК.. У наших конкурентів були CGI скрипти. І могли завжди попереду них по функціональним можливостям. Інколи, у розпачі, конкуренти намагалися реалізувати щось, чого не було у нас. Але цикл розробки на Lisp був настільки швидким, що ми могли реалізувати їх аналог за день чи два після того, як конкуренти анонсували їх у прес-релізі. До того часу, коли журналісти що висвітлювали прес-реліз дзвонили нам, у нас вона вже теж була.</p>
<p>Для наших конкурентів це мабуть здавалося якоюсь таємною зброєю, що ми робили реверс-інжінірінг їх даних, або що. І ми справді мали таємну зброю, але вона була набагато простішою, аніж вони думали. Ніхто не здавав нам новини про їхні фічі. Просто ми могли розробляти софт швидше, аніж будь-хто міг собі уявити.</p>
<p>Коли мені було років дев&#8217;ять, я отримав книжку “День Шакала” Фредеріка Форсайта. Головним героєм був вбивця, якого найняли “прибрати” президента Франції. Він мав пройти повз поліцію, аби дістатися до номера з якого було видно маршрут президента. Він пройшов повз них перевдягнувшись стариганом у лахмітті, якого вони б ніколи не запідозрили.</p>
<p>Наша таємна зброя була чимось подібна. Ми писали наш софт на дивній мові пристосованій лише для створення штучного інтелекту з дивним синтаксисом повним дужок. Роками мене дратував подібний опис Lisp. Але зараз це працювало нам на благо. У бізнесі нема нічого більш цінного, аніж технічна перевага, яку ваші конкуренти навіть не розуміють. В бізнесі як і на війні елемент несподіванки там само важливий як і сила.</p>
<p>Отож, мені трохи ніяково казати, але я ніколи не говорив публічно про Lisp поки ми працювали у Viaweb. Ми ніколи не згадували про нього в ЗМІ, а якщо виконати пошук по сайту компанії, то знайшлася б лише згадка двох книжок у моїй біографії. І це не випадковість. Стартап має давати настільки мало інформації, наскільки можливо. Якщо вони не знали на чому ми писали чи їм було все одно, я намагався підтримувати цей статус-кво. <a href="#note-1">[2]</a></p>
<p>Люди, які розуміли наші технології найкраще &#8211; це клієнти. Їм було все одно на якій мові було написано Viaweb, але вони помічали, що все працювало справді чудово. Вони могли створювати чудові онлайн магазини буквально за хвилини. І таким чином, в основному завдяки їх порадам, ми отримували все більше клієнтів. На початку 1996-го у нас було 70 магазинів. На кінець 1997 &#8211; вже 500, а шість місяців потому, коли нас купив Yahoo!, у нас уже було 1070 користувачів. Зараз під маркою Yahoo Store цей софт досі є лідером на ринку. Це одна з найбільш прибуткових частин Yahoo і магазини створені завдяки ньому стали основою Yahoo Shopping. Я покинув Yahoo в 1999, тож не знаю скільки зараз у них користувачів, але остання цифра, яку я чув &#8211; це 20000.</p>
<h4>Blub-парадокс</h4>
<p>Що ж такого чудового в Lisp? І якщо він такий чудовий, то чого він не використовується масово? Ці питання виглядають риторичними, але насправді на них є прямі відповіді. Lisp чудовий не тому, що там приховано якусь магію, котру видно лише утаємниченим, а просто тому, що це найпотужніша доступна мова. І причина чого вона не дуже поширена в тому, що мови програмування це не просто технології, а й певні розумові звички, які перебороти дуже і дуже складно. Звісно, обидві відповіді вимагають пояснення.</p>
<p>Я почну із шокуюче суперечливої заяви: мови програмування відрізняються за своєю потужністю.</p>
<p>Думаю навряд знайдеться багато людей, які заперечуватимуть, що вискорівневі мови програмування більш потужні за машинний код. Більшість програмістів погодяться, що зазвичай писати на машинній мові &#8211; це не дуже гарна ідея. Натомість краще використовувати високорівневі мови і дати можливість компілятору перевести її в машинний код за вас. Цю ідею зараз навіть використовують у апаратному забезпеченні: з 80-х років набори інструкцій розроблялися для компіляторів, а не для людей.</p>
<p>Кожен знає, що писати всю програму вручну в машинних кодах неправильно. Але мало хто розуміє, що цей принцип можна узагальнити: якщо у вас є вибір мов програмування, то при всіх інших рівних умовах правильно обрати найбільш потужну. <a href="#note-3">[3]</a></p>
<p>Є багато виключень з цього правила. Якщо вам потрібно написати програму, яка має тісно співпрацювати з програмою написаною на певній мові, то краще використовувати саме ту мову. Якщо ви пишете програму, яка робить щось дуже просте, типу обробки чисел чи бітових маніпуляцій, можливо краще використовувати менш абстрактні мови, тим паче, що це може дати помітний приріст у швидкодії. Якщо ж ви пишете маленьку програмку “на викинути”, найкраще використати ту мову, у якої найбільш підходящий набір бібліотечних функцій. Але в цілому для розробки ПЗ вам варто використовувати найбільш потужну (і достатньо ефективну) мову програмування яку тільки зможете, а використання всього іншого &#8211; помилка того ж типу, хоч і в меншій мірі, як і програмування в машинних кодах.</p>
<p>Ви бачите, що машинні коди дуже низькорівневі. Але в певному загальноприйнятому сенсі всі високорівневі мови програмування вважаються еквівалентними. Але вони такими не є. Технічно термін “високорівнева мова” не має під собою чіткого визначення. Немає чіткої границі між машинними мовами з одного боку та всіма високорівневими мовами з іншого. Мови розподіляються по спектру <a href="#note-4">[4]</a> абстрактності від найбільш потужних і до машинних мов, які самі по собі різняться за потужністю.</p>
<p>Наприклад Cobol. Cobol &#8211; високорівнева мова в тому сенсі, що він компілюється в машинний код. Але ви що, правда сперечатиметесь, що Cobol не є еквівалентом, наприклад, Python? Та він мабуть ближчий до машинних мов, аніж до Python.</p>
<p>А як щодо Perl 4? Між Perl 4 та Perl 5 в мову були додані лексичні замикання. І більшість Perl-хакерів погодяться, що Perl 5 потужніший за Perl 4. Але визнаючи це, ви також визнаєте що одна високорівнева мова може бути потужніша за іншу високорівневу мову. І невмолимим є висновок, що окрім певних винятків, ви повинні використовувати найпотужнішу доступну мову.</p>
<p>Щоправда цю ідею рідко доводять до кінця. Після певного віку програмісти рідко добровільно змінюють мовні вподобання. Яку б мову вони не використовували, вони вважають її “достатньо хорошою”.</p>
<p>Програмісти дуже прив&#8217;язуються до улюблених мов і я не хочу образити нічиїх почуттів, тому я поясню все на прикладі гіпотетичної мови Blub. Blub знаходиться рівно посередині спектру абстрактності. Він не є найбільш потужним, але значно потужніший за Cobol чи машинний код.</p>
<p>І насправді наш гіпотетичний Blub-розробник не буде використовувати жоден з них. Звісно, він не писатиме в машинних кодах. Для цього є компілятори. А щодо Cobol, то він не знає як на ньому написати все, що йому треба. У нього ж просто немає X (бідь-яка фіча Blub на ваш вибір).</p>
<p>До тих пір поки гіпотетичний Blub-розробник дивиться на спектр вниз він знає, що він дивиться вниз. Мови менш потужні за Blub очевидно менш потужні, бо в них нема тих можливостей до яких він звик. Але коли цей розробник подивиться в іншу сторону, вверх по спектру потужності, він не розумітиме, що дивиться вверх. Все, що він бачить &#8211; це лише дивні мови. Він мабуть навіть вважає їх еквівалентними Blub по потужності, але з усіма цими незрозумілими заморочками. Blub для нього “достатньо гарний”, бо він думає на ньому.</p>
<p>Коли ми поглянемо на те саме з точки зору програміста, який використовує мову, що знаходиться вище по спектру потужності, ми побачимо, що він дивиться на Blub згори. Як на ньому взагалі можна писати? У нього ж нема Y!</p>
<p>По індукції лише програмісти, що дивляться з висоти достатньої аби оцінити всю різницю в потужності різних мов можуть сказати які з них насправді найбільш потужні (і мабуть це саме те, що мав на увазі Ерік Ремонд, коли казав, що Lisp зробить з вас кращого розробника). Ви не можете довіритись думці інших через Blub-парадокс:: всі задоволені тією мовою, якою їм доводиться користуватись, тому що вона диктує їм те як писати.</p>
<p>Я знаю це із власного досвіду як старшокласник, що писав програми на Basic. Ця мова навіть рекурсію не підтримує. Важко уявити написання програми без використання рекурсії, але тоді мені її геть не бракувало. Я думав на Basic. І я був його гуру. Знав всі його трюки.</p>
<p>П&#8217;ять мов, що рекомендує Ерік Реймонд, розташовані в різних точках спектру потужності. Питання відносних відстаней між ними дуже чутлива тема. Я б помістив Lisp на його вершину. І аби підкріпити це твердження я скажу про одну з речей, якої мені бракує в чотирьох інших. Я думаю: &#8220;як на них взагалі можна щось написати без макросів?&#8221; <a href="#note-5">[5]</a></p>
<p>Багато мов мають особливість, яка називається називається макросами. Але макроси Lisp унікальні. І хочете &#8211; вірте, хочете &#8211; ні, але це пов&#8217;язано з дужками. Дизайнери Lisp засунули туди ці дужки не просто аби відрізнятись від інших. Для Bulb-програміста код на Lisp виглядає дивно. Але дужки там не просто так. Вони очевидний доказ фундаментальної різниці між Lisp там всіма іншими мовами.</p>
<p>Код на Lisp конструюється з об&#8217;єктів Lisp. І не в тому тривіальному сенсі, що програмний код складається з символів, а рядки &#8211; це один з типів даних що підтримується мовою. Код на Lisp після його прочитання парсером представляє собою структуру даних, яку можна обійти.</p>
<p>Якщо ви розумієте як працюють компілятори, то зрозумієте, що справа не в тому, що у нього дивний синтаксис, а в тому, що у нього його немає. Ви пишете програми у вигляді дерева, які насправді генеруються в нетрях компіляторів, що парсять інші мови. Але ці дерева повністю доступні з вашої програми. Ви можете писати програми, які ними маніпулюватимуть. В Lisp ці програми називаються макросами. Це програми, що пишуть програми.</p>
<p>Програми, що пишуть програми? Вам це взагалі потрібно? Не дуже, якщо ви думаєте на рівні Cobol. Ввесь час, якщо ви думаєте на рівні Lisp. Зручно було б якби я міг навести тут приклад потужного макросу і сказати: “Ось! Як вам таке?” Але якби я це зробив, це виглядало б повною тарабарщиною для людини, яка не знає Lisp; і тут не вистачить місця, аби описати все, що вам потрібно знати, аби зрозуміти його значення. В Ansi Common Lisp я намагався проходити всі теми якомога швидше і все одно дістався до макросів лише на 160-й сторінці.</p>
<p>Але я думаю, що зможу навести приклад, який може бути переконливим. Програмний код Viaweb редактора складався з макросів на 20-25%. Макроси важче писати, аніж звичайні функції Lisp і використовувати їх там де це не обов’язково &#8211; ознака поганого тону. Тому кожен макрос в тому коді був там, тому що він мав там бути. Це означає, що як мінімум 20-25% коду програми роблять речі, які не так-то легко зробити засобами інших мов. Яким би скептиком не був Blub-програміст відносно моїх заяв про потужність Lisp, цього має бути достатньо аби розпалити його зацікавленість. Ми не писали код заради власного задоволення. Ми були крихітним стартапом і програмували щосили аби звести технічні мури між нами та нашими конкурентами.</p>
<p>Підозріла людина може почати цікавитись а чи не було тут якоїсь відповідності? Великий шматок нашого коду робив речі майже неможливі в інших мовах. Наш софт робив речі, які були неможливі для софту наших конкурентів. Можливо це речі пов&#8217;язані. Я заохочую вас розплутати цей клубок самостійно. Можливо у того старигана в лахмітті приховано щось, що так одразу і не побачиш.</p>
<h4>Айкідо для стартапів</h4>
<p>Я не розраховую переконати всіх вчити Lisp. Мета цієї статті була не змінити чийсь світогляд, а підштовхнути людей, яких цікавить Lisp &#8211; людей, які знають що він потужний, але побоюються, що його дуже рідко використовують. У конкурентному середовищі це перевага. Потужність Lisp примножується тим фактом, що ваші конкуренти цього не розуміють.</p>
<p>Якщо ви думаєте використовувати Lisp у стартапі, не переживайте, що не всі вас зрозуміють. Вам навпаки краще сподіватись на цей статус-кво. І скоріш за все так і буде. Така природа мов програмування: програмісти задовольняються тим, що в них є. Апаратне забезпечення змінюється набагато швидше ніж звички, тому практики програмування вже відстають від потужності процесорів на 10-20 років. У закладах типу Массачусетського технологічного університету пишуть програми на високорівневих мовах з середини 60-х, але багато компаній продовжували писати програми в машинних кодах аж до 80-х. Я впевнений, що багато хто продовжував писати на машинних мовах поки процесор, як бармен, що взяв, закрив заклад і просто пішов додому, нарешті залишив їх не при справах переходом на RISC інструкції.</p>
<p>Звичайні технології змінюються швидко. Але мови програмування інші: вони представляють собою не просто технологію, а те як програмісти мислять. Вони наполовину &#8211; технології, а наполовину &#8211; релігія. <a href="#note-6">[6]</a> І середньостатистична мова (тобто будь-яка мова, якою користується середньостатистичний програміст) розвивається зі швидкістю айсберга. Garbage collection, що з’явився в Lisp ще у 60-х зараз вважається гарною річчю. Runtime-типізація теж набирає популярність. Лексичні замикання, що з’явились в Lisp ще на початку 70-х зараз лише з’явились на “радарах”. Макроси, запропоновані в Lisp в середині  &#8211; 80-х і досі “terra incognita”</p>
<p>Очевидно, що середньостатистична мова має неймовірну інерцію. Я не пропоную протистояти цій потужній силі. Я пропоную цілком протилежне: як і людина, що займається айкідо &#8211; використовуйте це проти своїх суперників.</p>
<p>Якщо ви працюєте у великій компанії &#8211; це буде нелегко. Вам складно буде переконати тупуватого начальника дозволити написати щось на Lisp, коли він лише щойно прочитав, що якась інша мова програмування приречена на успіх, як пророкували мові Ada 20 років тому. Але якщо ви працюєте у стартапі, у якого ще немає тупуватого начальства, ви можете використати Blub-парадокс на власну користь: використати технологію, яку ваші конкуренти, скуті середньостатистичними мовами, ніколи не зможуть перевершити.</p>
<p>Якщо ви хоч колись зустрінетесь зі стартапами, ось підказка як можна легко їх оцінити. Подивіться кого вони наймають на роботу. Все, що написано у них на сайті &#8211; це стокові фото та всяка лірика, але опис вакансій розповість про те, що ж саме вони хочуть зробити, або вони набирають не тих людей.</p>
<p>За роки роботи у Viaweb я прочитав багато описів вакансій. Нові конкуренти, здається, з’являлись нізвідки майже кожен місяць. Перша річ, яку я перевіряв після їх online-демо, це відкриті вакансії. Після кількох років я вже розумів, які компанії могли представляти потенційну загрозу, а які &#8211; ні. Чим більше звичних речей було в описів вакансій, тим меншу небезпеку вона представляла. Найбільш безпечними були ті, що вимагали досвід роботи з Oracle. Про них можна було одразу забути. Вам також не треба було особливо переживати відносно компаній, що шукали C++ та Java розробників. Якщо компанія шукала розробників на Perl чи Python &#8211; її вже треба було остерігатися, адже це компанії, де принаймні за технічну сторону відповідали справжні хакери. Якби я зустрів опис вакансії на місце Lisp-розробника, то це мене б дуже сильно занепокоїло.</p>
<h4>Примітки</h4>
<p><a name="note-1">[1]</a> Viaweb складався з двох частин: редактор, насписаний на Lisp за допомогою якого люди будували сайти та система замовлень написана на C. Перша реалізація була написана на Lisp майже повністю, бо система замовлень була дуже простою. Пізніше ми додали ще два модулі: генератор картинок написаний на C та back-office менеджер написаний здебільшого на Perl.</p>
<p>У січні 2003 Яху випустила нову версію редактора написану на C++ та Perl. Але важко було сказати, що це вже не був Lisp, бо для того, аби переписати код на C++ їм фактично довелось написати власний інтерпретатор: програмні коди генератора сторінок, наскільки мені відомо, досі написані на Lisp.</p>
<p><a name="note-2">[2]</a> Роберт Морріс каже, що мені не треба було цього приховувати, бо навіть якби наші конкуренти знали, що ми використовуємо Lisp, вони не зрозуміли б чому: “Якби вони були достатньо розумними для цього, то самі використовували б Lisp.”</p>
<p><a name="note-3">[3]</a> Всі мови рівнопотужні в сенсі еквівалаентності машині Тюрінга, але програмісти ніколи не мають на увазі саме цю еквівалентність (ніхто ж не пише для машини Тюрінга). Потужність про яку говорять програмісти складно визначити формально, але одним із способів описати її буде: можливість мови більш потужної може бути реалізована на мові менш потужній лише шляхом написання інтерпретатора більш потужної мови. Якщо у мові А є оператор для видалення пробілів з рядка, а у мові Б &#8211; ні, то це не робить мову А більш потужною, бо ви можете написати функцію, яка робитиме те саме в Б. Але якщо А підтримує, скажімо, рекурсію, а Б &#8211; ні, то це вже не реалізуєш простим написанням бібліотечної функції.</p>
<p><a name="note-4">[4]</a> Примітка для нердів: можливо це решітка, що звужується догори; форма не має значення, але ідея в тому, що там є принаймні частковий порядок.</p>
<p><a name="note-5">[5]</a> Це трохи невірно трактувати макроси як окрему фічу. На практиці їх користь значно збільшується завдяки іншим можливостям Lisp типу лексичних замикань та залишкових параметрів.</p>
<p><a name="note-6">[6]</a> В результаті порівняння мов програмування або приймає вид релігійних воєн, або книжок для школярів показово нейтральних, як взірець гуманізму. Люди, що знаю ціну своєму часу та душевний спокій оминають цю тему. Але це питання релігійне лише наполовину; його варто вивчати, особливо якщо ви хочете винайти нову мову.</p>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2011/11/16/beating-the-averages-translation/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
	
		<media:thumbnail url="http://farm4.static.flickr.com/3454/3704377275_faa3b1b513.jpg" />
		<media:content url="http://farm4.static.flickr.com/3454/3704377275_faa3b1b513.jpg" medium="image">
			<media:title type="html">meditation</media:title>
			<media:thumbnail url="http://farm4.static.flickr.com/3454/3704377275_faa3b1b513.jpg" />
		</media:content>
	</item>
		<item>
		<title>Agile Eastern Europe. Season 3</title>
		<link>http://graywolf.org.ua/2011/10/15/agileee-season-3/</link>
		<comments>http://graywolf.org.ua/2011/10/15/agileee-season-3/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 22:53:38 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[conference]]></category>
		<category><![CDATA[training]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=1930</guid>
		<description><![CDATA[Три тижні тому мну мав змогу побувати на Agileee: третій східноєвропейській конференції по agile методологіям розробки. Два дні занурення в позаробочу ІТ-атмосферу спілкування та обміну досвідом (бачив кілька колишніх співробітників &#8211; всім привіт ^_^). Дуже надихаючі два дні. Так, там &#8230; <a href="http://graywolf.org.ua/2011/10/15/agileee-season-3/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div style="float: left; margin: 0 10px 0 0;"><img class="colorbox-1930"  src="http://graywolf.org.ua/wp-content/uploads/2011/10/Agile_Logo_eee-300x127.png" alt="Agileee logo" title="Agileee logo" width="300" height="127" /></div>
<p> Три тижні тому мну мав змогу побувати на <a href="http://agileee.org/" title="Agile Eastern Europe Conference">Agileee</a>: третій східноєвропейській конференції по <a href="http://uk.wikipedia.org/wiki/%D0%93%D0%BD%D1%83%D1%87%D0%BA%D0%B0_%D1%80%D0%BE%D0%B7%D1%80%D0%BE%D0%B1%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%B1%D0%B5%D0%B7%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%BD%D1%8F">agile</a> методологіям розробки. Два дні занурення в позаробочу ІТ-атмосферу спілкування та обміну досвідом (бачив кілька колишніх співробітників &#8211; всім привіт ^_^). Дуже надихаючі два дні. Так, там часто говорилось про речі, які здавалося б очевидні і відомі, але описані іншими словами, або просто практичними прикладами вони набували іншого сенсу, що давало можливість поглянути на відому сутність з різних сторін.</p>
<p>Мінусів було не так багато. Найбільший &#8211; вартість заходу. 300 ойро я сам особисто навряд заплатив би навіть за таку чудову конференцію (тому дякую <a href="http://www.materialise.com/Dental">MD</a> за надану можливість ^_^). Ще один момент з яким навряд можна щось зробити &#8211; це те, що деякі цікаві (і навпаки нудні) доповіді були паралельно і доводилося мучитись вибором між двома. В результаті я не потрапив на дуже цікаву судячи по слайдах <em>&#8220;Programmers Anarchy&#8221;</em> <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-1930' />  </p>
<p>Ну а тепер трохи про найбільш цікаві доповіді та ідеї&#8230;<br />
<span id="more-1930"></span></p>
<h2>&#8220;Effective Software Development in the 21st Century: The New Face Of Software Engineering&#8221; by Dr. Alistair Cockburn</h2>
<p><img src="http://graywolf.org.ua/wp-content/uploads/2011/10/decision-jam.jpg" alt="Decision Jam" title="Decision Jam" width="474" height="322" class="alignright size-full wp-image-1938 colorbox-1930" style="float: right;" /></p>
<p>Найцікавішою для мене частина була про &#8220;Flow management&#8221;, оскільки це були одні з граблів на які я вже встиг наступити і почерпнув деякі (здавалося б цілком очевидні) ідеї відносно правильної організації роботи. Звісно, сам принцип розбиття слона на маленькі шматочки, які можна проковтнути замість того аби надкушувати його з різних сторін &#8211; відомий, але по-людськи орагнізувати це мені не вдалося і зрештою все скотилося до малюнку справа. І саме під час доповіді у мене з&#8217;явилися ідеї як це можна було б реалізувати значно краще, і чому у нас вийшла така лажа і затримки з написанням вимог до софту. Якщо описати коротко, то ідея полягає в тому, щоб перетворити затори на постійні потоки балансуванням завантаження: в нашому випадку ми самі створили собі затор у вигляді системного аналітика в той час як просто правильно обираючи невеликі шматки для реалізації можна було організовувати &#8220;зелені коридори&#8221; для тих чи інших фіч, коли всі, хто задіяні у її створенні, не мали б постійно чогось чекати (насправді все одно це було б не так просто, але позбавило б значної кількості головного болю точно).</p>
<p>Інша цікава частина &#8211; про ефективні комунікації, яка спонукала якомога частіше використовувати засоби до візуалізації, які значно покращують сприйняття інформації. Наприклад, для географічно розподілених команд &#8211; замість документу/електронного листа одна з опцій була використовувати відеозаписи, а замість звичайного телефонного спілкування &#8211; відеодзвінок, на якому було б ще видно whiteboard.</p>
<p>Було трохи про загальновідомі речі типу того, що варто всі ризики зміщувати на початок проекту наповнюючи свій багаж знань про нього, аби далі значно точніше оцінювати залишки роботи. І знову ж таки хоча на нашому проекті намагалися йти цією стежкою, але не в усіх можливих аспектах.</p>
<p>Коротше кажучи, одна з найбільш заслужених доповідей серед &#8220;keynote&#8221; (ключових).</p>
<p><iframe src="http://player.vimeo.com/video/30429229?title=0&amp;byline=0&amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe>
<p><a href="http://vimeo.com/30429229">Keynote by Dr. Alistair Cockburn at AGILEEE 2011</a> from <a href="http://vimeo.com/user8869159">AGILEEE</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<div style="width:425px" id="__ss_9421927"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/agileee/effective-software-development-in-the-21st-century-9421927" title="Effective Software Development in the 21st Century" target="_blank">Effective Software Development in the 21st Century</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9421927" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/agileee" target="_blank">Agileee</a> </div>
</p></div>
<h2>&#8220;Challenging requirements&#8221; by Gojko Adzic</h2>
<p>Непогана лекція про те, що ніколи не варто сприймати вимоги до ПЗ в тому вигляді, в якому вони приходять від замовника, а завжди докопуватись до самої сутності їх потреб &#8211; навіщо воно їм треба. Просто багато цікавих прикладів, причому не лише у сфері розробки ПЗ: найцікавішим був приклад про те, що <a href="http://en.wikipedia.org/wiki/McDonnell_Douglas_F-15_Eagle">F-15 Eagle</a>, один з найуспішніших в історії винищувів, свого часу виграв тендер незважаючи на той факт, що він не виконав <em>основну</em> технічну вимогу &#8211; швидкість більшу за 2.6 <a href="http://uk.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%9C%D0%B0%D1%85%D0%B0">махи</a>. Інженери виявили основну причину цієї вимоги &#8211; радянські ракети літали зі швидкістю 2.6, тому більша потрібна була, аби мати можливість втекти від них &#8211; і замість того щоб робити як було написано у документі &#8211; зробили літак неймовірно маневреним. В результаті &#8211; виграний тендер і (судячи з Вікіпедії) жодного програшу в понад 100 повітряних дуелей. Отаке.</p>
<div style="width:425px" id="__ss_5757653"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/gojkoadzic/challenging-requirementsoredev" title="Challenging Requirements/Oredev" target="_blank">Challenging Requirements/Oredev</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/5757653" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/gojkoadzic" target="_blank">gojkoadzic</a> </div>
</p></div>
<h2>&#8220;Overcoming Self-organization Blocks&#8221; by Andrea Provaglio</h2>
<p>Вельми цікава лекція про те як змінити свої погляди на командну роботу, створювати правильні &#8220;потоки креативної енергії&#8221; і уникнути типових помилок, які заважають команді самоорганізовуватись, а останнє &#8211; це ключ до її успішності.</p>
<p>Одна фраза, яка сподобалася багатьом присутнім: &#8220;In school if you copy you steal (you&#8217;re a bad guy). Is software if you copy you collaborate.&#8221; Говорилося це в контексті того, що поточна система освіти робить фокус на персональній, а не колективної роботі, обмежуючи останню і відкладаючи отримання одного з найважливіших практичних навичок у реальному житті на потім.</p>
<p><iframe src="http://player.vimeo.com/video/30152188?title=0&amp;byline=0&amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe>
<p><a href="http://vimeo.com/30152188">Andrea Provaglio &#8220;Overcoming Self-organization Blocks&#8221;</a> from <a href="http://vimeo.com/user2696171">Agile Eastern Europe</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<div style="width:425px" id="__ss_7483970"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/provaglio/overcoming-selforganization-blocks" title="Overcoming Self-organization Blocks" target="_blank">Overcoming Self-organization Blocks</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/7483970" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/provaglio" target="_blank">Andrea Provaglio</a> </div>
</p></div>
<h2>&#8220;Motivation 3.0 and Agile&#8221; by Danny (Danko) Kovatch</h2>
<p>Мабуть найбільш цікава доповідь з усіх. Тут було багато про що: і про творчу роботу та самомотивацію людей (основна ідея &#8211; не пробувати мотивувати, а просто не заважати закладеним в людях творчим імпульсам), про <a href="http://confluence.atlassian.com/display/DEV/Atlassian+FedEx+Days">Atlassian FedEx Days</a> (про який ми згадували сьогодні, щоправда я помилився &#8211; робота все-таки має відноситись до продукту, але не бути офіційним завданням). Шкода, що відику (ще) немає, але є сама презентація:</p>
<div style="width:425px" id="__ss_9421952"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/agileee/movivation-30" title="Movivation 3.0" target="_blank">Movivation 3.0</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9421952" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/agileee" target="_blank">Agileee</a> </div>
</p></div>
<h2>&#8220;Inside Iteration Zero: simple steps to make great products&#8221; by Nikita Filippov and Askhat Urazbaev</h2>
<p>Ідея з story-mapping&#8217;ом та backbone (хребтом) проекту &#8211; це круто. Сама ідея з backbone витала в повітрі з самого початку, але я не знав навіть, що у неї є назва і більше того: є певні інструменти як її реалізувати.</p>
<div style="width:425px" id="__ss_9405856"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/Nfilippov/simple-steps-to-makes-great-products" title="Simple steps to makes great products" target="_blank">Simple steps to makes great products</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9405856" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/Nfilippov" target="_blank">Nikita Filippov</a> </div>
</p></div>
<p>Сама доповідь була подана так собі (ІМХО), та після неї я поліз в Інет шукати інфу про story-mapping і знайшов іншу, більш детальну і практичну презентацію від Паттона:</p>
<div style="width:425px" id="__ss_3013499"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/nashjain/user-story-mapping" title="User Story Mapping" target="_blank">User Story Mapping</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/3013499" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/nashjain" target="_blank">Naresh Jain</a> </div>
</p></div>
<h2>&#8220;Programmer Anarchy&#8221; by Antonio Terreno</h2>
<p>На цій доповіді я не був, але проглянув презентацію &#8211; вельми цікаво. Дуже багато чого перекликається з модним нині Kanban і в певній мірі це мрія кожного манагера &#8211; вибудувати команду, яка буде настільки самоорганізованою, що він стає непотрібен <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-1930' />  Деякі речі звідси насправді з перемінним успіхом намагається прищепити нам наш department manager, але не всі ще розуміють чому це кльово і навіщо це потрібно. Шкода, що багато чого реалізувати в такому ключі не вийде із-за специфіки наших продуктів.</p>
<div style="width:425px" id="__ss_9415721"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/aterreno/programmer-anarchy" title="Programmer Anarchy" target="_blank">Programmer Anarchy</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9415721" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/aterreno" target="_blank">Antonio Terreno</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2011/10/15/agileee-season-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2011/10/Agile_Logo_eee-300x127.png" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2011/10/Agile_Logo_eee-300x127.png" medium="image">
			<media:title type="html">Agileee logo</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2011/10/Agile_Logo_eee-300x127.png" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2011/10/decision-jam.jpg" medium="image">
			<media:title type="html">Decision Jam</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2011/10/decision-jam-150x150.jpg" />
		</media:content>
	</item>
		<item>
		<title>Mercurial саторі. Частина 2</title>
		<link>http://graywolf.org.ua/2010/09/09/mercurial-satori-2/</link>
		<comments>http://graywolf.org.ua/2010/09/09/mercurial-satori-2/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 12:10:46 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[itblog-ua]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[tortoisehg]]></category>
		<category><![CDATA[vcs]]></category>
		<category><![CDATA[winmerge]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=1569</guid>
		<description><![CDATA[Минулого разу я вже оглядово ознайомив вас із основними принципами роботи з Mercurial, а тепер час зробити нашу роботу зручнішою. Цього разу я буду більше сфокусований на реальній роботі з Меркуріалом під ОС Windows. перший крок для цього &#8211; треба &#8230; <a href="http://graywolf.org.ua/2010/09/09/mercurial-satori-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><center><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/tortoisehg-logo.png"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/tortoisehg-logo.png" alt="TortoiseHG" title="TortoiseHG" width="447" height="118" class="alignсутеук size-full wp-image-1570" /></a></center></p>
<p>Минулого разу я вже оглядово ознайомив вас із <a href="http://graywolf.org.ua/2010/09/02/mercurial-satori-1/">основними принципами роботи з Mercurial</a>, а тепер час зробити нашу роботу зручнішою. Цього разу я буду більше сфокусований на реальній роботі з Меркуріалом під ОС Windows. перший крок для цього &#8211; треба скачати <a href="http://tortoisehg.bitbucket.org/">TortoiseHG</a>. Це shell-extension для роботи з Mercurial під Windows. Також поки ви читатимете ці рядки рекомендую заодно завантажити <a href="http://winmerge.org/">WinMerge</a> &#8211; це інструмент для візуалізації змін та злиття коду. Справа в тому, що вбудований у стандартну поставку Mercurial <em>KDiff3</em> фактично неюзабельний і тому нам його потрібно буде замінити на більш зручний. Звісно, вибір інструменту виключно за вами (WinMerge просто мій особистий фаворит), якщо у вас є власні преференції серед <em>merge tools</em> &#8211; ви зможете аналогічним чином прикрутити щось інше. Ну а тепер трохи пройдемося по конфігураційному файлу <em>Mercurial</em>. Те, що тут описано буде частково цікавим і для тих, хто працює з <em>Mercurial</em> під <em>*nix</em>&#8216;и.<br />
<span id="more-1569"></span></p>
<h3>Конфігураційний файл Mercurial</h3>
<p>Під ОС Windows він знаходиться в домашній папці вашого користувача:</p>
<p>Для <em>Windows XP</em> та молодше:</p>
<pre class="brush: plain; title: ; notranslate">C:\Documents and Settings\username\Mercurial.ini</pre>
<p>Для <em>Windows Vista</em> та старше:</p>
<pre class="brush: plain; title: ; notranslate">C:\Users\username\Mercurial.ini</pre>
<p>Для <em>*nix</em>:</p>
<pre class="brush: plain; title: ; notranslate">~/.hgrc</pre>
<p>Насправді місць де він може лежати дещо більше (наприклад, можуть бути конфіг-файли специфічні для репозитарію), але щоб не плутатись зупинимось на цих місцях. Якщо кому цікаво, може також почитати <a href="http://www.selenic.com/mercurial/hgrc.5.html">офіційну документацію</a>.</p>
<p>Мій конфігурацівйний файл виглядає приблизно так:</p>
<pre class="brush: plain; title: ; notranslate">[ui]
username = graywolf
merge = winmergeu

[paths]
projectname= https://graywolf@bitbucket.org/graywolf/projectname

[auth]
projectname.username = graywolf
projectname.password = PASSWORD
projectname.schemes = http https

[extdiff]
cmd.winmerge = C:\Program Files (x86)\WinMerge\WinMergeU.exe
opts.winmerge = /e /x /ub /wl

[merge-tools]
winmergeu.executable = C:\Program Files (x86)\WinMerge\WinMergeU.exe
winmergeu.priority = 1
winmergeu.fixeol = True
winmergeu.checkchanged = True
winmergeu.args = /e /ub /dl other /dr local $other $local $output
winmergeu.gui = False
winmergeu.binary = True

[tortoisehg]
vdiff = winmerge

[extensions]
mq =
rebase =
legacy-merge = C:\Program Files (x86)\Mercurial\hgext\legacy-merge.py</pre>
<p>Пройдемося трохи по кожному пункту. Секція <em>[ui]</em> відповідає за інтерфейс користувача. В моєму випадку використовуютсья лише два параметри:</p>
<ul>
<li><strong>username</strong> &#8211; ім&#8217;я буде використовуватись при ваших commit&#8217;ах в репозитарій. </li>
<li><strong>merge</strong> &#8211; зовнішня утиліта, яка буде використовуватись для злиття коду</li>
</ul>
<p>Секція [paths] дозволяє створити псевдоніми (alias) для url-посилань на проекти. Тобто коли ви будете наступного разу робити push/pull, то можна давати команду: </p>
<pre class="brush: plain; title: ; notranslate">$ hg push projectname</pre>
<p>замість </p>
<pre class="brush: plain; title: ; notranslate">$ hg push https://graywolf@bitbucket.org/graywolf/projectname</pre>
<p>Секція <em>[auth]</em> дозволяє налаштувати деякі параметри підключення до зовнішніх репозитаріїв. Наприклад, логін та пароль. Пароль взагалі-то прописувати не дуже гарна ідея, бо він зберігається лише як <em>plain-text</em>. Також можна обмежити пролтоколи по яким дозволено обінюватись даними з віддаленими репозитаріями, але це не обов&#8217;язково. Зверніть увагу, що налаштування прив&#8217;язуються до конкретних проектів, причому проект ідентифікуєтсья його alias&#8217;ом: <em><alias>.
<param></param></alias></em></p>
<p>Секції <em>[extdiff]</em> та <em>[merge-tools]</em> використовуються щоб вказати Меркуріалу які утиліти використовувати для перегляду змін та злиття файлів відповідно. В нашому випадку я прописав <em>WinMerge</em>. <em>[tortoisehg]</em> &#8211; відповідно налаштування специфічні для <em>TortoiseHG</em>. В деталі налаштувань тут я не вникав, бо це все одно був копіпаст готового рішення <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-1569' />  </p>
<p>Ну і нарешті сама корисна частина конфігураційного файлу: секція <em>[extensions]</em>. Стандартний комплект <em>Mercurial</em> вже іде із <a href="http://mercurial.selenic.com/wiki/UsingExtensions#Extensions_Bundled_with_Mercurial">великою їх кількістю</a>, але вони за замовченням виключені і включаютсья з конфігураційного файлу по необхідності. Найбільш корисною тут буде розширення <strong>mq</strong>, яке додає фічу під назвою <em>strip changeset</em> &#8211; можливість видаляти ревізії з репозитарію. Щоб увімкнути extension потрібно додати в секцію <em>[extensions]</em> рядок:</p>
<pre class="brush: plain; title: ; notranslate">extension = path_to_extension</pre>
<p>для стандартних розширень шлях до нього можна опустити. В моєму прикладі підключено два стандартних (<em>rebase</em> та <em>mq</em>) і одне самописне розширення до Mercurial (це, до речі, інша цікава тема, але досить велика і за бажанням я можу згодом описати окремо).</p>
<h3>TortoiseHG</h3>
<p>Тепер прийшов час продемонструвати типовий сеанс роботи з <em>TortoiseHG</em>. Нехай у нас уже є якись проект, до якого ми хочемо прикрутити Mercurial. Заходимо в нього через Windows Explorer і клікаємо правою конопкою на каталозі з проектом (взагалі всі операції з TortoiseHG виконуютсья через контекстне меню каталога, тому надалі я про це згадувати не буду) і вибираємо <em>TortoiseHG > Create Repository Here</em>.</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-1.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-1.jpg" alt="TortoiseHG. Create repo" title="TortoiseHG. Create repo" width="437" height="151" class="aligncenter size-full wp-image-1574 colorbox-1569" /></a></p>
<p>У вікні, що відкрилося залишаємо все як є. Мені особисто підтримка старих репозитаріїв не потрібна була, а от файли типу <em>.hgigniore</em> &#8211; це необхідність.</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-2.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-2.jpg" alt="TortoiseHG. Create repo window" title="TortoiseHG. Create repo window" width="429" height="162" class="aligncenter size-full wp-image-1575 colorbox-1569" /></a></p>
<p>Далі нам потрібно зробити початковий <em>commit</em>, що ми і робимо вибравши відповідний пункт в контекстному меню каталогу. У верхньому полі заповнюємо опис коміту.</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-3.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-3.jpg" alt="TortoiseHG. Initial commit" title="TortoiseHG. Initial commit" width="868" height="623" class="aligncenter size-full wp-image-1576 colorbox-1569" /></a></p>
<p>Оскільки це початковий коміт, а проект у нас уже робочий пропоную одразу додати відповідні виключення, щоб деякі проміжні файли не попали в нього і не муляли очі далі. Для цього знаходимо будь-який файл, який ми не хочемо підключати до версійного контролю і в його контекстному меню вибираємо <em>Ignore</em>. Відкриється вікно редагування ігнор-списку:</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-4.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-4.jpg" alt="TortoiseHG. Ignore list" title="TortoiseHG. Ignore list" width="724" height="475" class="aligncenter size-full wp-image-1577 colorbox-1569" /></a></p>
<p>Там в лівому списку видно поточні рядки для ігнору, а справа &#8211; файли які проходять фільтрацію (тобто неігноровані). Ваша задача скласти список виразів для ігнорування, щоб в правому списку залишились лише корисні файли (але всі <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-1569' />  ). Фільтри можна задавати або як регулярні вирази (regexp), або файлові маски (glob). Мені поки що вистачало і останнього. Щоб додати фільтр &#8211; вводите маску у верхньому рядку і натискаєте відповідну кнопку <em>Add</em>. Мій типовий ігнор-список для проекту на <em>Visual Studio 2008</em> виглядає так:</p>
<pre class="brush: plain; title: ; notranslate">glob:Debug
glob:Release
glob:GeneratedFiles
glob:*.suo
glob:*.user
glob:*.pch
glob:*.ncb</pre>
<p>Закриваємо вікно ігнор-списку &#8211; тепер в лівому списку файлів для коміту залишились лише небхідні нам. Вибираємо їх всі і в контекстному меню цього списку клікаємо <em>&#8220;Add&#8221;</em>. Тепер навпроти всіх них в списку має з&#8217;явитися літера <em>&#8220;A&#8221;</em>. Тепер можна натискати <em>&#8220;Commit&#8221;</em> в тулбарі і вуа-ля. Ваш перший коміт в локальний репозитарій. Можна закривати вікно коміту. Зверніть увагу також, що комітяться лише файли відмічені галочкою, тобто при бажанні можна зробити кілька комітів.</p>
<p>До речі, якщо нам потрібно буде видалити файл з проекту, то потрібно буде в контекстному меню вибрати пункт <em>&#8220;Forget&#8221;</em> (трохи дивний вибір назви), причому він видалить одразу і локальну копію, так що обережно <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley colorbox-1569' /> </p>
<p>По замовчуванню <em>commit</em> робиться в поточу гілку. Для новостворених проектів це завжди <strong>default</strong>. Для того, щоб створити іншу гілку розробки теж достатньо лише закомітити зміни, але перед тим як натиснути кнопку над полем вводу опису коміту, назва якої починається з <em>&#8220;brahch: &#8220;</em>. Відкриєтсья вікно, де ви можете ввести назву нової гілки. Гілка створюється після фактичної операції <em>commit</em>.</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-5.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-5.jpg" alt="" title="TortoiseHG. Branch." width="387" height="189" class="aligncenter size-full wp-image-1579 colorbox-1569" /></a></p>
<p>Зробимо деякі зміни в проекті і за комітимо їх. Зліва тепер буде лише список змінених файлів, а якщо вибрати один з цих файлів, то справа будуть показані зміни у форматі <em>diff</em>. Але це незручно, легше двічі клікнути на файлі і якщо ви зробили як описано вище, то відкриєтсья <em>WinMerge</em>.</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-6.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-6.jpg" alt="" title="TortoiseHG. Commit changes" width="868" height="636" class="aligncenter size-full wp-image-1580 colorbox-1569" /></a></p>
<p>Оскільки робоча копія є в певному сенсі і репозитарієм, то аби виконати ті чи інші дії Меркуріалу потрібно скористатись робочою копією. Але в цей час у вас можуть бути якісь зміни, які ще рано комітити, але які ви не хочете втратити. Для цього запропоновано механізм <em>Shelve/Unshelve</em> коли ви можете поточні зміни відносно базової ревізії відкласти на поличку (shelve), виконати необхідні операції з репозитарієм, повернутися до базової ревізії, дістати зміни з полички (unshelve) і отримаєте початковий стан речей. Вікно <em>shelve</em> можна викликати або з контекстного меню каталогу, або вибравши <em>Tools > Shelve</em> в головному меню вікна <em>Commit</em>.</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-7.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-7.jpg" alt="TortoiseHG. Shelve" title="TortoiseHG. Shelve" width="694" height="623" class="aligncenter size-full wp-image-1581 colorbox-1569" /></a></p>
<p>Тепер ознаомимося з найцікавішим вікном <em>TortoiseHG</em> і яким ви будете користуватись найбільше. Це <em>Repository Explorer</em>, який можна викликати з контекстного меню каталогу. Ось так приблизно виглядає це вікно для великого проекту, над яким працює декілька людей. Це основний &#8220;центр управління польотами&#8221;. Звідси можна синхронізувати репозитарії, зливати гілки, видаляти ревізії, дивитись граф та історію розробки. Зліва видно граф, в якому можна відслідковувати залежності ревізій. Вибравши ревізію можна внизу подивитись які файли та як саме змінилися. Якщо ввести у полі URL репозитарію адресу, то можна користуватись кнопками pull (зелена стрілочка вниз) та push (зелена стрілочка вверх), які будуть відповідно завантажувати з, або вивантажувати на репозитарій, що знаходиться за вказаною адресою.</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-8.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-8.jpg" alt="TortoiseHG. Repository explorer" title="TortoiseHG. Repository explorer" width="970" height="733" class="aligncenter size-full wp-image-1582 colorbox-1569" /></a></p>
<p>Просимулювати це можна дуже просто. У контекстному меню каталогу вибираєте <em>TortoiseHG > Web Server</em> і якщо вас влаштовує порт за замовчуванням натискаєте <em>Start</em>. З вікна, де написано <em>&#8220;listening at&#8221;</em> копіюєте URL.</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-9.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-9.jpg" alt="" title="TortoiseHG. Web server" width="600" height="233" class="aligncenter size-full wp-image-1584 colorbox-1569" /></a></p>
<p>Далі заходите в іншу папку (не репозитарій) і з контекстного меню вибираєте <em>TortoiseHG > Clone</em>, де в полі <em>Source</em> прописуєте щойно скопійований рядок. В <em>Destination</em> вказуєте де хочете розмістити копію репозитарію. Робите <em>Clone</em> і якщо відкриєте щойностворений клон репозитарія у <em>Repository Explorer</em> побачите, що це точна копія репозитарія іншого. Зробіть в новому деякі змни, закомітьте їх і в тому-таки <em>Repository Explorer</em> натисніть кнопку Push. Тепер відкрийте в RE оригінальний репозитарій і побачите, що вони знову ідентичні. Ось така нескладна магія. Єдине що у вас активною вважатиметься все ще ревізія на якій ви працювали до оновлення (в RE вона підсвічуєтсья більшим колом навпроти імені ревізії), тому щоб отримати останні зміни в робочий каталог треба в <em>Repository Explorer</em> клацнути правою кнопкою на останній (найновішій) ревізії та в контекстному меню вибрати <em>Update</em>.</p>
<p>Для того, щоб злити дві гілки в одну треба вибрати гілку куди ви збираєтесь злити зміни клацнувши на ній лівою кнопкою миші, а потім, не знімаючи цього виділення, клацнути правою на тій ревізії яку ви хочете злити у першу і в контекстному меню, що з&#8217;явилося вибираєте <em>Merge with&#8230;</em>. З&#8217;явиться вікно, у якому тепер треба натиснути кнопку <em>Merge</em>. <em>Mercurial</em> сам спробує по можливості все злити, але якщо він десь сумніватиметься, то вискочить вікно з вашим <em>Merge tool</em>, у якому вам буде запропоновано розібратися з конфліктами самостійно. Для <em>WinMerge</em> результат, який ви хочете побачити в кінці має бути у правому вікні. Після того як ви побачите сакральне <em>&#8220;Merge Successful&#8221;</em> зміни треба знову закомітити (бо merge робиться виключно в робочій папці як активні зміни).</p>
<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-10.jpg"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-10.jpg" alt="TortoiseHG. Merge" title="TortoiseHG. Merge" width="582" height="396" class="aligncenter size-full wp-image-1585 colorbox-1569" /></a></p>
<p>От наразі і всі основи роботи з <em>Mercurial</em>. Якщо виникли запитання &#8211; welcome. Можливо мене якось проб&#8217;є зробити скрінкаст для наглядності, але це точно буде нескоро <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley colorbox-1569' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2010/09/09/mercurial-satori-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/tortoisehg-logo-150x118.png" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/tortoisehg-logo.png" medium="image">
			<media:title type="html">TortoiseHG</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/tortoisehg-logo-150x118.png" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-1.jpg" medium="image">
			<media:title type="html">TortoiseHG. Create repo</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-1-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-2.jpg" medium="image">
			<media:title type="html">TortoiseHG. Create repo window</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-2-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-3.jpg" medium="image">
			<media:title type="html">TortoiseHG. Initial commit</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-3-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-4.jpg" medium="image">
			<media:title type="html">TortoiseHG. Ignore list</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-4-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-5.jpg" medium="image">
			<media:title type="html">TortoiseHG. Branch.</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-5-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-6.jpg" medium="image">
			<media:title type="html">TortoiseHG. Commit changes</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-6-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-7.jpg" medium="image">
			<media:title type="html">TortoiseHG. Shelve</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-7-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-8.jpg" medium="image">
			<media:title type="html">TortoiseHG. Repository explorer</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-8.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-9.jpg" medium="image">
			<media:title type="html">TortoiseHG. Web server</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-9-150x150.jpg" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-10.jpg" medium="image">
			<media:title type="html">TortoiseHG. Merge</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/thg-10-150x150.jpg" />
		</media:content>
	</item>
		<item>
		<title>Mercurial саторі. Частина 1</title>
		<link>http://graywolf.org.ua/2010/09/02/mercurial-satori-1/</link>
		<comments>http://graywolf.org.ua/2010/09/02/mercurial-satori-1/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 12:17:45 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[dvcs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[itblog-ua]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[svc]]></category>
		<category><![CDATA[версіїї]]></category>
		<category><![CDATA[меркуріал]]></category>
		<category><![CDATA[рскв]]></category>
		<category><![CDATA[скв]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=1520</guid>
		<description><![CDATA[Скоро мені знадобиться знайомити одного майбутнього молодого розробника з таїнством користування системами контролю версій (надалі VCS, version control system) і тому щоб трохи систематизувати те, що я збирався розповісти, вирішив написати цей допис. Він розрахований на зовсім базовий рівень роботи &#8230; <a href="http://graywolf.org.ua/2010/09/02/mercurial-satori-1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://graywolf.org.ua/wp-content/uploads/2010/09/mercurial_logo.png"><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/mercurial_logo.png" alt="" title="Mercurial (Меркуріал)" width="200" height="240" class="alignleft size-full wp-image-1523 colorbox-1520" align="left" /></a> Скоро мені знадобиться знайомити одного майбутнього молодого розробника з таїнством користування системами контролю версій (надалі VCS, <em>version control system</em>) і тому щоб трохи систематизувати те, що я збирався розповісти, вирішив написати цей допис. Він розрахований на зовсім базовий рівень роботи і тому тут багато розжовувань, які більш досвідченим особам наврядчи будуть цікаві. Знайомство одразу буду проводити на прикладі сучасних розподілених систем, в нашому випадку <a href="http://mercurial.selenic.com/">Mercurial</a>.</p>
<h3>Навіщо воно треба?</h3>
<p>Для людей які хоч трохи займались програмуванням відповідь має бути очевидною, але на всяк випадок нагадаю: під час роботи над чимось ви сто відсотків будете проходити якісь віхи розробки і контроль версій дозволить отримувати стан проекту на певний момент. Плюс можна створювати гілки розробки. Уявіть, що при побудові будинку ви вирішите добудувати якийсь незапланований поверх, але не впевнені чи все триматиметься як слід. Ви віртуально дублюєте поточний будинок, будуєте свій поверх, поки інші будівельники тим часом працюють по запланованому графіку. Потім ви вирішуєте, що результат вашої роботи вас влаштовує ви плеском в долоні вставляєте його у існуючий будинок. А може будівельники десь помилились при розрахунках і набудували якусь фігню, то вони можуть так само швидко відкотитись до місця коли щось пішло не так.<br />
До речі, місце де зберігаютсья всі стани проекту в термінах VCS називаєтсья репозитарій, а місце в якому ви вносите правки &#8211; відповідно робоча копія. Процес відправки набору змін з робочої копії до репозиторію &#8211; це операція <em>commit</em>. Репозитарії часто зберігають десь подалі, не на робочих машинах, щоб у випаку коли у вас, наприклад, здохне комп, весь код можна буде повіністю відновити. У мене був гіркий досвід збереження єдиного екземпляру коду одного сайту на ноуті, який згодом сперли&#8230; З тих пір я не розлучний -з VCS та бекап-системами типу <a href="http://graywolf.org.ua/2009/02/10/dropbox-sync-and-backup/">Dropbox</a> і зберігаю всі важливі дані в інтернеті. Плюс зручно, що можна з легкістю отримувати точні копії на будь-яку машину.<br />
І нарешті ще одна зручна штука в користуванні VCS, хоч і похідна від нього &#8211; це можливість робити code review &#8211; огляд змін які зробив розробник між версійми коду. Принципироботи code review-систем чудово накладаються на принципи роботи VCS і тому вони часто бувають нерозлучні, коли якість коду має велике значення.<br />
<span id="more-1520"></span></p>
<h3>Розподілені VCS</h3>
<p>Як писалося вище, існують поняття репозитарію та робочої копії. У VCS, які були популярні донедавна було чітке розподілення обов&#8217;язків: репозитарій був один і центральний, часто на виділеному сервері. Кожний <em>commit</em> відправляв дані з робочої копії до репозиторію. В певному сенсі це було не завжди зручно у випадку, коли ви хочете закинути кілька змін різними commit&#8217;ами на сервер, що знаходиться в інтернеті. По перше, процес зазвичай досить повільний, по-друге, за відсутності зв&#8217;язку з інтернетом ви взагалі не зможете зробити <em>commit</em>.</p>
<p>Тому щоб побороти подібні недоліки прийшли <em>розподілені системи контролю версій</em>: <a href="http://mercurial.selenic.com/">Mercurial</a>, <a href="http://git-scm.com/">Git</a>, <a href="http://bazaar.canonical.com/en/">Bazaar</a>, тощо&#8230; Суть їх проста: кожна копія проекту є одночасно і репозитарієм і робочою копією. Тобто вся робота по суті виконуєтсья локально, але існує механізм синхронізації між самотніми репозитаріями. За такої організації вищезгадані проблеми з відсутністю зв&#8217;язку з інтернетом нівелюються &#8211; ви можете робити весь спектр операцій з VCS локально. Але як я вже казав зберігати дані локально &#8211; небезпечно, тому зазвичай в інтернеті відкривають віддалені репозитарії, які слугують таким собі хабом між людьми які працюють з даними. Тобто синхроніхація репозитаріїв іде не кожен-з-кожним (хоча і такий принцип організації можливий), а всі синхронізуютсья лише з віддаленим (але навіть за його недоступності робота може продовжуватись).</p>
<p>Розподілених VCS є кілька. Найбільш популярні наразі <a href="http://git-scm.com/">Git</a> та <a href="http://mercurial.selenic.com/">Mercurial</a>. Вибір між ними справа релігійна, але якщо цікаво порівняти, то ось гарний <a href="http://code.google.com/p/support/wiki/DVCSAnalysis">аналіз від Google (англ)</a>.</p>
<h3>Працюємо з Mercurial</h3>
<p>Як я вже говорив, робоча копія Mercurial фактично є заодно і репозиторієм, але всі зрізи версій зберігаються в каталозі <strong>.hg</strong> з мета-інформацією репозиторія. Поза цією папкою власне робоча копія. Не видаляйте папку, бо втратите репозиторій!</p>
<p>Варіантів для отримання локального репозитарію проекту два:</p>
<ul>
<li>якщо він існує на іншому комп&#8217;ютері чи сервері і тоді вам треба виконати команду <em>clone</em>:
<pre class="brush: plain; title: ; notranslate">$ hg clone http://path/to/your/repository</pre>
<p>вона створить копію репозитарію з вказоного URL в поточному каталозі
</li>
<li>якщо ви створюєте новий проект, то потрібно виконати команду <em>init</em> в папці з проектом:
<pre class="brush: plain; title: ; notranslate">$ hg init</pre>
<p> потім додати всі потрібні файли командою <em>add</em>:</p>
<pre class="brush: plain; title: ; notranslate">$ hg add</pre>
<p> <strong>Увага!</strong> У вас в каталозі можуть бути файли, які не варто зберігати: наприклад, &#8220;.obj&#8221;-файли C++ чи Пітонівські &#8220;.pyc&#8221;.<br />
  для цього в кореневій папці (на одному рівні з папкою &#8220;.hg&#8221;) треба створити файл <em>.hgignore</em> з вмістом типу:</p>
<pre class="brush: plain; title: ; notranslate">glob:*.bak
glob:*.obj
glob:Debug
glob:Release</pre>
<p>  і так далі&#8230; Можна також прописувати не лише файли, а і цілі каталоги (Debug та Release в прикладі вище).
</li>
</ul>
<p>Далі можна працювати з кодом. Якщо додавались нові файли &#8211; не забувати виконувати команду <em>add</em>. Коли потрібно залити зміни в репозитарій виконуємо команду <em>commit</em>:</p>
<pre class="brush: plain; title: ; notranslate">$ hg commit</pre>
<p>Тепер варто трохи поговорити про синхронізацію репозитаріїв, але для цього треба зробити невеликий ліричний відступ. Із-за розподіленої архітектури дерево ревізій в Mercurial утворює досить цікаві завитки. В же централізованих системах дерево ревізій представляє собою ланцюжок. Тобто робота виглядає наступним чином:</p>
<ol>
<li>була деяка початкова ревізія №1, яку для подальшої роботи стягнули два розробники</li>
<li>обидва щось поправили і один був першим, хто закомітив зміни на сервер, і з&#8217;явилась ревізія №2</li>
<li>другий спробував закомітитись, але сервер відмовив, вказавши що не може залити зміни поверх версії №1. Тому другий розробник має забрати собі версію №2 з репозиторія та об&#8217;єднати (або як часто кажуть <em>&#8220;змерджити&#8221;</em> від англомовного терміну <em>merge</em>) докупи зміни з ревізії №2 та свої власні правки. Часто це проходить автоматично, але буває, що треба ручна правка, коли зміни торкаються однакових фрагментів коду. Потім об&#8217;єднаний код можна комітити в репозиторій і так з&#8217;явиться ревізія №3</li>
</ol>
<p>Таким чином у централізованих системах є лише одна &#8220;головна&#8221; ревізія, а самі ревізії йдуть одна за одною. Ось так це виглядає схематично:</p>
<p><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/svn-rev.gif" alt="" title="SVN revision history" width="413" height="68" class="aligncenter size-full wp-image-1530 colorbox-1520" /></p>
<p>У розподілених систем нема центрального сервера, а всі коміти йдуть локально, тому типовий приклад роботи з ними наступний:</p>
<ol>
<li>є центральний хаб з якого два розробники забирають єдину ревізію №1</li>
<li>обидва роблять правки та локальні коміти, таким чином і у першого, і у другого на комп&#8217;ютері з&#8217;являється по дві ревізії: загальна №1 і у кожного власна №2</li>
<li>вони обидва синхронізують свої копії зі спільним репозитарієм і в результаті на спільному репозиторії з&#8217;являється три ревізії: №1, №2 та №3. Таким чином утворилося дві &#8220;головні&#8221; ревізії №2 та №3.</li>
<li>один з розробників знову синхронізує репозиторій і у нього з&#8217;являєтясь копія спільного. Він може оновити локальну копію до однієї з головних ревізій і продовжити роботу в цій &#8220;підгілці&#8221;, а може об&#8217;єднати (змержити) зміни з №2 та №3 і закомітити їх як ревізію №4: таким чином граф ревізій утворить ромб.</li>
</ol>
<p><img src="http://graywolf.org.ua/wp-content/uploads/2010/09/hg-rev.gif" alt="" title="Mercurial revision history" width="600" height="435" class="aligncenter size-full wp-image-1531 colorbox-1520" /></p>
<p>Синхронізація в <em>Mercurial</em> однонаправлена: тобто за одну операцію можна або залити свої ревізії у віддалений репозиторій (операція <em>push</em>), або отримати звідти ревізії у свій локальний (операція pull).</p>
<pre class="brush: plain; title: ; notranslate">$ hg pull http://path/to/your/repository
$ hg push http://path/to/your/repository</pre>
<p>Поки що це вся теоретична частина. Якщо ви працюєте під ОС Windows, то життя собі можна значно полегшити, якщо поставити собі <a href="http://tortoisehg.bitbucket.org/">TortoiseHg</a> &#8211; графічний фронт-енд для роботи з Меркуріал. Плюс роботу можна зробити зручнішою та розширити потужність системи поправивши конфігураційний файл <em>Mercurial</em>. Але це я залишу на наступний раз.</p>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2010/09/02/mercurial-satori-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/mercurial_logo-150x150.png" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/mercurial_logo.png" medium="image">
			<media:title type="html">Mercurial (Меркуріал)</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/mercurial_logo-150x150.png" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/svn-rev.gif" medium="image">
			<media:title type="html">SVN revision history</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/svn-rev-150x68.gif" />
		</media:content>
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/09/hg-rev.gif" medium="image">
			<media:title type="html">Mercurial revision history</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/09/hg-rev-150x150.gif" />
		</media:content>
	</item>
		<item>
		<title>Google App Engine + Django</title>
		<link>http://graywolf.org.ua/2010/04/08/google-app-engine-django/</link>
		<comments>http://graywolf.org.ua/2010/04/08/google-app-engine-django/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 21:14:46 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Code snippets]]></category>
		<category><![CDATA[appengine]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[gaeutilities]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[itblog-ua]]></category>
		<category><![CDATA[zipimport]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=1385</guid>
		<description><![CDATA[Яким би поганим не здався мені на перший погляд Datastore у Google App Engine, але тим не менш для багатьох проектів і його буде цілком достатньо (тим паче, що у roadmap його розвитку майорить довгоочікуваний повнотекстовий пошук). Тому для платформи &#8230; <a href="http://graywolf.org.ua/2010/04/08/google-app-engine-django/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://graywolf.org.ua/wp-content/uploads/2010/04/django-logo-negative-300x136.png" alt="django-logo-negative" title="django-logo-negative" width="120" class="alignright size-medium wp-image-1397 colorbox-1385" /> <img class="colorbox-1385"  src="http://code.google.com/appengine/images/appengine-silver-120x30.gif" alt="Powered by Google App Engine" align="right" />Яким би <a href="http://graywolf.org.ua/2009/05/24/google-datastore-sucks/">поганим не здався мені на перший погляд Datastore</a> у <a href="http://code.google.com/appengine/">Google App Engine</a>, але тим не менш для багатьох проектів і його буде цілком достатньо (тим паче, що у roadmap його розвитку майорить довгоочікуваний повнотекстовий пошук). Тому для платформи одного з нових міні-проектів, які нещодавно спали мені на думку мну вибрав саме <em>Google App Engine</em>. Водночас мну дуже вже звик до фреймворку <a href="http://www.djangoproject.com/">Django</a> і мається на увазі не лише його <em>ORM</em>, тому вирішив підключити його останню версію (в комплекті з GAE йде 0.96, яка вже ну дууууже застаріла). Але не за допомогою костилів (<a href="http://code.google.com/p/google-app-engine-django/">цього</a> чи <a href="http://code.google.com/p/app-engine-patch/">ось цього</a>) як минулого разу, а просто напряму і викинувши все зайве (тобто фактично все, що було зав&#8217;язано на <em>ORM</em>). І не дивлячись на те, що в Інеті було повно мануалів по підключенню <em>Django</em> помучитись в неочікуваних місцях трохи довелося.<br />
<span id="more-1385"></span><br />
По-перше, сама збірка <em>Django</em>. Я підбирав модулі частково експериментальним шляхом і щоб не прописувати все вручну постійно зробив собі простенький <strong>.bat</strong>-файл, який пакує в архів необхідну частину джанги:</p>
<pre class="brush: plain; title: ; notranslate">
&quot;C:\Program Files\7-Zip\7z.exe&quot; a django.zip ^
django\__init__.py ^
django\bin ^
django\core ^
django\conf ^
django\db ^
django\dispatch ^
django\forms ^
django\http ^
django\middleware ^
django\shortcuts ^
django\template ^
django\templatetags ^
django\test ^
django\utils ^
django\views ^
django\contrib\__init__.py ^
django\contrib\contenttypes ^
django\contrib\localflavor ^
django\contrib\markup ^
django\contrib\sitemaps ^
django\contrib\humanize ^
django\contrib\formtools
</pre>
<p>Зібраний цим скриптом архівний файлик я підклав у корінь новоствореного gae-проекту. Причому пакування в архів тут робиться не задля економії дискового простору. Просто у <em>App Engine</em> є обмеження на кількість файлів, а в проекті <em>Django</em> їх дуже багато. Тепер залишилась справа за малим: підмінити <em>Django</em> що йде у комплекті з <em>GAE</em> на нашу версію, яку ми завантажимо з архіву за допомогою фічі <a href="http://docs.python.org/release/2.6/library/zipimport.html">zipimport</a>. Тут все досить просто (це мій поточний варіант скрипта, але думаю без якихось проблем має запрацювати і той, що виклдаений на <a href="http://code.google.com/intl/uk/appengine/articles/django10_zipimport.html">офіційній сторінці інтеграції GAE та Django</a>):</p>
<p><strong>main.py</strong></p>
<pre class="brush: python; title: ; notranslate">#!/usr/bin/env python
# main.py

import os, sys, logging
os.environ[&quot;DJANGO_SETTINGS_MODULE&quot;] = &quot;projectname.settings&quot;

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Uninstall Django 0.96.
for k in [k for k in sys.modules if k.startswith('django')]:
    del sys.modules[k]

# Add Django 1.0 archive to the path.
django_path = 'django.zip'
sys.path.insert(0, django_path)

# Force Django to reload its settings.
from django.conf import settings
settings._target = None

import django.core.handlers.wsgi
import django.core.signals
import django.db

def log_exception(*args, **kwds):
    logging.exception('Exception in request:')

# Log errors.
django.core.signals.got_request_exception.connect(log_exception)

# Unregister the rollback event handler.
django.core.signals.got_request_exception.disconnect(django.db._rollback_on_exception)

def main():
    # Create a Django application for WSGI.
    application = django.core.handlers.wsgi.WSGIHandler()

    # Run the WSGI CGI handler with that application.
    util.run_wsgi_app(application)

if __name__ == &quot;__main__&quot;:
    main()
</pre>
<p>Але найцікавіша частина над якою я намучився найбільше &#8211; це налаштування файлу <strong>settings.py</strong> в самому <em>Django</em>. По-перше, треба повідключати модулі зав&#8217;язані на Django ORM, тобто видалити або закоментити Middleware-класи:</p>
<p><code>django.contrib.sessions.middleware.SessionMiddleware<br />
django.middleware.csrf.CsrfViewMiddleware<br />
django.contrib.auth.middleware.AuthenticationMiddleware<br />
django.contrib.messages.middleware.MessageMiddleware</code></p>
<p><strong>NOTE:</strong> <em>SessionMiddleware</em> варто замінити на той, що йде у комплекті з <a href="http://gaeutilities.appspot.com/">gaeutilities</a> &#8211; тоді ви принаймні зможете скористатись портованим аналогом сессій.</p>
<p>Контекст-процесори:</p>
<p><code>django.contrib.auth.context_processors.auth<br />
django.contrib.messages.context_processors.messages</code></p>
<p>Та додатки:</p>
<p><code>django.contrib.auth<br />
django.contrib.sessions<br />
django.contrib.sites<br />
django.contrib.messages</code></p>
<p>Також, наскільки я зрозумів, портована версія Django має певні проблеми з підтримкою i18n, тому в конфігураційному файлі її варто відключити (але питання інтернаціоналізації для мене вельми актуальне, тому найближчим часом постараюсь цю проблему вирішити):</p>
<p><code>USE_I18N = False</code></p>
<p>Ну от в принципі і все. Мну черпав джерело натхнення з:</p>
<ul>
<li><a href="http://thomas.broxrost.com/2008/04/08/django-on-google-app-engine/">Django on Google App Engine in 13 simple steps by Thomas Brox R?st</a></li>
<li><a href="http://habrahabr.ru/blogs/django/25696/">Django приложение на Google App Engine by diadya_vova</a></li>
<li><a href="http://code.google.com/intl/uk/appengine/articles/django10_zipimport.html">Using Django 1.0 on App Engine with Zipimport by Dan Sanderson</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2010/04/08/google-app-engine-django/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/04/django-logo-negative-150x150.png" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/04/django-logo-negative.png" medium="image">
			<media:title type="html">django-logo-negative</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/04/django-logo-negative-150x150.png" />
		</media:content>
		<media:content url="http://code.google.com/appengine/images/appengine-silver-120x30.gif" medium="image">
			<media:title type="html">Powered by Google App Engine</media:title>
			<media:thumbnail url="http://code.google.com/appengine/images/appengine-silver-120x30.gif" />
		</media:content>
	</item>
		<item>
		<title>Скрінсейвер з гарними фотками для ледачих</title>
		<link>http://graywolf.org.ua/2010/01/26/screensaver-with-cool-rss-photos/</link>
		<comments>http://graywolf.org.ua/2010/01/26/screensaver-with-cool-rss-photos/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 22:44:42 +0000</pubDate>
		<dc:creator>graywolf</dc:creator>
				<category><![CDATA[Мережі та ІТ]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[itblog-ua]]></category>
		<category><![CDATA[picasa]]></category>
		<category><![CDATA[screensaver]]></category>
		<category><![CDATA[yahoo pipes]]></category>

		<guid isPermaLink="false">http://graywolf.org.ua/?p=1325</guid>
		<description><![CDATA[Багатьом людям рано чи пізно стандартний майкрософтівський прапорець набридає і вони шукають якоїсь гарненької заміни. Одним хочеться оживити &#8220;відпочиваючий&#8221; комп&#8217;ютер усякими там анімованими пейзажами чи акваріумними рибками (ненав&#8217;язлива реклама ), а іншим типу мене обожнює дивитись на всякі там гарні &#8230; <a href="http://graywolf.org.ua/2010/01/26/screensaver-with-cool-rss-photos/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://graywolf.org.ua/wp-content/uploads/2010/01/ss_collage-300x212.jpg" alt="Google Photos Screensaver" title="Google Photos Screensaver" width="300" height="212" class="alignleft size-medium wp-image-1326 colorbox-1325" align="left" /> Багатьом людям рано чи пізно стандартний майкрософтівський прапорець набридає і вони шукають якоїсь гарненької заміни. Одним хочеться оживити &#8220;відпочиваючий&#8221; комп&#8217;ютер усякими там <a href="http://screensaver.in.ua/">анімованими пейзажами чи акваріумними рибками</a> (ненав&#8217;язлива реклама <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley colorbox-1325' />  ), а іншим типу мене обожнює дивитись на всякі там гарні фотки. Скрінсейверів, що просто показують фотографії з певних каталогів на диску нині дофіга, але всам факт завантажування фоток такого ледащо і гіка як я вельми дратує &#8211; ну не сучасно це, і кому ті зайві рухи потрібні? От як би то його зробити, щоб воно саме&#8230; Та сучасні технології не стоять на місці і вже мабуть навіть останній найледачіший користувач інтернету знає про інсування <a href="http://uk.wikipedia.org/wiki/RSS">стрічок RSS</a> &#8211; найзручнішого засобу отримувати свіжу інформацію без нагальної необхідності лазити по сайтах (найбільш адекватні з них ще й користуються єдино вірною RSS-читалкою &#8211; <a href="http://reader.google.com/">Google Reader</a>, але зрештою донесення цієї істини до варварів не є темою цього допису і залишаєтсья на самоопрацювання). Так от, одне з чудес <strong>RSS</strong> полягає в тому, що воно дозволяє додавати в стрічку не лише звичайні статті (з текстом, відео та картинками), а і долучати до нього медіа-дані (як аттачменти у електронній пошті). Ті самі відео та картинки, але не як елемент статті, а як окрему сутність (в термінах RSS воно називається <em>enclosure</em>). Це важливо, бо комп&#8217;ютери все-таки тупі і виділити потрібну картинку з-поміж тексту їм не так легко як людині. Думаю ви розумієте до чого я веду: картининки можна автоматично отримувати з відповідних RSS і не треба нічого самотужки качати &#8211; розумні програми зроблять все за вас. Єдина умова &#8211; щоб ці картинки були оформлені у стрічці як <em>enclosue</em> (на жаль, не всі фото-сайти настільки просунуті, щоб видавати стрічки картинок з картинками не у вигляді вмісту новини, а саме як додаток).<br />
<span id="more-1325"></span><br />
Вибір самих RSS з фотографіями чи картинками та скрінсейвера з підтримкою їх завантаження з чих стрічок &#8211; справа смаку, але особисто мну для цих цілей рекомендує дві речі: фотки краще всього діставати з найкращого сайту по фотографії &#8211; <a href="http://flickr.com/">Flickr</a>, а в якості самого скрінсейвера <strong>Google Photos Screensaver</strong>. З останнім, щоправда, Гугль зробив невелику підлість &#8211; раніше це був окремий продукт, а зараз він іде виключно як складова <a href="http://picasa.google.com/">Google Picasa</a>, яка мені в повному обсязі нафіг не треба, бо я замість <em>Пікаси</em> все одно більш полюбляю <a href="http://www.adobe.com/products/photoshoplightroom/">Adobe Lightroom</a> (бета версія якого ще нещодавно була безкоштовною, але як зараз &#8211; не знаю). Але повертаючись до нашого барану&#8230; Нижче показано як виглядає його налаштування за замовчуванням (дефолтна стрічка вже декілька місяців, на жаль, не працює, а там були непогані фото). При додаванні нової RSS-стрічки він перевіряє її на наявність додатків-фотографій і якщо таких не буде, то скаже, що вона не підходить.</p>
<p><a href="http://www.scrnshots.com/users/graywolf/screenshots/225780"><img class="colorbox-1325"  src="http://s3.amazonaws.com/scrnshots.com/screenshots/225780/gphotoscreensaver-settingspng" /></a></p>
<p>Чим крутий <a href="http://flickr.com/">Флікр</a>? По-перше, тим, що це зараз мабуть найбільший і найкращий сайт де можна знайти справді гарні фотки практично всього що завгодно. Плюс саме завдяки ньому я частково відучився від поганої практики завантаження фоток на локальну машину. Навіщо? Щоб вона потім згубилась в нетрях диску? Краще вподобану вами на <em>Флікрі</em> фотографію додати собі у &#8220;favorites&#8221; &#8211; вона буде там присутня поки власнк не надумає її видалити (що буває вкрай рідко), плюс автор фото дізнається, що вона вам сподобалась і йому буде приємно. По-друге, цей сайт багато в чому передовий і там підтримується згадана вище RSS з фото-додатками майже для всього що тільки можна! Хочете отримати фотки, у яких в тегах прописано &#8220;кіт&#8221; &#8211; будь-ласка, з певної групи &#8211; ніяких проблем, власні вподобання &#8211; та залюбки&#8230;</p>
<p><a href="http://www.scrnshots.com/users/graywolf/screenshots/225788"><img class="colorbox-1325"  src="http://s3.amazonaws.com/scrnshots.com/screenshots/225788/flickr-feedpng" /></a></p>
<p>Єдиний мінус Флікра &#8211; це жлобство деяких професійних (і не дуже) фотографів <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-1325' />  В тому сенсі, що вони викладають лише зменшені копії своїх фотографій і тому при показі скрінсейвера воно виглядє убого. Я довго мучився з цим, поки одного осіннього ранку, чи то вечора на мене не зійшло осяяння під назвою <a href="http://pipes.yahoo.com/pipes/">Yahoo Pipes</a>. Це така кльова штука, яка дозволяє збирати та модифікувати дані з різних джерел та видавати у потрібному вигляді, але при цьому не вимагає від вас ніяких навичок програмування <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley colorbox-1325' />  В нашому випадку задача проста як двері: взяти RSS-потік з додатками-картинками та відфільтрувати його по розмірам зображень, але про це я напишу вже іншим разом, ок? <img src='http://graywolf.org.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley colorbox-1325' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://graywolf.org.ua/2010/01/26/screensaver-with-cool-rss-photos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/01/ss_collage-150x150.jpg" />
		<media:content url="http://graywolf.org.ua/wp-content/uploads/2010/01/ss_collage.jpg" medium="image">
			<media:title type="html">Google Photos Screensaver</media:title>
			<media:thumbnail url="http://graywolf.org.ua/wp-content/uploads/2010/01/ss_collage-150x150.jpg" />
		</media:content>
		<media:content url="http://s3.amazonaws.com/scrnshots.com/screenshots/225780/gphotoscreensaver-settingspng" medium="image">
			<media:thumbnail url="http://s3.amazonaws.com/scrnshots.com/screenshots/225780/gphotoscreensaver-settingspng" />
		</media:content>
		<media:content url="http://s3.amazonaws.com/scrnshots.com/screenshots/225788/flickr-feedpng" medium="image">
			<media:thumbnail url="http://s3.amazonaws.com/scrnshots.com/screenshots/225788/flickr-feedpng" />
		</media:content>
	</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.841 seconds -->

