<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oduvan's Web Blog</title>
	<atom:link href="http://www.lyabah.com/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lyabah.com</link>
	<description></description>
	<lastBuildDate>Fri, 30 Jul 2010 16:48:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Профессия программист.</title>
		<link>http://www.lyabah.com/index.php/2010/07/17/professional-programmer/</link>
		<comments>http://www.lyabah.com/index.php/2010/07/17/professional-programmer/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 09:20:33 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[prograamming]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=765</guid>
		<description><![CDATA[Программист — это интересная профессия, и не только потому, что ты постоянно находишься в состоянии решения какой-либо проблемы или задачи, а еще и потому, что по специфике своей работы, ты часто сталкиваешься с другими профессиями, которые также необходимо освоить. 
Вот к примеру, к вам приходит заказчик с просьбой создать для него систему бух учета. Очевидно, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lyabah.com/wp-content/uploads/2010/07/hamlet2.jpg"><img src="http://www.lyabah.com/wp-content/uploads/2010/07/hamlet2-300x207.jpg" alt="" title="hamlet2" width="300" height="207" class="alignleft size-medium wp-image-766" /></a>Программист — это интересная профессия, и не только потому, что ты постоянно находишься в состоянии решения какой-либо проблемы или задачи, а еще и потому, что по специфике своей работы, ты часто сталкиваешься с другими профессиями, которые также необходимо освоить. </p>
<p>Вот к примеру, к вам приходит заказчик с просьбой создать для него систему бух учета. Очевидно, что он не знает ничего о том, как составлять ТЗ и ты берешься за это дело, и для его успешной реализации тебе необходимо вникнуть в профессию бухгалтера, на столько, на сколько это возможно и настолько, на сколько это необходимо для создания полезного продукта в этой области. </p>
<p>Как актер, которому для того, чтоб вжиться и сыграть свою роль хорошо — необходимо просто на время стать своим героем. И говорят, что актер за свою жизнь проживает тысячи других</p>
<p>И именно в осваивании новых горизонтов и новых ремесел -состоит определенная доля кайфа нашей профессии. </p>
<p>PS: в блоге небольшие доработки — интеграция с дискусом и фейсбуком + букмарки. Не переключайте&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/07/17/professional-programmer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>They have jobs!!!</title>
		<link>http://www.lyabah.com/index.php/2010/07/04/they-have-jobs/</link>
		<comments>http://www.lyabah.com/index.php/2010/07/04/they-have-jobs/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 17:04:46 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=758</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=ru_RU&amp;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=ru_RU&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/07/04/they-have-jobs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Можно быстрее и красивее?</title>
		<link>http://www.lyabah.com/index.php/2010/07/03/%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b5%d0%b5-%d0%b8-%d0%ba%d1%80%d0%b0%d1%81%d0%b8%d0%b2%d0%b5%d0%b5/</link>
		<comments>http://www.lyabah.com/index.php/2010/07/03/%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b5%d0%b5-%d0%b8-%d0%ba%d1%80%d0%b0%d1%81%d0%b8%d0%b2%d0%b5%d0%b5/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 13:22:57 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=756</guid>
		<description><![CDATA[Как поменять местами ключи и значения в дикте?



d = &#123;1:2,3:4,5:6&#125;


dict&#40;zip&#40;d.values&#40;&#41;,d.keys&#40;&#41;&#41;&#41;



]]></description>
			<content:encoded><![CDATA[<p>Как поменять местами ключи и значения в дикте?</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1">d = <span class="br0">&#123;</span><span class="nu0">1</span>:<span class="nu0">2</span>,<span class="nu0">3</span>:<span class="nu0">4</span>,<span class="nu0">5</span>:<span class="nu0">6</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">dict</span><span class="br0">&#40;</span><span class="kw2">zip</span><span class="br0">&#40;</span>d.<span class="me1">values</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,d.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/07/03/%d0%bc%d0%be%d0%b6%d0%bd%d0%be-%d0%b1%d1%8b%d1%81%d1%82%d1%80%d0%b5%d0%b5-%d0%b8-%d0%ba%d1%80%d0%b0%d1%81%d0%b8%d0%b2%d0%b5%d0%b5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Задачка на подумать</title>
		<link>http://www.lyabah.com/index.php/2010/07/02/%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%ba%d0%b0-%d0%bd%d0%b0-%d0%bf%d0%be%d0%b4%d1%83%d0%bc%d0%b0%d1%82%d1%8c/</link>
		<comments>http://www.lyabah.com/index.php/2010/07/02/%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%ba%d0%b0-%d0%bd%d0%b0-%d0%bf%d0%be%d0%b4%d1%83%d0%bc%d0%b0%d1%82%d1%8c/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 19:50:39 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=753</guid>
		<description><![CDATA[Прикольная фраза написана  на гугл апсах в предложении купить профи пакет:

Постоянная круглосуточная поддержка по телефону
и гарантия работоспособности
в течение 99,9% времени

т.е. 0.1 % времени они за меня не отвечают. А если учитывать, что время &#8211; бесконечно, то они по сути ни за что не отвечают.
Т.е. если у меня сервер отрубился на час, то значит они [...]]]></description>
			<content:encoded><![CDATA[<p>Прикольная фраза написана  на гугл апсах в предложении купить профи пакет:</p>
<pre>
Постоянная круглосуточная поддержка по телефону
и гарантия работоспособности
в течение 99,9% времени
</pre>
<p>т.е. 0.1 % времени они за меня не отвечают. А если учитывать, что время &#8211; бесконечно, то они по сути ни за что не отвечают.</p>
<p>Т.е. если у меня сервер отрубился на час, то значит они гарантируют, что дальше он 1000 часов будет работать без сбоев, а если еще на час, то еще 1000 будем гарантировать&#8230; а если день в отключке&#8230; ох&#8230; ну ладно&#8230; будем гарантировать еще 1000 дней без сбоев&#8230; ладно&#8230; вам как нашему постоянному клиенту еще 100 дней &#8220;гарантии&#8221; в подарок</p>
<p>Это такой &#8220;маркетинговый ход&#8221; или я чего-то не понимаю?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/07/02/%d0%b7%d0%b0%d0%b4%d0%b0%d1%87%d0%ba%d0%b0-%d0%bd%d0%b0-%d0%bf%d0%be%d0%b4%d1%83%d0%bc%d0%b0%d1%82%d1%8c/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Допоплнительные точки расширения Вашего апа</title>
		<link>http://www.lyabah.com/index.php/2010/07/01/django-ex-app/</link>
		<comments>http://www.lyabah.com/index.php/2010/07/01/django-ex-app/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 16:40:19 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=747</guid>
		<description><![CDATA[при создании нового джанго проекта я всегда выделяю две папки apps &#8211; для моих апов и compat &#8211; для сторонних апов, к разработки которых я не имею никакого отношения. Идея в том, что эти апы всегда остаются неприкосновенными для меня, и единственной точкой расширения остаются сеттингсы и возможно доп параметры, при инклюде урлов.
А представьте, что [...]]]></description>
			<content:encoded><![CDATA[<p>при создании нового джанго проекта я всегда выделяю две папки apps &#8211; для моих апов и compat &#8211; для сторонних апов, к разработки которых я не имею никакого отношения. Идея в том, что эти апы всегда остаются неприкосновенными для меня, и единственной точкой расширения остаются сеттингсы и возможно доп параметры, при инклюде урлов.</p>
<p>А представьте, что вы создаете апу с именем catalog, ее вы потом хотите выложить в общее пользования, и необходимо для нее сделать больше точек расширения. Структура такого апа может быть</p>
<ul>
<li>catalog</li>
<ul>
<li>urls.py</li>
<li>views.py</li>
<li>models.py</li>
<li>settings.py</li>
<li>tests.py</li>
</ul>
</ul>
<p>для 4 первых файлов можно просто вконце файла добавить строку, которая станет универсальной точкой расширения. Например для views.py</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">try</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">from</span> ex_catalog.<span class="me1">views</span> <span class="kw1">import</span> <span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">except</span> <span class="kw2">ImportError</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">pass</span></div>
</li>
</ol>
</div>
<p>таким образом, если кто-то будет использовать Вашу апу — точкой расширения будет дополнительная апа ex_catalog, в котором вы можете переопределить некоторый функции из view.py, и при этом ex_catalog  не надо добавлять в список апов в настройках.</p>
<p>А теперь главный вопрос этого поста. Почему так не делают?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/07/01/django-ex-app/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Fabric &#8211; деплойтинг должен быть легким и быстрым</title>
		<link>http://www.lyabah.com/index.php/2010/06/22/fabric-python-deploy/</link>
		<comments>http://www.lyabah.com/index.php/2010/06/22/fabric-python-deploy/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 21:22:18 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Linux & Unix]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[deploy]]></category>
		<category><![CDATA[fabric]]></category>
		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=738</guid>
		<description><![CDATA[
Чем меньше рутины мы привносим в свою работу, тем больше она может приносить удовольствия. 
Сегодня я расскажу про автоматизированный деплойтинг в python. Это значит одной командой я могу залить на все продакшен сервера файлы, обновить на нем необходимые компоненты и перегрузить веб сервер, и наблюдать за этим откинувшись на кресле и попивать кофеек.
Я Вам расскажу [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lyabah.com/wp-content/uploads/2010/06/deploy.jpeg"><img src="http://www.lyabah.com/wp-content/uploads/2010/06/deploy-300x202.jpg" alt="" title="deploy" width="300" height="202" class="alignleft size-medium wp-image-739" /></a><br />
<em>Чем меньше рутины мы привносим в свою работу, тем больше она может приносить удовольствия. </em></p>
<p>Сегодня я расскажу про автоматизированный деплойтинг в python. Это значит одной командой я могу залить на все продакшен сервера файлы, обновить на нем необходимые компоненты и перегрузить веб сервер, и наблюдать за этим откинувшись на кресле и попивать кофеек.</p>
<p>Я Вам расскажу про <a href="http://docs.fabfile.org/">Fabric</a>(На момент написания статьи 0.9.1 — бала последняя стабильная версия), наиболее подходящий для этого инструмент, который делает все описанное и даже больше через ssh. </p>
<p>Про установку рассказывать особо нечего, <a href="http://pypi.python.org/pypi/pip">pip</a> отлично справляется с этим.</p>
<p>В корень своего проекта я кладу fabfile.py, в этом файле и будут храниться все процедуры для работы с Fabric. Ниже приведу небольшой пример скрипта, который будет архивировать наш проект, заливать его на сервер и там разархивировать.</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">from</span> fabric.<span class="me1">api</span> <span class="kw1">import</span> <span class="sy0">*</span> </div>
</li>
<li class="li1">
<div class="de1">env.<span class="me1">hosts</span> = <span class="br0">&#91;</span><span class="st0">&#39;oduvan@lyabah.com&#39;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> deploy<span class="br0">&#40;</span><span class="br0">&#41;</span>: </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; local<span class="br0">&#40;</span><span class="st0">&#39;tar czf /tmp/my_project.tgz .&#39;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; put<span class="br0">&#40;</span><span class="st0">&#39;/tmp/my_project.tgz&#39;</span>, <span class="st0">&#39;/tmp/&#39;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; with <span class="kw3">cd</span><span class="br0">&#40;</span><span class="st0">&#39;/home/oduvan/www/test_fab/&#39;</span><span class="br0">&#41;</span>: </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; run<span class="br0">&#40;</span><span class="st0">&#39;tar xzf /tmp/my_project.tgz&#39;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Если у Вас все получилось, а я очень надеюсь, что с этим хостом и именем пользователя ни у кого кроме меня получиться ничего не может (так что поменяйте свою строку конекта во второй строке), то вы можете увидеть что-то сильно напоминающее вот это:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">$ fab deploy </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>localhost<span class="br0">&#93;</span> run: <span class="kw2">tar</span> czf <span class="sy0">/</span>tmp<span class="sy0">/</span>my_project.tgz . </div>
</li>
<li class="li1">
<div class="de1">Password <span class="kw1">for</span> oduvan<span class="sy0">@</span>lyabah.com: </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>oduvan<span class="sy0">@</span>lyabah.com<span class="br0">&#93;</span> put: <span class="sy0">/</span>tmp<span class="sy0">/</span>my_project.tgz -<span class="sy0">&gt;</span> <span class="sy0">/</span>tmp<span class="sy0">/</span>my_project.tgz </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>oduvan<span class="sy0">@</span>lyabah.com<span class="br0">&#93;</span> run: <span class="kw2">tar</span> xzf <span class="sy0">/</span>tmp<span class="sy0">/</span>my_project.tgz </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>oduvan<span class="sy0">@</span>lyabah.com<span class="br0">&#93;</span> err: <span class="kw2">tar</span>: .<span class="sy0">/</span>fabfile.pyc: <span class="kw1">time</span> stamp <span class="nu0">2010</span><span class="nu0">-06</span><span class="nu0">-21</span> <span class="nu0">10</span>:<span class="nu0">03</span>:<span class="nu0">41</span> is <span class="nu0">4.461083597</span> s <span class="kw1">in</span> the future </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#91;</span>oduvan<span class="sy0">@</span>lyabah.com<span class="br0">&#93;</span> err: <span class="kw2">tar</span>: .: <span class="kw1">time</span> stamp <span class="nu0">2010</span><span class="nu0">-06</span><span class="nu0">-21</span> <span class="nu0">10</span>:<span class="nu0">03</span>:<span class="nu0">41</span> is <span class="nu0">4.460804762</span> s <span class="kw1">in</span> the future </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">Done. </div>
</li>
<li class="li1">
<div class="de1">Disconnecting from lyabah.com&#8230; <span class="kw1">done</span>.</div>
</li>
</ol>
</div>
<p>Само собой, пароль у вас спросят и его необходимо будет ввести, в конце статьи я выложу свой пароль к ссш, чтоб вы могли протестить работу.</p>
<p>Кому лень вводить пароли могу добавить после второй сроки<br />
env.password = &#8216;oh_its_my_real_password&#8217;</p>
<p>либо сгенерить себе файл с ссш ключом и путь к нему положить в<br />
env.key_filename — в отличие и пароля тут может быть передан массив ключей</p>
<p>Но и этот код можно сократить. У Fabric есть <a href="http://docs.fabfile.org/0.9.1/#contrib-api">contrib libs</a>, одна из них project. Тут подробно каждую я описывать не буду, просто покажу пример с одной из них, дабы просто показать, что они есть</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">from</span> fabric.<span class="me1">api</span> <span class="kw1">import</span> <span class="sy0">*</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> fabric.<span class="me1">contrib</span>.<span class="me1">project</span> <span class="kw1">import</span> rsync_project </div>
</li>
<li class="li1">
<div class="de1">env.<span class="me1">hosts</span> = <span class="br0">&#91;</span><span class="st0">&#39;oduvan@lyabah.com&#39;</span><span class="br0">&#93;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> deploy<span class="br0">&#40;</span><span class="br0">&#41;</span>: </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; local<span class="br0">&#40;</span><span class="st0">&#39;python manage.py test&#39;</span>, capture=<span class="kw2">False</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rsync_project<span class="br0">&#40;</span><span class="st0">&#39;/home/oduvan/www/test_fab/&#39;</span>,<span class="st0">&#39;.&#39;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>как видите наш код сократился до одной команды, не считая команду для тестирования Django проекта, ведь если какая-то команда возвратит ошибочный статус, то выполнения прекратится, а значит если тесты не проходят загрузка не начинается. Дополнительный параметр capture говорит о том, что  необходимо скрывать выходные данные команды, мы эту опцию отключаем.</p>
<p>Вот основные команды, которые Вам необходимо знать, чтоб свободно пользоваться <strong>Fabric</strong></p>
<p><strong>put</strong> — копировать файл с локальной машины на удаленную. Доп параметр mode — устанавливает права на файл, см chmod<br />
<strong>get</strong> — копировать файл с удаленной на локальную<br />
<strong>local</strong> — выполнить команду на локальной машине. Доп параметр capture — скрывать выходные данные, по умолчанию False<br />
<strong>run</strong> — выполнить команду на удаленной машине<br />
<strong>sudo</strong> — выполнить команду на удаленной машине через судо. Доп параметр user — указываем имя пользователя, под которым необходимо запустить команду</p>
<p>Обратите внимание, что у нас есть команда sudo, а значит при необходимости, мы можем и сервак зарелоадить и вообще сделать любые админ вещи, главное, чтоб пользователь был в судоерсах.</p>
<p>Для деплойтинга на несколько серверов, причем различной конфигурации, и роли  &#8211; у <strong>Fabric</strong> тоже кое-что припасено.</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">from</span> fabric.<span class="me1">api</span> <span class="kw1">import</span> <span class="sy0">*</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> fabric.<span class="me1">contrib</span>.<span class="me1">project</span> <span class="kw1">import</span> rsync_project </div>
</li>
<li class="li1">
<div class="de1">env.<span class="me1">roledefs</span> = &nbsp;<span class="br0">&#123;</span><span class="st0">&#39;web&#39;</span>:<span class="br0">&#91;</span><span class="st0">&#39;oduvan@lyabah.com&#39;</span>,<span class="st0">&#39;oduvan@dev.lyabah.com&#39;</span><span class="br0">&#93;</span>, </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;db&#39;</span>:<span class="br0">&#91;</span><span class="st0">&#39;oduvan@db1.lyabah.com&#39;</span>,<span class="st0">&#39;oduvan@db2.lyabah.com&#39;</span><span class="br0">&#93;</span>, </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#39;media&#39;</span>:<span class="br0">&#91;</span><span class="st0">&#39;oduvan@media@lyabah.com&#39;</span><span class="br0">&#93;</span>, </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">@roles<span class="br0">&#40;</span><span class="st0">&#39;web&#39;</span><span class="br0">&#41;</span> </div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> deploy<span class="br0">&#40;</span><span class="br0">&#41;</span>: </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; rsync_project<span class="br0">&#40;</span><span class="st0">&#39;/home/oduvan/www/test_fab/&#39;</span>,<span class="st0">&#39;.&#39;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>в этом примере заливка файлов будет идти сразу на 2 вебовых сервака. Как видите вы можете запланировать у себя роли отдельных серверов под БД, под медиа файл и т.д.</p>
<p>кроме как декоратаром роль можно указывать и при запуске процедуры</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">$ fab deploy -R web</div>
</li>
</ol>
</div>
<p>Иногда в момент  или во время запуска необходимо передать данные скрипту.</p>
<p>В момент запуска это делается через аргументы самой функции</p>
<p>к примеру если у вас </p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">def</span> deploy<span class="br0">&#40;</span>arg1,arg2<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">pass</span></div>
</li>
</ol>
</div>
<p>то эти 2 аргумента можно передать как</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1"><span class="re1">$fab</span> deploy:<span class="st0">&#39;HI&#39;</span>,<span class="st0">&#39;HO&#39;</span></div>
</li>
<li class="li1">
<div class="de1">$ fab deploy:<span class="st0">&#39;HI&#39;</span>,<span class="re2">arg2=</span><span class="st0">&#39;HO&#39;</span></div>
</li>
<li class="li1">
<div class="de1">$ fab deploy:<span class="re2">arg1=</span><span class="st0">&#39;HI&#39;</span>,<span class="re2">arg2=</span><span class="st0">&#39;HO&#39;</span></div>
</li>
</ol>
</div>
<p>Либо спросить что-то во время работы функции у пользователя функцией<br />
<strong>prompt</strong>(text, key=None, default=&#8221;, validate=None)</p>
<p>Задает вопрос пользователю с текстом text, если пользователь не вводит данные, то возвращает значение из default, предварительно отчищая его функцией validate, и возвращает как результат этой функции, если не передан key, иначе кладет значение в env[key]</p>
<p>А теперь примеры функций деплойтинга из реальной жизни, которые вы можете написать и у себя в проекте:</p>
<p><em>bounce_wsgi_procs</em> — зарелоадить wsgi через touch в него<br />
<em>deploy_media</em> — загружаем только медиа файлы<br />
<em>migrate</em> — запускаем скрипт миграции через South<br />
<em>update_repositories</em>  &#8211; обновляем репозитарии<br />
<em>update_dependencies</em> — устанавливаем зависимости<br />
<em>reload_nginx</em> — перегружаем nginx<br />
<em>deploy</em> — полная установка, последовательный запуск всех этих функций.</p>
<p>Подводя итоги могу сказать, что <strong>Fabric</strong> должна стать musthave tool в разработке.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/06/22/fabric-python-deploy/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Django. URLUp &#8211; играться с урлами стало легче</title>
		<link>http://www.lyabah.com/index.php/2010/06/04/django-djoutils-urlup/</link>
		<comments>http://www.lyabah.com/index.php/2010/06/04/django-djoutils-urlup/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 11:37:16 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Django]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=732</guid>
		<description><![CDATA[Сложные выборки. Например, какая-то страница результатов. Там где много-много фильтров, + еще какие-то сортировки появились + все это надо прогнать через пейджирование. Выглядит страшно, но тем не менее задача банальная. Меня в этой задаче больше всего расстраивает шаманство с урлами. Ведь по факту Вам все эти параметры выборки надо уместить в урл, и каждой функции, [...]]]></description>
			<content:encoded><![CDATA[<p>Сложные выборки. Например, какая-то страница результатов. Там где много-много фильтров, + еще какие-то сортировки появились + все это надо прогнать через пейджирование. Выглядит страшно, но тем не менее задача банальная. Меня в этой задаче больше всего расстраивает шаманство с урлами. Ведь по факту Вам все эти параметры выборки надо уместить в урл, и каждой функции, например, смены страницы или смены направления сортировки — надо переформировать ссылку.</p>
<p>Через несколько минут у меня появился тег, который как всегда выношу на Ваш суд. Перед просмотром исходников, покажу, как он работает:</p>
<div class="geshi no html">
<ol>
<li class="li1">
<div class="de1">&lt;html&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; {% load djoutils_tags_url %}
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;head&gt;&lt;/head&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;body&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;div &gt; Ordering:
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;a href=&quot;?{% urlupget request.GET order=&quot;name&quot;,up=1%}&quot;&gt;Name UP&lt;/a&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;a href=&quot;?{% urlupget request.GET order=&quot;name&quot;,up=0%}&quot;&gt;Name Down&lt;/a&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;a href=&quot;?{% urlupget order=&quot;lastname&quot;,up=1%}&quot;&gt;Last Name UP&lt;/a&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &lt;a href=&quot;?{% urlupget order=&quot;lastname&quot;,up=0%}&quot;&gt;Lase Name &nbsp;Down&lt;/a&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Paging:
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;&lt;a href=&quot;?{% urlupget page=1 %}&quot;&gt;1&lt;/a&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;&lt;a href=&quot;?{% urlupget page=2 %}&quot;&gt;2&lt;/a&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;&lt;a href=&quot;?{% urlupget page=3 %}&quot;&gt;3&lt;/a&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &lt;/body&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/html&gt;</div>
</li>
</ol>
</div>
<p>тут мне уже не нужно думать, о том, как сформировать урл, я просто знаю, что эта ссылка пейджирования должна просто изменить параметр пейдж и все, весь остальной урл доформировывается отталкиваясь от текущего.</p>
<p>Исходники чуда тега можно увидеть <a href="http://bitbucket.org/oduvan/django-djoutils/src/tip/djoutils/templatetags/djoutils_tags_url.py">тут</a>.</p>
<p>Пока в голове крутится одна проблема, не очень актуальная но тем не менее. По средствам этого тега пока нельзя сформировать урл, который удалит один параметр из текущего урла.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/06/04/django-djoutils-urlup/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Ищу Программеров в Днепропетровске.</title>
		<link>http://www.lyabah.com/index.php/2010/05/28/%d0%b8%d1%89%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b5%d1%80%d0%be%d0%b2-%d0%b2-%d0%b4%d0%bd%d0%b5%d0%bf%d1%80%d0%be%d0%bf%d0%b5%d1%82%d1%80%d0%be%d0%b2%d1%81%d0%ba%d0%b5/</link>
		<comments>http://www.lyabah.com/index.php/2010/05/28/%d0%b8%d1%89%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b5%d1%80%d0%be%d0%b2-%d0%b2-%d0%b4%d0%bd%d0%b5%d0%bf%d1%80%d0%be%d0%bf%d0%b5%d1%82%d1%80%d0%be%d0%b2%d1%81%d0%ba%d0%b5/#comments</comments>
		<pubDate>Fri, 28 May 2010 15:36:37 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=726</guid>
		<description><![CDATA[ Вакансия опубликована на work.com.ua
Если кратко, то нужны Django, python программеры на полный рабочий день. Проектов много, все разные и интересные. 
Можно или звонить +380503625288 или писать alexander@lyabah.com или звонить и писать. 
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lyabah.com/wp-content/uploads/2010/05/20090723_it.jpg"><img src="http://www.lyabah.com/wp-content/uploads/2010/05/20090723_it-212x300.jpg" alt="" title="20090723_it" width="212" height="300" class="alignleft size-medium wp-image-728" /></a> Вакансия опубликована на <a href="http://www.work.ua/jobs/568770/">work.com.ua</a></p>
<p>Если кратко, то нужны Django, python программеры на полный рабочий день. Проектов много, все разные и интересные. </p>
<p>Можно или звонить +380503625288 или писать alexander@lyabah.com или звонить и писать. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/05/28/%d0%b8%d1%89%d1%83-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b5%d1%80%d0%be%d0%b2-%d0%b2-%d0%b4%d0%bd%d0%b5%d0%bf%d1%80%d0%be%d0%bf%d0%b5%d1%82%d1%80%d0%be%d0%b2%d1%81%d0%ba%d0%b5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Помогите сделать этот блог лучше</title>
		<link>http://www.lyabah.com/index.php/2010/05/11/%d0%bf%d0%be%d0%bc%d0%be%d0%b3%d0%b8%d1%82%d0%b5-%d1%81%d0%b4%d0%b5%d0%bb%d0%b0%d1%82%d1%8c-%d1%8d%d1%82%d0%be%d1%82-%d0%b1%d0%bb%d0%be%d0%b3-%d0%bb%d1%83%d1%87%d1%88%d0%b5/</link>
		<comments>http://www.lyabah.com/index.php/2010/05/11/%d0%bf%d0%be%d0%bc%d0%be%d0%b3%d0%b8%d1%82%d0%b5-%d1%81%d0%b4%d0%b5%d0%bb%d0%b0%d1%82%d1%8c-%d1%8d%d1%82%d0%be%d1%82-%d0%b1%d0%bb%d0%be%d0%b3-%d0%bb%d1%83%d1%87%d1%88%d0%b5/#comments</comments>
		<pubDate>Tue, 11 May 2010 19:05:20 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=724</guid>
		<description><![CDATA[Давно хочу сменить свою систему комментов на что-то по лучше.
Посоветуйте хороший плагин для вордпреса с адекватнгыми комментами. 
Спасибо.
]]></description>
			<content:encoded><![CDATA[<p>Давно хочу сменить свою систему комментов на что-то по лучше.</p>
<p>Посоветуйте хороший плагин для вордпреса с адекватнгыми комментами. </p>
<p>Спасибо.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/05/11/%d0%bf%d0%be%d0%bc%d0%be%d0%b3%d0%b8%d1%82%d0%b5-%d1%81%d0%b4%d0%b5%d0%bb%d0%b0%d1%82%d1%8c-%d1%8d%d1%82%d0%be%d1%82-%d0%b1%d0%bb%d0%be%d0%b3-%d0%bb%d1%83%d1%87%d1%88%d0%b5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DevConf::Python</title>
		<link>http://www.lyabah.com/index.php/2010/05/09/devconfpython/</link>
		<comments>http://www.lyabah.com/index.php/2010/05/09/devconfpython/#comments</comments>
		<pubDate>Sun, 09 May 2010 07:19:15 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[conf]]></category>
		<category><![CDATA[devconf]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=714</guid>
		<description><![CDATA[Думаю съездить на DevConf, который пройдет в Москве 17ого числа.
Программа, как мне кажется, будет интересная. Не обойдут стороной нашу любимую Джангу. Да и дополнятся она еще будет. Не может не радовать обилие кофебрейков и перерывов, это на всех питонячих конфах такое?
Интервью Ивана Салагаева о конфе о питоне и не только.
А вы что думаете? Стоит слетать [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lyabah.com/wp-content/uploads/2010/05/devconf-logo.png"><img src="http://www.lyabah.com/wp-content/uploads/2010/05/devconf-logo-300x52.png" alt="" title="devconf-logo" width="300" height="52" class="alignleft size-medium wp-image-718" /></a>Думаю съездить на <a href="http://devconf.ru/">DevConf</a>, который пройдет в Москве 17ого числа.</p>
<p><a href="http://devconf.ru/python/page/programm">Программа</a>, как мне кажется, будет интересная. Не обойдут стороной нашу любимую Джангу. Да и дополнятся она еще будет. Не может не радовать обилие кофебрейков и перерывов, это на всех питонячих конфах такое?</p>
<p><a href="http://devconf.ru/news/detail/50">Интервью Ивана Салагаева</a> о конфе о питоне и не только.</p>
<p>А вы что думаете? Стоит слетать в Россию?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2010/05/09/devconfpython/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->