<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Мастерская интернет-разработчика</title>
	
	<link>http://adw0rd.ru</link>
	<description>Блог Михаила Андреева (aka adw0rd)</description>
	<lastBuildDate>Fri, 11 May 2012 12:49:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/adw0rd" /><feedburner:info uri="adw0rd" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Debian. Установка и настройка Jira + GreenHopper</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/cUIr4Xyd9mg/</link>
		<comments>http://adw0rd.ru/2012/debian-jira-and-greenhopper/#comments</comments>
		<pubDate>Thu, 10 May 2012 16:12:41 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[DotDeb]]></category>
		<category><![CDATA[Jira]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=7722</guid>
		<description><![CDATA[Сегодня расскажу как установить standalone-версию Jira (то есть ту, которая на сайте Jira значится как &#171;Download&#187; версия) на ваш сервер. Выбран Debian из-за того что на FreeBSD сложнее завести самую свежую Java, которая так нужна Jira. Другие дистрибутивы я не рассматривал, просто потому что мне с Debian проще. Также в качестве СУБД для Jira будет [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2012/debian-jira-and-greenhopper/"><img src="http://adw0rd.ru/wp-content/uploads/2012/05/jira.png"  alt="" title="jira" width="152" height="116" class="alignright size-full wp-image-7730" /></a></noindex></p>
<p>Сегодня расскажу как установить <strong>standalone</strong>-версию <strong>Jira</strong> (то есть ту, которая на сайте Jira значится как &laquo;Download&raquo; версия) на ваш сервер. Выбран <strong>Debian</strong> из-за того что на FreeBSD сложнее завести самую свежую <strong>Java</strong>, которая так нужна Jira. Другие дистрибутивы я не рассматривал, просто потому что мне с Debian проще.</p>
<p>Также в качестве СУБД для Jira будет использоваться MySQL. Это обусловлено тем, что потом можно хакать данные жиры, например переименовывать пользователей и т.д. через процедуры, о которых возможно расскажу в другой статье.</p>
<p>В статье рассматривается <strong>Jira 5.0.4</strong>.<br />
<span id="more-7722"></span></p>
<h3>Установка</h3>
<p>Установка будет происходить на минимальной сборке свежеустановленного Debian, поэтому буду устанавливать нужный софт типа <strong>nano</strong> и <strong>sudo</strong>. А также создадим в домашней директории каталог &laquo;Downloads&raquo;, туда будем класть всякие загрузки:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">nano</span><br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> ~<span style="color: #000000; font-weight: bold;">/</span>Downloads</div></div>
<p>Теперь добавим репозиторий <noindex><a rel="nofollow" href="http://www.dotdeb.org/instructions/" >DotDeb</a></noindex>, так как там есть более свежие пакеты:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">nano</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>apt<span style="color: #000000; font-weight: bold;">/</span>sources.list<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> deb http:<span style="color: #000000; font-weight: bold;">//</span>packages.dotdeb.org squeeze all<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> deb-src http:<span style="color: #000000; font-weight: bold;">//</span>packages.dotdeb.org squeeze all</div></div>
<p>Теперь скачаем ключ для DotDeb и применим его:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>Downloads<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.dotdeb.org<span style="color: #000000; font-weight: bold;">/</span>dotdeb.gpg<br />
<span style="color: #c20cb9; font-weight: bold;">cat</span> dotdeb.gpg <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-key add</span> -</div></div>
<p>Установим MySQL-сервер версии 5.5 и Nginx:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> mysql-server-<span style="color: #000000;">5.5</span> nginx</div></div>
<p>Выбирите нужную версию Jira на <noindex><a rel="nofollow" href="http://www.atlassian.com/software/jira/download" >этой странице</a></noindex> и скачайте бинарный файл в каталог &laquo;~/Downloads&raquo;.<br />
Так как у меня 32-битная платформа на Linux, я качаю нужный мне бинарник так:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>Downloads<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>wpc.29c4.edgecastcdn.net<span style="color: #000000; font-weight: bold;">/</span>8029C4<span style="color: #000000; font-weight: bold;">/</span>downloads<span style="color: #000000; font-weight: bold;">/</span>software<span style="color: #000000; font-weight: bold;">/</span>jira<span style="color: #000000; font-weight: bold;">/</span>downloads<span style="color: #000000; font-weight: bold;">/</span>atlassian-jira-5.0.4-x32.bin<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> +x atlassian-jira-5.0.4-x32.bin</div></div>
<p>Создадим каталоги для Jira:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>atlassian<span style="color: #000000; font-weight: bold;">/</span>jira<br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>atlassian<span style="color: #000000; font-weight: bold;">/</span>application-data<span style="color: #000000; font-weight: bold;">/</span>jira</div></div>
<p>Теперь запустим бинарник и приступим к установки самой Jira:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">.<span style="color: #000000; font-weight: bold;">/</span>atlassian-jira-5.0.4-x32.bin<br />
<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Unpacking JRE ...<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Starting Installer ...<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> You <span style="color: #000000; font-weight: bold;">do</span> not have administrator rights to this machine and <span style="color: #c20cb9; font-weight: bold;">as</span> such, some installation options will not be available. Are you sure you want to <span style="color: #7a0874; font-weight: bold;">continue</span>?<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Yes <span style="color: #7a0874; font-weight: bold;">&#91;</span>y, Enter<span style="color: #7a0874; font-weight: bold;">&#93;</span>, No <span style="color: #7a0874; font-weight: bold;">&#91;</span>n<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
y<br />
<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> This will <span style="color: #c20cb9; font-weight: bold;">install</span> JIRA 5.0.4 on your computer.<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> OK <span style="color: #7a0874; font-weight: bold;">&#91;</span>o, Enter<span style="color: #7a0874; font-weight: bold;">&#93;</span>, Cancel <span style="color: #7a0874; font-weight: bold;">&#91;</span>c<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
o<br />
<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Choose the appropriate installation or upgrade option.<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Please choose one of the following:<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Express Install <span style="color: #7a0874; font-weight: bold;">&#40;</span>use default settings<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>, Custom Install <span style="color: #7a0874; font-weight: bold;">&#40;</span>recommended <span style="color: #000000; font-weight: bold;">for</span> advanced <span style="color: #c20cb9; font-weight: bold;">users</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>, Upgrade an existing JIRA installation <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">3</span>, Enter<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #000000;">2</span><br />
<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Where should JIRA 5.0.4 be installed?<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>adw0rd<span style="color: #000000; font-weight: bold;">/</span>atlassian<span style="color: #000000; font-weight: bold;">/</span>jira<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>atlassian<span style="color: #000000; font-weight: bold;">/</span>jira<br />
<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Default location <span style="color: #000000; font-weight: bold;">for</span> JIRA data<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>adw0rd<span style="color: #000000; font-weight: bold;">/</span>atlassian<span style="color: #000000; font-weight: bold;">/</span>application-data<span style="color: #000000; font-weight: bold;">/</span>jira<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>atlassian<span style="color: #000000; font-weight: bold;">/</span>application-data<span style="color: #000000; font-weight: bold;">/</span>jira<br />
<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Configure <span style="color: #c20cb9; font-weight: bold;">which</span> ports JIRA will use.<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> JIRA requires two TCP ports that are not being used by any other<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> applications on this machine. The HTTP port is where you will access JIRA<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> through your browser. The Control port is used to Startup and Shutdown JIRA.<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Use default ports <span style="color: #7a0874; font-weight: bold;">&#40;</span>HTTP: <span style="color: #000000;">8080</span>, Control: <span style="color: #000000;">8005</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> - Recommended <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">1</span>, Enter<span style="color: #7a0874; font-weight: bold;">&#93;</span>, Set custom value <span style="color: #000000; font-weight: bold;">for</span> HTTP and Control ports <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #000000;">1</span><br />
<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Extracting files ...<br />
...<br />
<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Please <span style="color: #7a0874; font-weight: bold;">wait</span> a few moments <span style="color: #000000; font-weight: bold;">while</span> JIRA starts up.<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Launching JIRA ...<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Installation of JIRA 5.0.4 is <span style="color: #7a0874; font-weight: bold;">complete</span><br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Your installation of JIRA 5.0.4 is now ready and can be accessed via your browser.<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> JIRA 5.0.4 can be accessed at http:<span style="color: #000000; font-weight: bold;">//</span>localhost:<span style="color: #000000;">8080</span><br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;&gt;</span> Finishing installation ...</div></div>
<p>После установки, нам необходим init-скрипт, я создавал небольшой срипт, можете им воспользоваться:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>jira http:<span style="color: #000000; font-weight: bold;">//</span>adw0rd.ru<span style="color: #000000; font-weight: bold;">/</span>files<span style="color: #000000; font-weight: bold;">/</span>jira<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>jira</div></div>
<h3>Настройка</h3>
<p>Теперь создадим БД и настроим права доступа для Jira:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql <span style="color: #660033;">-uroot</span> <span style="color: #660033;">-p</span></div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #ff0000;">`jira`</span> CHARSET utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_general_ci;<br />
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> PASSWORD<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'example'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> password<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'example'</span><span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">*</span>57237BB49761F29AB9724BA084E811D70C12393D <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span><br />
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">GRANT</span> USAGE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">*.*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'jira'</span>@<span style="color: #ff0000;">'localhost'</span> <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> PASSWORD <span style="color: #ff0000;">'*57237BB49761F29AB9724BA084E811D70C12393D'</span>;<br />
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">ALL</span> PRIVILEGES <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">`jira`</span><span style="color: #66cc66;">.*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'jira'</span>@<span style="color: #ff0000;">'localhost'</span>;<br />
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SHOW</span> GRANTS <span style="color: #993333; font-weight: bold;">FOR</span> jira@localhost;<br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------------------------------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> Grants <span style="color: #993333; font-weight: bold;">FOR</span> jira@localhost &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------------------------------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">GRANT</span> USAGE <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">*.*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'jira'</span>@<span style="color: #ff0000;">'localhost'</span> <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> PASSWORD <span style="color: #ff0000;">'*57237BB49761F29AB9724BA084E811D70C12393D'</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">ALL</span> PRIVILEGES <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">`jira`</span><span style="color: #66cc66;">.*</span> <span style="color: #993333; font-weight: bold;">TO</span> <span style="color: #ff0000;">'jira'</span>@<span style="color: #ff0000;">'localhost'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">-------------------------------------------------------------------------------------------------------------+</span><br />
<span style="color: #cc66cc;">2</span> <span style="color: #993333; font-weight: bold;">ROWS</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p>Отредактируйте &laquo;nginx.conf&raquo;:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">nano</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>nginx.conf</div></div>
<p>К виду:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">http {<br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; upstream jira {<br />
&nbsp; &nbsp; &nbsp; &nbsp; server 127.0.0.1:8080;<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; server {<br />
&nbsp; &nbsp; &nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; &nbsp; &nbsp; server_name example.org;<br />
&nbsp; &nbsp; &nbsp; &nbsp; location / {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://jira;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
&nbsp; &nbsp; ...<br />
}</div></div>
<p>Далее, отредактируем конфиг Jira:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">nano</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>atlassian<span style="color: #000000; font-weight: bold;">/</span>jira<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>server.xml</div></div>
<p>Найдите там &laquo;Service/Connector&raquo; и добавьте туда &laquo;proxyName&raquo; и &laquo;proxyPort&raquo;:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">...<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>Service <span style="color: #007800;">name</span>=<span style="color: #ff0000;">&quot;Catalina&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ...<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">&lt;</span>Connector <span style="color: #007800;">port</span>=<span style="color: #ff0000;">&quot;8080&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">maxThreads</span>=<span style="color: #ff0000;">&quot;150&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">minSpareThreads</span>=<span style="color: #ff0000;">&quot;25&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">maxSpareThreads</span>=<span style="color: #ff0000;">&quot;75&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">connectionTimeout</span>=<span style="color: #ff0000;">&quot;20000&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">proxyName</span>=<span style="color: #ff0000;">&quot;example.org&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">proxyPort</span>=<span style="color: #ff0000;">&quot;80&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">enableLookups</span>=<span style="color: #ff0000;">&quot;false&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">maxHttpHeaderSize</span>=<span style="color: #ff0000;">&quot;8192&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">protocol</span>=<span style="color: #ff0000;">&quot;HTTP/1.1&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">useBodyEncodingForURI</span>=<span style="color: #ff0000;">&quot;true&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">redirectPort</span>=<span style="color: #ff0000;">&quot;8443&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">acceptCount</span>=<span style="color: #ff0000;">&quot;100&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #007800;">disableUploadTimeout</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; ...<br />
&nbsp; &nbsp; ...<br />
...</div></div>
<p>Перезагружаем Jira для того чтобы применить новый конфиг:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>jira restart</div></div>
<p>Теперь пробуем открыть &laquo;http://example.org/&raquo;. Вам предложат настроить Jira, укажите тип хранилища &laquo;MySQL&raquo; и верные реквизиты доступа, после чего вам предложат настроить учетную запись администратора и т.д.</p>
<h3>Установка GreenHopper</h3>
<p>Для этого надо просто войти в UPM (&laquo;http://example.org/plugins/servlet/upm#install&raquo;) и вбить в поисковую строку &laquo;GreenHopper&raquo;, таким же образом можете установить любые другие плагины доступные в репозитории Jira.</p>
<h3>Ещё пару слов</h3>
<p>При покупке, лицензионный ключ для Jira надо ввести на странице &laquo;http://example.org/secure/admin/ViewLicense!default.jspa&raquo;, а для GreenHopper в UPM.</p>
<p>Если вы неверно указали &laquo;Base URL&raquo; (в нашем примере он &laquo;http://example.org&raquo;), то на странице настроек &laquo;http://example.org/secure/admin/ViewApplicationProperties.jspa&raquo; можете поменять его.</p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/cUIr4Xyd9mg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/debian-jira-and-greenhopper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/debian-jira-and-greenhopper/</feedburner:origLink></item>
		<item>
		<title>Debian. Установка и настройка Gitweb + Nginx</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/sAQ2j-M0tN8/</link>
		<comments>http://adw0rd.ru/2012/debian-gitweb/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 04:48:23 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Gitweb]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=7375</guid>
		<description><![CDATA[Продолжаем обсуждение инструментария для git-репозиториев, сегодня расскажу про GitWeb, он представляет из себя простую веб-морду для визуализации репозиториев Git&#39;а, в ней можно будет лицезреть свои проекты, историю и т.д., вообщем всё что необходимо. Пользователем Mercurial внешний вид уже знаком, так как его предоставлял hgweb: [web] # стиль gitweb style = gitweb Установка Собирать буду частично [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2012/debian-gitweb/" ><img src="http://adw0rd.ru/wp-content/uploads/2012/04/gitweb_.png" alt="" title="gitweb" width="175" height="67" class="alignright size-full wp-image-7672" /></a></p>
<p>Продолжаем обсуждение инструментария для git-репозиториев, сегодня расскажу про <noindex><a rel="nofollow" href="https://github.com/gawel/GitWeb" >GitWeb</a></noindex>, он представляет из себя простую веб-морду для визуализации репозиториев Git&#39;а, в ней можно будет лицезреть свои проекты, историю и т.д., вообщем всё что необходимо.</p>
<blockquote class="info">
<p>
Пользователем Mercurial внешний вид уже знаком, так как его <a href="/2010/mercurial-freebsd/">предоставлял hgweb</a>:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[web]<br />
# стиль gitweb<br />
style = gitweb</div></div>
</blockquote>
<h3>Установка</h3>
<p>Собирать буду частично из исходников, так как нам понадобится вменяемый fcgiwrap (в Debian очень старая версия 1.0, которая нам просто не подойдет). Нам понадобится fcgiwrap 1.0.3 для запуска &laquo;gitweb/index.cgi&raquo;.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> libfcgi-dev gitweb<br />
<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>Downloads<br />
<span style="color: #c20cb9; font-weight: bold;">git clone</span> git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>gnosek<span style="color: #000000; font-weight: bold;">/</span>fcgiwrap.git<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> fcgiwrap<span style="color: #000000; font-weight: bold;">/</span><br />
autoreconf <span style="color: #660033;">-i</span><br />
.<span style="color: #000000; font-weight: bold;">/</span>configure <br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p><strong>fcgiwrap</strong> выбран потомучто он уже использовался у меня на сервере и я решил найти ему очередное применение. На странице <noindex><a rel="nofollow" href="https://github.com/gawel/GitWeb" >GitWeb на GitHub&#39;е</a></noindex> есть инструкция для <strong>gunicorn</strong>.</p>
<p><span id="more-7375"></span></p>
<h3>Настройка</h3>
<p>Я переписал оригинальный (читать старый из Debian) init-скрипт fcgiwrap&#39;a, который можете взять <a href="/files/fcgiwrap">тут</a>.<br />
Скопируйте его в &laquo;/etc/init.d&raquo;.</p>
<p>Без скрипта можете запустить так:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">fcgiwrap <span style="color: #660033;">-s</span> tcp:127.0.0.1:<span style="color: #000000;">8088</span> <span style="color: #660033;">-f</span></div></div>
<p>Со скриптом так:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">service fcgiwrap start</div></div>
<p>Теперь перейдем к Nginx. Отредактируйте &laquo;/etc/nginx/nginx.conf&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">upstream gitweb {<br />
&nbsp; &nbsp; server 127.0.0.1:8088;<br />
}</div></div>
<p>И ваш файл виртуального хоста:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server {<br />
&nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; server_name gitweb.example.org;<br />
&nbsp; &nbsp; root /usr/share/gitweb;<br />
<br />
&nbsp; &nbsp; location ~* \.(jpg|txt|jpeg|gif|png|ico|css|zip|js|swf)$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; expires 0;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location / {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass gitweb;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param QUERY_STRING $query_string;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param REQUEST_METHOD $request_method;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param REQUEST_URI $request_uri;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param SCRIPT_FILENAME $document_root/index.cgi;<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>Откройте файл &laquo;/etc/gitweb.conf&raquo; и укажите путь до репозиториев:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># path to git projects (&lt;project&gt;.git)<br />
$projectroot = &quot;/home/git/repositories&quot;;<br />
<br />
...</div></div>
<p>Перезагружаем Nginx и наслаждаемся!</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">nginx -s reload</div></div>
<h3>А какже git-instaweb?</h3>
<p>Простой обозреватель вашего репозитория на основе GitWeb, но когда репозиториев несколько. Минус у этого решения один&nbsp;&mdash; он не преднозначен для запуска на нескольких репозиториях. Точнее вам придется запускать копию для каждого репозитория на разных портах и проксировать на них.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">git instaweb</span> <span style="color: #660033;">--httpd</span>=webrick <span style="color: #7a0874; font-weight: bold;">&#91;</span>--start <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #660033;">--stop</span> <span style="color: #000000; font-weight: bold;">|</span> --restart<span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #666666; font-style: italic;"># --httpd поддерживает apache2, lighttpd, mongoose и webrick (по умолчанию lighttpd).</span><br />
<span style="color: #666666; font-style: italic;"># --local слушает только локальный интерфейс (127.0.0.1)</span><br />
<span style="color: #666666; font-style: italic;"># --port можно указать нужный порт (по умолчанию 1234)</span></div></div>
<p>Также вы можете указать в &laquo;.gitconfig&raquo; нужные настройки для instaweb:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[instaweb]<br />
httpd=webrick</div></div>
<p>Ещё можно почитать:<br />
<noindex><a rel="nofollow" href="http://progit.org/book/ch4-6.html" >Pro Git 4.6 Git on the Server GitWeb</a></noindex><br />
<noindex><a rel="nofollow" href="http://gofedora.com/how-to-install-configure-gitweb/" >How To: Install and Configure GitWeb</a></noindex></p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/sAQ2j-M0tN8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/debian-gitweb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/debian-gitweb/</feedburner:origLink></item>
		<item>
		<title>Android и LG P500. Удаление предустановленных программ</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/FB8-vIvhPPc/</link>
		<comments>http://adw0rd.ru/2012/android-lg-p500-remove-preinstalled-apps/#comments</comments>
		<pubDate>Sun, 29 Apr 2012 22:45:03 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[LG]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[xubuntu]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=7617</guid>
		<description><![CDATA[Сегодня расскажу как получить рутовый доступ на ваш LG Optimus One (он же LG P500) с Android 2.3.3 и удалить предустановленные приложения. Будем удалять всякие фейсбуки, вконтакты и одноклассники, а также бесполезные программы от LG. Статья предназначена для пользователей Linux, но в архиве с ADB имеется и Windows версии. Для начала качаем ADB и распаковываем: [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2012/android-lg-p500-remove-preinstalled-apps/"><img alt="" src="http://adw0rd.ru/files/images/android.gif"  title="Android" class="alignright" width="307" height="54" /></a></noindex></p>
<p>Сегодня расскажу как получить рутовый доступ на ваш <strong>LG Optimus One</strong> (он же <strong>LG P500</strong>) с <strong>Android 2.3.3</strong> и удалить предустановленные приложения. Будем удалять всякие фейсбуки, вконтакты и одноклассники, а также бесполезные программы от LG.</p>
<p>Статья предназначена для пользователей Linux, но в архиве с ADB имеется и Windows версии.</p>
<p>Для начала качаем <noindex><a rel="nofollow" href="http://developer.android.com/guide/developing/tools/adb.html" >ADB</a></noindex> и распаковываем:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> ADB.tgz http:<span style="color: #000000; font-weight: bold;">//</span>adw0rd.ru<span style="color: #000000; font-weight: bold;">/</span>wp-content<span style="color: #000000; font-weight: bold;">/</span>uploads<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2012</span><span style="color: #000000; font-weight: bold;">/</span>04<span style="color: #000000; font-weight: bold;">/</span>ADB.tar.gz<br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzf</span> ADB.tgz<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> ADB</div></div>
<p>Войдите в настройки телефона &laquo;Приложения&raquo; -> &laquo;Дополнительные опции&raquo; и включите режим &laquo;Отладка USB&raquo;, далее подключите ваш телефон по USB кабелю к компьютеру и выполните:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">chmod</span> +x adblinux<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>adblinux devices<br />
<span style="color: #000000; font-weight: bold;">&gt;</span> List of devices attached <br />
<span style="color: #000000; font-weight: bold;">&gt;</span> 80A357486041192199&nbsp; &nbsp; device</div></div>
<p>Отлично, мы успешно подключились, теперь получим рутовый доступ:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>adblinux shell<br />
$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>data<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>lge_adb.conf</div></div>
<p><span id="more-7617"></span><br />
Вручную перезагрузите телефон (выключите и снова включите) и снова стартуем shell:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>adblinux shell<br />
<span style="color: #666666; font-style: italic;"># exit</span></div></div>
<p>Ура, теперь у нас есть права пользователя root!</p>
<p>Теперь примонтируем &laquo;/system&raquo; с возможностью записи данных:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>adblinux shell<br />
<span style="color: #666666; font-style: italic;"># mount -o rw,remount /dev/block/mmcblk0p1 /system</span></div></div>
<p>После этого мы сможем удалить &laquo;нужный&raquo; нам софт:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /system/app</span><br />
<span style="color: #666666; font-style: italic;"># ls</span><br />
...<br />
<span style="color: #666666; font-style: italic;"># rm Facebook.apk</span><br />
<span style="color: #666666; font-style: italic;"># rm VKontakte.apk</span><br />
<span style="color: #666666; font-style: italic;"># rm Odnoklassniki.apk</span><br />
<span style="color: #666666; font-style: italic;"># rm MobileAgent.apk</span><br />
<span style="color: #666666; font-style: italic;"># rm YandexSearch.apk</span><br />
<span style="color: #666666; font-style: italic;"># rm LGWorld.apk</span><br />
<span style="color: #666666; font-style: italic;"># rm LGMusicClub.apk</span><br />
<span style="color: #666666; font-style: italic;"># rm LiveWallpapers.apk</span><br />
<span style="color: #666666; font-style: italic;"># rm LiveWallpapers.odex</span><br />
<span style="color: #666666; font-style: italic;"># rm LiveWallpapersPicker.apk</span><br />
<span style="color: #666666; font-style: italic;"># exit</span></div></div>
<p>Только не удаляйте &laquo;LGHome.apk&raquo;, как это сделал я по ошибке... Это приложение является рабочим столом и меню вашего телефона, без него смысла в телефоне особого нет, он сможет принимать звонки и сообщения, а также подключаться к сети, больше по сути ничего. В конце статьи я описываю как всетаки восстановил &laquo;LGHome.apk&raquo;.</p>
<h4>Оффтопик</h4>
<p>Сбросить телефон на изначальное состояние (&laquo;Factory reset&raquo;) можно так:</p>
<ol>
<li>Зажать одновременно &laquo;Home + VolumeDown + Power&raquo; и держать несколько секунд, пока не появится картинка на дисплее &laquo;Android с коробочкой&raquo;.</li>
<li>Также можно сбросить телефон на заводские настройки через сервисное меню, для этого наберите номер <strong>3845#*500#</strong> и в появившемся меню нажмите на &laquo;Factory Reset&raquo;.</li>
</ol>
<h4>Если вы всётаки удалили LGHome.apk</h4>
<p>Казалось всё не так плохо, надо просто скачать из сети это приложение и залить его через ADB, но в моем случае все было намного хуже... Я сделал &laquo;Factory Reset&raquo;, после чего у меня слетел root и сбросился режим &laquo;Отладка USB&raquo; и я не смог подключится через ADB. </p>
<p>В итоге мне надо было попасть в &laquo;Настройки&raquo; телефона и включить режим &laquo;Отладка USB&raquo;. Вот как я выкрутился:</p>
<ol>
<li>Сначала залил на свой сайт приложение *.apk (неважно какое);</li>
<li>Потом через телефон (благо GPRS/WIFI работали) скачал это приложение (для этого я послал себе ссылку по смс через бесплатный сервис от мтс);</li>
<li>После скачивания начал его устанавливать, тогда Android меня предупредил о &laquo;неизвестном источнике&raquo; и пустил в меню настроек &laquo;Приложения&raquo; чтобы я указал что &laquo;разрешаю установку приложений из неизвестных источников&raquo;;</li>
<li>Вместо этого я зашёл в &laquo;Дополнительные опции&raquo; и включил режим &laquo;Отладка USB&raquo;, после чего ADB смог определить мой девайс!</li>
</ol>
<p>Как только вы смогли включить режим &laquo;Отладка USB&raquo;, то сразу подключаем USB кабель и вводим в консоль:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>system_apps<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>system_apps<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> LGHome.apk.tgz http:<span style="color: #000000; font-weight: bold;">//</span>adw0rd.ru<span style="color: #000000; font-weight: bold;">/</span>wp-content<span style="color: #000000; font-weight: bold;">/</span>uploads<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2012</span><span style="color: #000000; font-weight: bold;">/</span>04<span style="color: #000000; font-weight: bold;">/</span>LGHome.apk.tar.gz<br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzf</span> LGHome.apk.tgz<br />
<span style="color: #c20cb9; font-weight: bold;">rm</span> LGHome.apk.tgz<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">644</span> LGHome.apk<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chown</span> root:root LGHome.apk<br />
<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>adblinux shell<br />
<span style="color: #666666; font-style: italic;"># mount -o rw,remount /dev/block/mmcblk0p1 /system</span><br />
<span style="color: #666666; font-style: italic;"># exit</span><br />
<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>adblinux push <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>system_apps <span style="color: #000000; font-weight: bold;">/</span>system<span style="color: #000000; font-weight: bold;">/</span>app<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>adblinux reboot</div></div>
<p>Ну вот и всё, удачи!</p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/FB8-vIvhPPc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/android-lg-p500-remove-preinstalled-apps/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/android-lg-p500-remove-preinstalled-apps/</feedburner:origLink></item>
		<item>
		<title>Python и Git. Автоматическая проверка кода требованиям спецификации</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/6Q6NfRX_mOQ/</link>
		<comments>http://adw0rd.ru/2012/python-pre-code-review/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 20:30:16 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Hooks]]></category>
		<category><![CDATA[PEP]]></category>
		<category><![CDATA[PEP8]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6345</guid>
		<description><![CDATA[Многие команды делают Code Review, другие больше сосредотачиваются над Design Review, а многие не делают и вовсе, но статья не о том зачем это нужно, а о том, как частично автоматизировать процесс Code Review. Для своих проектов я решил съэкономить немного времени и человеческих ресурсов, и использовать автоматизированную проверку кода проекта на соответствие PEP 8, [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2012/python-pre-code-review/"><img src="http://adw0rd.ru/wp-content/uploads/2012/03/pre-code-review.jpg"  alt="" title="pre-code-review" width="208" height="151" class="alignright size-full wp-image-7551" /></a></noindex></p>
<p>Многие команды делают <strong>Code Review</strong>, другие больше сосредотачиваются над <strong>Design Review</strong>, а многие не делают и вовсе, но статья не о том зачем это нужно, а о том, как частично автоматизировать процесс Code Review. Для своих проектов я решил съэкономить немного времени и человеческих ресурсов, и использовать автоматизированную проверку кода проекта на соответствие <noindex><a rel="nofollow" href="http://www.python.org/dev/peps/pep-0008/" >PEP 8</a></noindex>, а также <em>качества кода</em> (pyflakes) и <em>качество сообщений</em> в Git. Полноценный Code Review при этом делать всёравно нужно, но уже в меньших объемах, а иногда и вовсе можно им пренебречь.</p>
<p>Итак, для работы нам понадобится установить <noindex><a rel="nofollow" href="http://pypi.python.org/pypi/pep8" >pep8</a></noindex>, <noindex><a rel="nofollow" href="http://pypi.python.org/pypi/pyflakes" >pyflakes</a></noindex>, а также отредактировать на рабочих станциях разработчиков хуки для Git: &laquo;pre-commit&raquo; и &laquo;commit-msg&raquo;.</p>
<p>Серверные хуки специально не используются, так как уже будет произведен коммит и разработчику придется откатываться и т.д., что совсем не экономит время разработчика.<br />
<span id="more-6345"></span></p>
<h3>Установка</h3>
<p>Установим зависимости:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> pyflakes pep8</div></div>
<p>Установим хуки:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>work<br />
<span style="color: #c20cb9; font-weight: bold;">git clone</span> git:<span style="color: #000000; font-weight: bold;">//</span>gist.github.com<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2184955</span>.git pre-code-review<br />
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;/</span>work<span style="color: #000000; font-weight: bold;">/</span>pre-code-review<span style="color: #000000; font-weight: bold;">/</span>pre-commit.py <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;/</span>work<span style="color: #000000; font-weight: bold;">/&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>.git<span style="color: #000000; font-weight: bold;">/</span>hooks<span style="color: #000000; font-weight: bold;">/</span>pre-commit<br />
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;/</span>work<span style="color: #000000; font-weight: bold;">/</span>pre-code-review<span style="color: #000000; font-weight: bold;">/</span>commit-msg.py <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;/</span>work<span style="color: #000000; font-weight: bold;">/&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>.git<span style="color: #000000; font-weight: bold;">/</span>hooks<span style="color: #000000; font-weight: bold;">/</span>commit-msg<br />
<span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;/</span>work<span style="color: #000000; font-weight: bold;">/&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>.git<span style="color: #000000; font-weight: bold;">/</span>hooks<span style="color: #000000; font-weight: bold;">/</span>pre-commit<br />
<span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;/</span>work<span style="color: #000000; font-weight: bold;">/&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>.git<span style="color: #000000; font-weight: bold;">/</span>hooks<span style="color: #000000; font-weight: bold;">/</span>commit-msg</div></div>
<p>Код для хука &laquo;pre-commit.py&raquo; повзаимствован <noindex><a rel="nofollow" href="http://tech.myemma.com/python-pep8-git-hooks/" >отсюда</a></noindex> и впоследствии доработан. В будующем планировалось добавить туда проверку докстрингов (процентное соотношение документации к коду, либо какие-либо другие метрики) и запуск тестов (но это сомнительно, так как скажется на производительности выполнения коммитов).</p>
<p>Для таких тяжелых операций как тесты есть удобный инструмент&nbsp;&mdash; Continius Integraton (CI), такие как <noindex><a rel="nofollow" href="http://hudson-ci.org/" >Hudson</a></noindex>, <noindex><a rel="nofollow" href="http://jenkins-ci.org/" >Jenkins</a></noindex> (<noindex><a rel="nofollow" href="http://pypi.python.org/pypi/django-jenkins" >Django Jenkins</a></noindex>), <noindex><a rel="nofollow" href="http://cruisecontrol.sourceforge.net/" >CruiseControl</a></noindex> и <noindex><a rel="nofollow" href="http://www.atlassian.com/software/bamboo" >Atlassian Bamboo</a></noindex>. Также, рекомендую ознакомится с продуктом для Code Review&nbsp;&mdash; <noindex><a rel="nofollow" href="http://www.atlassian.com/software/crucible/" >Atlassian Crucible</a></noindex>.</p>
<h3>Примеры</h3>
<p>Пример проверки кода:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #c20cb9; font-weight: bold;">git commit</span> <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Something I&quot;</span><br />
<span style="color: #000000; font-weight: bold;">*********************************</span><br />
<span style="color: #000000; font-weight: bold;">*****</span> CODE REVIEW IS FAILED <span style="color: #000000; font-weight: bold;">*****</span><br />
<span style="color: #000000; font-weight: bold;">*********************************</span><br />
Check files: <span style="color: #000000; font-weight: bold;">&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/&lt;</span>app<span style="color: #000000; font-weight: bold;">&gt;/</span>views.py, <span style="color: #000000; font-weight: bold;">&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>common<span style="color: #000000; font-weight: bold;">/</span>context_processors.py, <span style="color: #000000; font-weight: bold;">&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>common<span style="color: #000000; font-weight: bold;">/</span>decorators.py,<br />
<span style="color: #000000; font-weight: bold;">&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>settings.py, <span style="color: #000000; font-weight: bold;">&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/&lt;</span>app<span style="color: #000000; font-weight: bold;">&gt;/</span>models.py, <span style="color: #000000; font-weight: bold;">&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>urls.py<br />
pep8:<br />
.<span style="color: #000000; font-weight: bold;">/&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>urls.py:<span style="color: #000000;">14</span>:<span style="color: #000000;">19</span>: E241 multiple spaces after <span style="color: #ff0000;">','</span><br />
.<span style="color: #000000; font-weight: bold;">/&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/&lt;</span>app<span style="color: #000000; font-weight: bold;">&gt;/</span>models.py:<span style="color: #000000;">18</span>:<span style="color: #000000;">1</span>: E302 expected <span style="color: #000000;">2</span> blank lines, found <span style="color: #000000;">1</span><br />
pyflakes:<br />
.<span style="color: #000000; font-weight: bold;">/&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>urls.py:<span style="color: #000000;">3</span>: <span style="color: #ff0000;">'include'</span> imported but unused<br />
.<span style="color: #000000; font-weight: bold;">/&lt;</span>project<span style="color: #000000; font-weight: bold;">&gt;/</span>urls.py:<span style="color: #000000;">4</span>: undefined name <span style="color: #ff0000;">'User'</span></div></div>
<p>Хук &laquo;pre-commit&raquo; проверяет только staged изменения (поэтому после каждого фикса вам придется делать git-add), для того чтобы проверять весь индекс сразу нужно использовать &laquo;--debug&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ .git/hooks/pre-commit --debug</div></div>
<p>Пример проверки сообщения коммита:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #c20cb9; font-weight: bold;">git commit</span> <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;Something II&quot;</span><br />
<span style="color: #000000; font-weight: bold;">**********************************</span><br />
<span style="color: #000000; font-weight: bold;">*****</span> CHECK COMMIT IS FAILED <span style="color: #000000; font-weight: bold;">*****</span><br />
<span style="color: #000000; font-weight: bold;">**********************************</span><br />
<span style="color: #000000; font-weight: bold;">&gt;</span> check_task_tracking_identificator:<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> Wrong Issue ID<span style="color: #000000; font-weight: bold;">!</span> Use format: <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#123;</span>project_id<span style="color: #7a0874; font-weight: bold;">&#125;</span>-<span style="color: #7a0874; font-weight: bold;">&#123;</span>issue_number<span style="color: #7a0874; font-weight: bold;">&#125;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>, example: <span style="color: #7a0874; font-weight: bold;">&#91;</span>PROJ-<span style="color: #000000;">1027</span><span style="color: #7a0874; font-weight: bold;">&#93;</span></div></div>
<p>Если добавить к команде git-commit опцию &laquo;--no-verify&raquo;, то вы сможете пропустить проверку хуков.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">-n, --no-verify<br />
&nbsp; &nbsp; This option bypasses the pre-commit and commit-msg hooks. See also githooks(5).</div></div>
<p>Такого вида контроль повышает качества кода на входе в репозиторий, разработчики оставляют меньше граблей в коде и т.д. Вообщем это минимум, который нужен для повышения качества вашего проекта.</p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/6Q6NfRX_mOQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/python-pre-code-review/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/python-pre-code-review/</feedburner:origLink></item>
		<item>
		<title>Python и Django. Отладка при помощи PuDB</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/OLwySJLgrGU/</link>
		<comments>http://adw0rd.ru/2012/python-django-pudb/#comments</comments>
		<pubDate>Sat, 24 Mar 2012 15:19:50 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[IPython]]></category>
		<category><![CDATA[PuDB]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=7448</guid>
		<description><![CDATA[Этим отладчиком я пользуюсь недавно, где-то полгода, может чуть больше. До этого обходился (надо признаться мучался) с pdb, а также print&#39;ами, logger&#39;ом, debug_toolbar&#39;ом и т.д. Главное отличие в том, что у PuDB есть графический интерфейс с подсветкой синтаксиса, панелями для вывода дополнительной информации, интеграцией с IPython, удобными хоткеями и т.д., всё это делает его незаменимым [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2012/python-django-pudb/" ><img src="http://adw0rd.ru/wp-content/uploads/2012/03/pudb-mini-logo.png" alt="" title="pudb-mini-logo" width="219" height="158" class="alignright size-full wp-image-7453" /></a></p>
<p>Этим отладчиком я пользуюсь недавно, где-то полгода, может чуть больше. До этого обходился (надо признаться мучался) с pdb, а также print&#39;ами, logger&#39;ом, debug_toolbar&#39;ом и т.д. Главное отличие в том, что у <noindex><a rel="nofollow" href="http://mathema.tician.de/software/pudb" >PuDB</a></noindex> есть графический интерфейс с подсветкой синтаксиса, панелями для вывода дополнительной информации, интеграцией с IPython, удобными хоткеями и т.д., всё это делает его незаменимым инструмент на каждый день!</p>
<p>Автор: <noindex><a rel="nofollow" href="https://github.com/inducer" >Andreas Klöckner</a></noindex><br />
Страница проекта на PyPI: <noindex><a rel="nofollow" href="http://pypi.python.org/pypi/pudb" >http://pypi.python.org/pypi/pudb</a></noindex><br />
Исходный код проекта <noindex><a rel="nofollow" href="https://github.com/inducer/pudb" >на GitHub</a></noindex> или в <noindex><a rel="nofollow" href="http://git.tiker.net/pudb.git" >GitWeb автора</a></noindex><br />
Текущая версия: <strong>2012.1</strong></p>
<p>Отладчик использует <noindex><a rel="nofollow" href="http://excess.org/urwid/examples.html" >urwid</a></noindex> для построения графического интерфейса и <noindex><a rel="nofollow" href="http://pygments.org/" >pygments</a></noindex> для подсветки синтаксиса.<br />
<span id="more-7448"></span></p>
<h3>Установка и настройка</h3>
<p>Всё предельно просто, ставим из PyPI:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pip <span style="color: #c20cb9; font-weight: bold;">install</span> pudb</div></div>
<p>Или из исходников:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">git clone</span> git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>inducer<span style="color: #000000; font-weight: bold;">/</span>pudb.git<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> pudb <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> setup.py <span style="color: #c20cb9; font-weight: bold;">install</span><br />
<span style="color: #666666; font-style: italic;"># либо сделайте симлинк в site-packages (я так обычно делаю, использую virtualenv и пакеты из транка)</span><br />
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> ~<span style="color: #000000; font-weight: bold;">/</span>pudb<span style="color: #000000; font-weight: bold;">/</span>pudb ~<span style="color: #000000; font-weight: bold;">/</span>venv<span style="color: #000000; font-weight: bold;">/&lt;</span>virtualenv<span style="color: #000000; font-weight: bold;">&gt;/</span>lib<span style="color: #000000; font-weight: bold;">/</span>python2.7<span style="color: #000000; font-weight: bold;">/</span>site-packages<span style="color: #000000; font-weight: bold;">/</span>pudb</div></div>
<p>Запустите PuDB:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ python<br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> pudb<br />
<span style="color: #66cc66;">&gt;&gt;&gt;</span> pudb.<span style="color: black;">set_trace</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Перед вами предстанет отладчик и попросит вас его настроить, а если не попросит, то можно вызвать настройки самостоятельно&nbsp;&mdash; нажмите &laquo;Ctrl+p&raquo;. Там вы сможете выбрать shell (classic или <b>ipython</b>), тему (classic, vim, dark vim, <b>midnight</b>, либо создать тему самому), порядок вывода стека, способ вывода значений переменных контекста (type, str, repr, либо собственная реализация).</p>
<h3>Инструкция по применению</h3>
<p>Сразу надо заметить, что в интерфейсе сразу все понятно что к чему, а если что-то не понятно, то надо нажать &laquo;?&raquo; и вы увидите полный &laquo;help&raquo;. Приведу его только часть, в порядке частоты использования:</p>
<blockquote>
<h5 style="margin:0">Основное:</h5>
<p><b>!</b>&nbsp;&mdash; вызвать shell, при этом будет доступен весь контекст в котором вы находитесь<br />
<b>o</b>&nbsp;&mdash; вывести консоль, но только для просмотра, удобно когда вы вводили что-то в консоле и хотите снова это посмотреть</p>
<p><b>n</b>&nbsp;&mdash; &laquo;step over&raquo; (перешагнуть), перейти к следующей строке кода<br />
<b>s</b>&nbsp;&mdash; &laquo;step into&raquo;, перейти во внутрь объекта, если это возможно, иначе перейти к следующей строке кода<br />
<b>u</b>&nbsp;&mdash; подняться на один стек-фрейм вверх<br />
<b>d</b>&nbsp;&mdash; опуститься на один стек-фрейм вниз</p>
<p><b>c</b>&nbsp;&mdash; &laquo;continue&raquo;, продолжить (до первого брейкпоинта или до завершения работы программы)<br />
<b>f</b>&nbsp;&mdash; завершить текущую функцию<br />
<b>q</b>&nbsp;&mdash; выход из отладчика и продолжение работы программы</p>
<p><b>e</b>&nbsp;&mdash; показать трейсбек, при этом вы сначала в шапке отладчика отчётливо увидите что произошол трейсбек<br />
<b>L</b>&nbsp;&mdash; показать путь до текущего файла и номер строки, а также goto-line<br />
<b>/</b>&nbsp;&mdash; поиск строки (&laquo;,&raquo;&nbsp;&mdash; вперед, &laquo;.&raquo;&nbsp;&mdash; назад)</p>
<h5 style="margin:0">Работа с брейкпоинтами:</h5>
<p><b>b</b>&nbsp;&mdash; установить брейкпоинт<br />
<b>enter</b>&nbsp;&mdash; отредактировать брейкопинт (работает в панели брейкпоинтов)<br />
<b>d</b>&nbsp;&mdash; удалить брейкпоинт (работает в панели брейкпоинтов)</p>
<h5 style="margin:0">Работа с панелями:</h5>
<p><b>V</b>&nbsp;&mdash; перейти в панель Variables<br />
<b>S</b>&nbsp;&mdash; перейти в панель Stack<br />
<b>B</b>&nbsp;&mdash; перейти в панель Breakpoints<br />
<b>+</b><span style="color:#d0d0d0">/</span><b>&mdash; </b>&nbsp;&mdash; расширить/сузить панель в ширину<br />
<b>_</b><span style="color:#d0d0d0">/</span><b>=</b>&nbsp;&mdash; минимализировать/максимализировать панель в ширину<br />
<b>[</b><span style="color:#d0d0d0">/</span><b>]</b>&nbsp;&mdash; расширить/сузить панель в высоту</p>
<h5 style="margin:0">Работа с панелью переменных (Variables):</h5>
<p><b>\</b>&nbsp;&mdash; развернуть/свернуть содержимое переменной<br />
<b>t</b><span style="color:#d0d0d0">/</span><b>r</b><span style="color:#d0d0d0">/</span><b>s</b><span style="color:#d0d0d0">/</span><b>c</b>&nbsp;&mdash; переключаться между type/repr/str/custom форматом вывода переменной<br />
<b>h</b>&nbsp;&mdash; подсветить переменную в панели (также и отключает подсветку)<br />
<b>@</b>&nbsp;&mdash; закрепить переменную в верхней части панели<br />
<b>w</b>&nbsp;&mdash; переключится в режим word-wrap для переменных (и обратно также)<br />
<b>n</b><span style="color:#d0d0d0">/</span><b>Insert</b>&nbsp;&mdash; добавить в верхнюю панель выражение для слежения (например вы ожидаете появления переменной &laquo;test_something&raquo;, то добавьте её название, когда она будет доступна, тогда появится в верхней панели со значением)<br />
<b>enter</b>&nbsp;&mdash; управление переменными в Variables, в том числе и удаление
</p>
</blockquote>
<h3>Интеграция с Django и IPython</h3>
<p>До версии PuDB 2012.1 необходимо было сделать <noindex><a rel="nofollow" href="http://wiki.tiker.net/PuDB/DjangoIntegration" >следующие манипуляции</a></noindex>, если по каким-либо причинам вы используете старую версию PuDB, то вам это должно пригодится. В новой версии ничего делать не надо, всё работает из коробки!</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2012/03/pudb_django_50.png" alt="" title="pudb_django_50" width="683" height="372" class="alignnone size-full wp-image-7498" /></p>
<p>Также с IPython (версии  0.13+) и PuDB до версии 2012.1 были проблемы, но если вы используете IPython 0.10.x (который до сих пор в пакетах Ubuntu как основной), то всё будет хорошо. <noindex><a rel="nofollow" href="http://wiki.tiker.net/PuDB/IPythonIntegration" >Вот, к слову, о PuDB+IPython интергации</a></noindex>.</p>
<h3>Использование</h3>
<p>Приведу пару примеров о том как пользоваться PuDB:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># Запуск отладчика для определенного скрипта</span><br />
python <span style="color: #660033;">-m</span> pudb.run script.py<br />
python <span style="color: #660033;">-m</span> pudb.run manage.py runcpdebug<br />
<span style="color: #666666; font-style: italic;"># Далее, устанавливайте брейкпоинты и жмите &quot;c&quot; (Continue),</span><br />
<span style="color: #666666; font-style: italic;"># &nbsp; как только отладчик дойдёт до брейкпоинта он остановится</span></div></div>
<p>В коде можно вызвать так:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># В любом месте вставьте:</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> pudb<span style="color: #66cc66;">;</span> pudb.<span style="color: black;">set_trace</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Ко всему прочему привожу видеокаст от автора:<br />
<iframe src="http://player.vimeo.com/video/5255125?title=0&amp;byline=0&amp;portrait=0" width="400" height="308" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>
<p><noindex><a rel="nofollow" href="http://vimeo.com/5255125" >PuDB Intro Screencast</a></noindex> from <noindex><a rel="nofollow" href="http://vimeo.com/user559834" >Andreas Klöckner</a></noindex> on <noindex><a rel="nofollow" href="http://vimeo.com" >Vimeo</a></noindex>.</p>
<h3>Реализация установки брейкпоинтов для Emacs</h3>
<p>Так как я пользуюсь Emacs, то решил для него сделать функцию и хот-кей для вставки брейкпоинта в PuDB.<br />
Поместите следующий код в свой &laquo;~/.emacs&raquo;:</p>
<div class="codecolorer-container lisp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="lisp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> pudb-save-breakpoint <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> file <span style="color: #66cc66;">&#40;</span>buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> line <span style="color: #66cc66;">&#40;</span>substring <span style="color: #66cc66;">&#40;</span>what-line<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> saved-breakpoints <span style="color: #ff0000;">&quot;~/.config/pudb/saved-breakpoints&quot;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #66cc66;">&#40;</span>with-temp-buffer<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span>insert <span style="color: #ff0000;">&quot;b &quot;</span> file <span style="color: #ff0000;">&quot;:&quot;</span> line <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span>file-writable-p saved-breakpoints<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span>append-to-file <span style="color: #66cc66;">&#40;</span>point-<span style="color: #b1b100;">min</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#40;</span>point-<span style="color: #b1b100;">max</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; saved-breakpoints<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span>?\C-x ?\C-_<span style="color: #66cc66;">&#93;</span> 'pudb-save-breakpoint<span style="color: #66cc66;">&#41;</span></div></div>
<p>Идея простая, все брейкпоинты PuDB пишет в свой файл &laquo;~/.config/pudb/saved-breakpoints&raquo;, в формате:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">b &lt;file&gt;:&lt;line&gt;<br />
b &lt;file&gt;:&lt;line&gt;</div></div>
<p>Воспользоваться этим как видите очень просто&nbsp;&mdash; надо дописывать брейкпоинты. Также можно реализовать удаление брейкпоинта, очистку (в том числе с неймспейсом по проекту) и т.д., но мне пока и этого достаточно. Если кто знает готовый или хочет сделать полноценный модуль для Emacs+PuDB, то пишите, буду очень рад!</p>
<p>Так как в elisp я особо не силён, то можно сделать python-скрипт, в который elisp будет передавать аргументы, а скрипт будет уже делать все манипуляции с файлом брейкпоинтов.</p>
<p>Также, рекомендую ознакомиться со списком отладчиков для python: <noindex><a rel="nofollow" href="http://wiki.python.org/moin/PythonDebuggers" >PythonDebuggers&nbsp;&mdash; PythonInfo Wiki</a></noindex>.</p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/OLwySJLgrGU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/python-django-pudb/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/python-django-pudb/</feedburner:origLink></item>
		<item>
		<title>FreeBSD и Debian. Установка и настройка Gitolite</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/2xyBhFRDAh0/</link>
		<comments>http://adw0rd.ru/2012/freebsd-debian-gitolite/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 21:13:46 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Gitolite]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=7370</guid>
		<description><![CDATA[В след за статьёй FreeBSD и Debian. Установка и настройка Gitosis хочу рассказать про Gitolite. Это аналогичный по функциональности инструмент, но дающий чуть больше возможностей, например разграничения прав на ветки и теги, и немного проще в использовании. А ещё, в отличие от Gitosis, он до cих пор поддерживается. Будем считать, что вы уже создали пользователя [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2012/freebsd-debian-gitolite/" ><img src="http://adw0rd.ru/wp-content/uploads/2011/04/250px-Git-logo.svg_.png" alt="" title="Git" width="250" height="96" class="alignright size-full wp-image-6311" /></a></p>
<p>В след за статьёй <noindex><a rel="nofollow" href="/2012/freebsd-debian-gitosis/">FreeBSD и Debian. Установка и настройка Gitosis</a> хочу рассказать про <strong>Gitolite</strong>. Это аналогичный по функциональности инструмент, но дающий чуть больше возможностей, например разграничения прав на ветки и теги, и немного проще в использовании. А ещё, в отличие от Gitosis, он до cих пор <a href="https://github.com/sitaramc/gitolite" >поддерживается</a></noindex>.</p>
<p>Будем <a href="/2012/freebsd-debian-gitosis/#git-install">считать</a>, что вы уже создали пользователя и группу &laquo;git&raquo;, а также установил Git на сервере.</p>
<h3>Gitolite</h3>
<p>Иногда для проектов хочется иметь некие &laquo;production&raquo;-ветки и &laquo;release&raquo;-теги, но с ограниченным доступом к ним определенным пользователям. Например разработчики имеют доступ только к ветке &laquo;master&raquo; и собственным веткам созданным на сервере, а &laquo;production&raquo; должен быть для них недоступен, чтобы по воле случая они туда ничего не намержили плохого.<br />
<span id="more-7370"></span></p>
<blockquote>
<p>
Git начал становиться очень популярным в корпоративных средах, где обычно есть дополнительные требования в плане контроля доступа. Gitolite изначально был создан, чтобы посодействовать в выполнении таких требований. Но как оказывается он так же полезен и в мире open source: проект Fedora управляет доступом к своим репозиториям пакетов с помощью gitolite. А ведь этих репозиториев больше 10 000! По видимому это самая большая установка gitolite где бы то ни было.</p>
<p>Gitolite позволяет указать права доступа не только для репозиториев, но и для веток или имён меток внутри каждого репозитория. То есть, вы можете указать, что определённые люди (или группы людей) могут отправлять (push) определённые “ссылки” (ветки или метки), а остальные нет.</p>
<p><noindex><a rel="nofollow" href="http://progit.org/book/ru/ch4-8.html" >Pro Git&nbsp;&mdash; Pro Git 4.8 Git на сервере Gitolite</a></noindex>
</p>
</blockquote>
<h3>Установка Gitolite</h3>
<p>FreeBSD:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>devel<span style="color: #000000; font-weight: bold;">/</span>gitolite<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p>Debian:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> gitolite</div></div>
<p>Из исходников:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">git clone</span> git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>sitaramc<span style="color: #000000; font-weight: bold;">/</span>gitolite.git<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> .<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>gl-system-install</div></div>
<h3>Настройка Gitolite</h3>
<p>Для начала нам надо создать на локальной машине <a href="/2011/ssh-auth-key/">ключ</a> и скопировать его на сервер:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">ssh-keygen</span> <span style="color: #660033;">-C</span> “<span style="color: #000000; font-weight: bold;">&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;</span>” <span style="color: #660033;">-t</span> rsa<br />
<span style="color: #c20cb9; font-weight: bold;">scp</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>id_rsa.pub <span style="color: #000000; font-weight: bold;">&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;@&lt;</span><span style="color: #c20cb9; font-weight: bold;">hostname</span><span style="color: #000000; font-weight: bold;">&gt;</span>:key_for_gitolite.pub<br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>id_rsa ~<span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>gitolite</div></div>
<p>Теперь добавьте в свой локальный «.ssh/config»:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Host gitolite<br />
&nbsp; &nbsp; User git<br />
&nbsp; &nbsp; Hostname &lt;hostname&gt;<br />
&nbsp; &nbsp; IdentityFile ~/.ssh/gitolite</div></div>
<p>Далее, надо войти на сервер и проинициализировать gitolite:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">su</span> - <span style="color: #c20cb9; font-weight: bold;">git</span><br />
gl-setup <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;/</span>key_for_gitolite.pub</div></div>
<p>Перейдем снова на локальную машину и попробуем подключится:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">ssh</span> gitolite <span style="color: #660033;">-T</span><br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> hello <span style="color: #000000; font-weight: bold;">&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;</span>, this is gitolite v2.3-<span style="color: #000000;">0</span>-g01e789a running on <span style="color: #c20cb9; font-weight: bold;">git</span> 1.7.9.3<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> the gitolite config gives you the following access:<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> &nbsp; &nbsp; &nbsp;R &nbsp; W &nbsp; gitolite-admin<br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">@</span>R_ <span style="color: #000000; font-weight: bold;">@</span>W_&nbsp; testing</div></div>
<p>Если примерно такой ответ, то есть перечислены репозитории и права, то всё окей, продолжаем!</p>
<h4>Пользователи, макросы и права с refex</h4>
<p>Теперь склонируем репозиторий «gitolite-admin» к себе и отредактируем конфигурационный файл:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">git clone</span> <span style="color: #c20cb9; font-weight: bold;">git</span><span style="color: #000000; font-weight: bold;">@</span>gitolite:gitolite-admin gitolite-admin</div></div>
<p>В полученном репозитории вы увидите каталог &laquo;keydir&raquo;, в котором хранятся все публичные ключи пользователей имеющих доступ к каким-либо репозиториям. Чтобы добавить пользователя, необходимо чтобы вы поместили сгенерированный им публичный ключ в каталог &laquo;keydir&raquo;.</p>
<p>Также, в &laquo;gitolite-admin&raquo; находится каталог &laquo;conf&raquo;, в котором присутствует конфигурационный файл &laquo;gitolite.conf&raquo;, со следующим содержимым:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">repo &nbsp; &nbsp;gitolite-admin<br />
&nbsp; &nbsp; &nbsp; &nbsp; RW+ &nbsp; &nbsp; = &nbsp; adw0rd, &lt;another-username&gt;<br />
<br />
repo &nbsp; &nbsp;testing<br />
&nbsp; &nbsp; &nbsp; &nbsp; RW+ &nbsp; &nbsp; = &nbsp; @all</div></div>
<p>По содержимому понятно как указывать репозитории, права и пользователей. Также есть специальный макрос &laquo;@all&raquo;, который содержит в себе всех пользователей из &laquo;keydir&raquo;.</p>
<p>Вы можете создавать свои макросы и использовать их в дальнейшем:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@admins &nbsp; &nbsp; = adw0rd vasa_c<br />
@developers = @admins tester &nbsp;# Some comment<br />
@staff &nbsp; &nbsp; &nbsp;= @admins @developers<br />
<br />
repo &nbsp; &nbsp;gitolite-admin<br />
&nbsp; &nbsp; &nbsp; &nbsp; RW+ &nbsp; &nbsp; = &nbsp; @admins<br />
<br />
repo &nbsp; &nbsp;project<br />
&nbsp; &nbsp; &nbsp; &nbsp; RW+ &nbsp; &nbsp; = &nbsp; @developers</div></div>
<p><strong>Возможности прав:</strong></p>
<ul>
<li>&laquo;R&raquo;&nbsp;&mdash; только чтение refs;</li>
<li>&laquo;RW&raquo;&nbsp;&mdash; чтение и запись (в том числе создание новых) refs;</li>
<li>&laquo;RW+&raquo;&nbsp;&mdash; чтение, запись (с перезаписью существующих) и удаление refs;</li>
<li>&laquo;-&raquo;&nbsp;&mdash; доступ отсутствует;</li>
</ul>
<p><strong>Refex</strong> это регулярные выражения для удаленных (remote) веток, тегов и файлов:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">repo &nbsp;project<br />
&nbsp; &nbsp; RW+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = @leaders<br />
&nbsp; &nbsp; - &nbsp; &nbsp;production &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = @all<br />
&nbsp; &nbsp; R &nbsp; &nbsp;refs/heads/experimantal &nbsp;= @all<br />
&nbsp; &nbsp; - &nbsp; &nbsp;refs/heads/experimantal &nbsp;= @all<br />
&nbsp; &nbsp; - &nbsp; &nbsp;refs/tags/rc2000b &nbsp; &nbsp; &nbsp; &nbsp;= @all<br />
&nbsp; &nbsp; RW+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = @all</div></div>
<p>Если вы не указываете явно префикс "refs/<something>", то gitolite сам дописывает в начале &laquo;refs/heads/&raquo;, поэтому для &laquo;- production = @all&raquo; будет равносилен &laquo;- refs/heads/production = @all&raquo;.</p>
<h4>Права на ветки, теги и файлы</h4>
<p>Ну наконец перешли к самому интересному! Для примера сделаем чтобы <b>@leaders</b> имели доступ ко всему, а <b>@developers</b> имели доступ <b>только на чтение</b> к ветке &laquo;production&raquo; и тегам &laquo;rc*&raquo; (но не могли создавать такие теги).</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">repo &nbsp;project<br />
&nbsp; &nbsp; RW+ NAME/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = @leaders<br />
&nbsp; &nbsp; RW+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = @leaders<br />
<br />
&nbsp; &nbsp; # Ветка production (с двумя способами ввода)<br />
&nbsp; &nbsp; R &nbsp; production &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= @developers<br />
&nbsp; &nbsp; - &nbsp; refs/heads/production = @developers<br />
<br />
&nbsp; &nbsp; # Теги rc*<br />
&nbsp; &nbsp; R &nbsp; refs/tags/rc.* &nbsp; &nbsp; &nbsp; &nbsp;= @developers<br />
&nbsp; &nbsp; - &nbsp; refs/tags/rc.* &nbsp; &nbsp; &nbsp; &nbsp;= @developers<br />
<br />
&nbsp; &nbsp; # Также вы можете указать конкретные файлы:<br />
&nbsp; &nbsp; R &nbsp; NAME/.gitignore &nbsp; &nbsp; &nbsp; = @developers<br />
&nbsp; &nbsp; - &nbsp; NAME/.gitignore &nbsp; &nbsp; &nbsp; = @developers<br />
<br />
&nbsp; &nbsp; RW+ NAME/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = @developers<br />
&nbsp; &nbsp; RW+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = @developers</div></div>
<p>Порядок следования правил важен, так как они проверяются последовательно!</p>
<h4>Создание репозитория</h4>
<p>Чтобы создать новый репозиторий необходимо зайти на сервер и выполнить:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">su</span> - <span style="color: #c20cb9; font-weight: bold;">git</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>repositories<br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> someproject.git <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">cd</span> someproject.git<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">git init</span> <span style="color: #660033;">--bare</span><br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> Initialized empty Git repository <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>repositories<span style="color: #000000; font-weight: bold;">/</span>someproject.git<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>Теперь откроем файл &laquo;gitolite-admin/conf/gitolite.conf&raquo; и добавим нужный нам репозиторий:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">repo &nbsp; &nbsp;gitolite-admin<br />
&nbsp; &nbsp; &nbsp; &nbsp; RW+ &nbsp; &nbsp; = &nbsp; adw0rd<br />
<br />
repo &nbsp; &nbsp;someproject<br />
&nbsp; &nbsp; &nbsp; &nbsp; RW+ &nbsp; &nbsp; = &nbsp; adw0rd</div></div>
<p>Для того чтобы настройки вступили в силу надо отправить свои изменения на сервер:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">git commit</span> <span style="color: #660033;">-am</span> <span style="color: #ff0000;">&quot;Added the 'someproject' repo&quot;</span><br />
<span style="color: #c20cb9; font-weight: bold;">git push</span> origin master</div></div>
<p>Далее, можете получить свой репозиторий:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> ~<br />
<span style="color: #c20cb9; font-weight: bold;">git clone</span> <span style="color: #c20cb9; font-weight: bold;">git</span><span style="color: #000000; font-weight: bold;">@</span>gitolite:someproject.git someproject<br />
<br />
<span style="color: #666666; font-style: italic;"># или, если у вас уже есть проект</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>someproject<br />
<span style="color: #c20cb9; font-weight: bold;">git remote</span> add origin <span style="color: #c20cb9; font-weight: bold;">git</span><span style="color: #000000; font-weight: bold;">@</span>gitolite:someproject.git</div></div>
<p>Это всё. Рекомендую также почитать статью <noindex><a rel="nofollow" href="http://habrahabr.ru/post/136815/" >Знакомство с gitolite</a></noindex></p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/2xyBhFRDAh0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/freebsd-debian-gitolite/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/freebsd-debian-gitolite/</feedburner:origLink></item>
		<item>
		<title>FreeBSD и Debian. Установка и настройка Gitosis</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/4hjJDFhCrAQ/</link>
		<comments>http://adw0rd.ru/2012/freebsd-debian-gitosis/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 22:35:32 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Gitosis]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6301</guid>
		<description><![CDATA[Со временем я перешел с Mercurial на Git, почему это произошло я расскажу в другой статье. А сегодня я расскажу как организовать авторизацию и разграничение прав не репозитории при помощи Gitosis. Установка и настройка Git В любом случае нам понадобится создать группу и пользователя &#171;git&#187;, а также установить Git. FreeBSD: pw group add git adduser [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2012/freebsd-debian-gitosis/" ><img src="http://adw0rd.ru/wp-content/uploads/2011/04/250px-Git-logo.svg_.png" alt="" title="Git" width="250" height="96" class="alignright size-full wp-image-6311" /></a></p>
<p>Со временем я перешел с Mercurial на Git, почему это произошло я расскажу в другой статье. А сегодня я расскажу как организовать авторизацию и разграничение прав не репозитории при помощи Gitosis.</p>
<p><a name="git-install"></a></p>
<h3>Установка и настройка Git</h3>
<p>В любом случае нам понадобится создать группу и пользователя &laquo;git&raquo;, а также установить <strong>Git</strong>.</p>
<p>FreeBSD:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pw group add <span style="color: #c20cb9; font-weight: bold;">git</span><br />
adduser <span style="color: #c20cb9; font-weight: bold;">git</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>devel<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">git</span><br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p>Debian:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">groupadd <span style="color: #c20cb9; font-weight: bold;">git</span><br />
useradd <span style="color: #660033;">-g</span> <span style="color: #c20cb9; font-weight: bold;">git</span> <span style="color: #c20cb9; font-weight: bold;">git</span><br />
<span style="color: #c20cb9; font-weight: bold;">apt-get install</span> <span style="color: #c20cb9; font-weight: bold;">git</span></div></div>
<p><span id="more-6301"></span></p>
<h3>Установка и настройка Gitosis</h3>
<p>В свое время, на работе, мы выбрали Gitosis и не разочаровались. Решение достаточно простое, опирающееся на git-хуки и <a href="/2011/ssh-auth-key/">ssh-ключи</a>, которое обеспечивает нас самым главным&nbsp;&mdash; разграничение прав на проекты.</p>
<blockquote>
<p>
Хранение публичных ключей всех пользователей в authorized_keys для предоставления доступа работает хорошо лишь на время. Когда у вас сотни пользователей это скорее похоже на пытку. Вы должны заходить на сервер каждый раз и нет никакого разграничения доступа — все перечисленные в файле имеют доступ на чтение и на запись к каждому проекту.</p>
<p>На этой стадии вы можете захотеть обратиться к широко используемому ПО под названием Gitosis. Gitosis — это просто набор сценариев (скриптов), который поможет вам управляться с файлом authorized_keys и реализовать простой контроль доступа. Действительно интересно, что интерфейсом для этого инструмента для добавления людей и определения доступа для них является не веб-интерфейс, а специальный git-репозиторий. Вы настраиваете информацию в этом проекте и, когда вы отправляете её в репозиторий, Gitosis исходя из неё перенастраивает сервер, что круто.</p>
<p><noindex><a rel="nofollow" href="http://progit.org/book/ru/ch4-7.html" >Pro Git&nbsp;&mdash; Pro Git 4.7 Git на сервере Gitosis</a></noindex>
</p>
</blockquote>
<p>Вообщем авторизация будет по ключам, а gitosis будет контролировать политику прав. Поехали!</p>
<h4>Установка Gitosis</h4>
<p>FreeBSD:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>devel<span style="color: #000000; font-weight: bold;">/</span>py-gitosis<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p>Debian:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">apt-get install</span> gitosis</div></div>
<p>Можно и из исходников, но так как разработка gitosis прекратилась осенью 2009 года, свежее всёравно не будет:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">git clone</span> git:<span style="color: #000000; font-weight: bold;">//</span>eagain.net<span style="color: #000000; font-weight: bold;">/</span>gitosis.git gitosis<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> gitosis<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> python setup.py <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<h4>Настройка Gitosis</h4>
<p>Для начала нам надо создать на локальной машине ключ и скопировать его на сервер:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ssh-keygen -C “&lt;username&gt;” -t rsa<br />
scp ~/.ssh/id_rsa.pub &lt;username&gt;@example.org:key_for_gitosis.pub<br />
mv ~/.ssh/id_rsa ~/.ssh/gitosis</div></div>
<p>Теперь добавьте в свой локальный &laquo;.ssh/config&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Host gitosis<br />
&nbsp; &nbsp; User git<br />
&nbsp; &nbsp; Hostname &lt;hostname&gt;<br />
&nbsp; &nbsp; IdentityFile ~/.ssh/gitosis</div></div>
<p>Далее, надо войти на сервер и проинициализировать gitosis:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">su</span> - <span style="color: #c20cb9; font-weight: bold;">git</span><br />
gitosis-init <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/&lt;</span>username<span style="color: #000000; font-weight: bold;">&gt;/</span>key_for_gitosis.pub<br />
Initialized empty Git repository <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>repositories<span style="color: #000000; font-weight: bold;">/</span>gitosis-admin.git<span style="color: #000000; font-weight: bold;">/</span><br />
Reinitialized existing Git repository <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>repositories<span style="color: #000000; font-weight: bold;">/</span>gitosis-admin.git<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>Перейдем снова на локальную машину и попробуем подключится:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ssh git@gitosis -T<br />
&gt;&gt; ERROR:gitosis.serve.main:Need SSH_ORIGINAL_COMMAND in environment.</div></div>
<p>Если примерно такой ответ, то все хорошо, продолжаем!</p>
<p>Теперь склонируем репозиторий &laquo;gitosis-admin&raquo; к себе и отредактируем конфигурационный файл:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">git clone</span> <span style="color: #c20cb9; font-weight: bold;">git</span><span style="color: #000000; font-weight: bold;">@</span>gitosis:gitosis-admin.git gitosis-admin</div></div>
<p>В полученном репозитории вы увидите каталог &laquo;keydir&raquo;, в котором хранятся все публичные ключи пользователей имеющих доступ к репозиториям. Чтобы добавить пользователя, необходимо чтобы вы поместили сгенерированный им публичный ключ, а после добавили упоминание этого пользователя в файле &laquo;gitosis.conf&raquo; секция &laquo;members&raquo;.</p>
<p>Чтобы создать новый репозиторий необходимо зайти на сервер и выполнить:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>repositories<br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> someproject.git <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">cd</span> someproject.git<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">git init</span> <span style="color: #660033;">--bare</span><br />
<span style="color: #000000; font-weight: bold;">&gt;&gt;</span> Initialized empty Git repository <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>repositories<span style="color: #000000; font-weight: bold;">/</span>someproject.git<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>Далее, добавим в локальный файл &laquo;gitosis.conf&raquo; что-то наподобие:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[group developers]<br />
writable = someproject<br />
members = adw0rd &lt;another-username&gt;</div></div>
<p>Также возможно унаследовать пользователей из другой группы, например:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[group developers]<br />
members = adw0rd example<br />
<br />
[group project]<br />
writable = project<br />
members = @developers tester</div></div>
<p>Вообщем в &laquo;members&raquo; надо перечислить пользователей, у которых есть доступ к репозиторию &laquo;writable&raquo;. И добавить в &laquo;keydir&raquo; публичные ключи полученные от пользователей. Это всё что надо!</p>
<p>Для отладки самого gitsis вам может понадобится эта опция:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[gitosis]<br />
loglevel=DEBUG</div></div>
<p>Gitosis читает файла настроек из этого файла &laquo;/home/git/repositories/.gitosis.conf&raquo;, он симлинк на &laquo;/home/git/repositories/gitosis-admin.git/gitosis.conf&raquo;. Так что вы всегда можете повлиять на конфигурационный файл gitosis&#39;а даже если потеряли доступ к нему из вне отредактировав вручную &laquo;/home/git/repositories/.gitosis.conf&raquo;.</p>
<p>Рекомендую также почитать <noindex><a rel="nofollow" href="https://wiki.archlinux.org/index.php/Gitosis" >Gitosis&nbsp;&mdash; ArchWiki</a></noindex>.</p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/4hjJDFhCrAQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/freebsd-debian-gitosis/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/freebsd-debian-gitosis/</feedburner:origLink></item>
		<item>
		<title>Обрабатываем LESS «на лету» с помощью Nginx и Node.js</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/qNj7l0LYrT8/</link>
		<comments>http://adw0rd.ru/2012/processing-less-via-nginx-and-nodejs/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 12:30:09 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[LESS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6982</guid>
		<description><![CDATA[Сегодня начал использовать twitter-bootstrap и решил процессить less не на клиентской стороне, а средствами сервера, просто по приколу. Сразу же вспомнил про статью на хабре Серверный процессинг LESS файлов «на лету» своими руками и решил реализовать то, что там написано. Принцип работы заключается в том, что все обращения к файлам &#171;*.less&#187; будут проксироваться через Nginx [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2012/processing-less-via-nginx-and-nodejs/"><img src="http://adw0rd.ru/wp-content/uploads/2012/03/less-nginx-and-nodejs.png"  alt="" title="less-via-nginx-and-nodejs" width="199" height="97" class="alignright size-full wp-image-6999" /></a></noindex></p>
<p>Сегодня начал использовать <noindex><a rel="nofollow" href="http://twitter.github.com/bootstrap/" >twitter-bootstrap</a></noindex> и решил процессить <noindex><a rel="nofollow" href="http://lesscss.org/" >less</a></noindex> не на клиентской стороне, а средствами сервера, просто по приколу. Сразу же вспомнил про статью на хабре <noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/nginx/138103/" >Серверный процессинг LESS файлов «на лету» своими руками</a></noindex> и решил реализовать то, что там написано.</p>
<p>Принцип работы заключается в том, что все обращения к файлам &laquo;*.less&raquo; будут проксироваться через <strong>Nginx</strong> и преобразовываться на лету (можно и <a href="/2010/nginx-fastcgi-cache/">nginx-кеш</a> прикрутить, если надо) в <strong>css</strong> средствами <strong>node.js</strong>.<br />
<span id="more-6982"></span></p>
<h3>Установка</h3>
<p>Для начала нам надо установить nginx и node.js:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> nginx nodejs</div></div>
<p>Скачиваем <noindex><a rel="nofollow" href="https://github.com/adw0rd/less.js/downloads" >отсюда</a></noindex> последнюю версию <strong>less.js</strong> и устанавливаем:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cd ~<br />
wget -O adw0rd-less.js.tar.gz https://github.com/adw0rd/less.js/tarball/master<br />
tar -xzf adw0rd-less.js.tar.gz<br />
cd adw0rd-less.js-*<br />
<br />
# Проверяем less<br />
make test</div></div>
<h3>Настройка</h3>
<p>Добавим в &laquo;/etc/hosts&raquo; хост &laquo;example.loc&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">127.0.0.1 example.loc</div></div>
<h4>Отконфигурируем Nginx</h4>
<p>Добавим в &laquo;/etc/nginx/nginx.conf&raquo; апстрим &laquo;lessserv&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">upstream lessserv {<br />
&nbsp; &nbsp; server localhost:1337;<br />
}</div></div>
<p>Отредакируем ваш server-конфиг для &laquo;example.loc&raquo;&nbsp;&mdash; &laquo;/etc/nginx/sites-available/example.conf&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server {<br />
&nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; server_name example.loc;<br />
&nbsp; &nbsp; root /path/to/example;<br />
<br />
&nbsp; &nbsp; location ~* \.less$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://lessserv;<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>После чего не забываем добавить в sites-enabled и зарелоадить Nginx:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-available<span style="color: #000000; font-weight: bold;">/</span>example.conf <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sites-enabled<span style="color: #000000; font-weight: bold;">/</span>example.conf<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> nginx <span style="color: #660033;">-s</span> reload</div></div>
<h4>Теперь перейдем к node.js</h4>
<p>В файле &laquo;bin/lessserv&raquo; вы можете указать нужный вам <strong>listen_host</strong> и <strong>listen_port</strong>, по умолчанию:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var listen_port = 1337,<br />
&nbsp; &nbsp; listen_host = &quot;127.0.0.1&quot;;</div></div>
<p>Запускаем lessserv, который и будет проксировать наши less-файлы:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cd ~/adw0rd-less.js-*<br />
node bin/lessserv --path=/path/to/example</div></div>
<p>Проверяем по ссылке: <noindex><a rel="nofollow" href="http://example.loc/bootstrap/less/bootstrap.less" >http://example.loc/bootstrap/less/bootstrap.less</a></noindex>, если отдается готовый css-файл, то все у вас получилось!</p>
<blockquote class="info">
<p>
Ествественно, в каталоге &laquo;/path/to/example&raquo; должен присутствовать распакованный каталог <noindex><a rel="nofollow" href="https://github.com/twitter/bootstrap/downloads" >bootstrap</a></noindex>.
</p>
</blockquote>
<p>Далее в <strong>html</strong> подключать можно так:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://example.loc/bootstrap/less/bootstrap.less&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></div></div>
<p>P.S. Вообщем статья это &laquo;толстый Like&raquo; <noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/nginx/138103/" >статьи с хабра</a></noindex>, хотя более подробная в плане настроек, пофикшены инструкции (proxy_pass, вместо proxy_path), а также немного улучшен &laquo;less.js&raquo; на <noindex><a rel="nofollow" href="https://github.com/adw0rd/less.js" >GitHub</a></noindex>&#39;е :)</p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/qNj7l0LYrT8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/processing-less-via-nginx-and-nodejs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/processing-less-via-nginx-and-nodejs/</feedburner:origLink></item>
		<item>
		<title>jQuery. Написал плагин jquery-cleverfocus</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/9ckCKEI7nxs/</link>
		<comments>http://adw0rd.ru/2012/jquery-cleverfocus/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 15:47:37 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Проекты]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6936</guid>
		<description><![CDATA[Зарелизил сегодня плагин для jQuery, который при вводе на сайте текста пользователем &#171;в никуда&#187; перехватывает это и по истечению лимита введенных символов выбрасывает собранные данные в нужный нам инпут и ставит на него фокус. Плагин совместим с версией jQuery 1.7.1, так как тестировался только на нём. Исходный код на GitHub Демка на demo.adw0rd.ru А зачем [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2012/jquery-cleverfocus/"><img src="http://adw0rd.ru/wp-content/uploads/2012/03/jquery-cleverfocus-min.png"  alt="" title="jquery-cleverfocus-min" width="268" height="87" class="alignright size-full wp-image-6948" /></a></noindex></p>
<p>Зарелизил сегодня плагин для <strong>jQuery</strong>, который при вводе на сайте текста пользователем &laquo;в никуда&raquo; перехватывает это и по истечению лимита введенных символов выбрасывает собранные данные в нужный нам инпут и ставит на него фокус.</p>
<p>Плагин совместим с версией <strong>jQuery 1.7.1</strong>, так как тестировался только на нём.</p>
<ul>
<li><noindex><a rel="nofollow" href="https://github.com/adw0rd/jquery-cleverfocus" >Исходный код на GitHub</a></noindex></li>
<li><a href="http://demo.adw0rd.ru/jquery-cleverfocus/functional_test.html" >Демка на demo.adw0rd.ru</a></li>
</ul>
<h3>А зачем вообще это?</h3>
<p><strong>Случай #1</strong><br />
Пользователь приходит на сайт, видит форму поиска, набирает искомое слово (при этом он чаще всего смотрит в клавиатуру), подняв голову он понимает что набирал текст &laquo;в никуда&raquo;, сильно бесится, ставит фокус, вводит несколько символов, проверяет что у него получается набирать текст &laquo;куда надо&raquo; и со спокойной душой продолжает набирать искомое слово.</p>
<p>Тут вы скажете &laquo;Эй! надо ставить фокус после загрузки DOM!&raquo;, ан нет, это тоже плохое решение, разберем второй кейс.</p>
<p><strong>Случай #2</strong><br />
Пользователь приходит на сайт, ему не интересна форма поиска, он хочет поскроллить/полистать (Left/Right, Up/Down, PgUp/PgDown, Home/End и т.д.) страницу с помощью клавиатуры (пользователей, которые пользуются ноутбуками без использования мыши достаточно много), а так как у нас стоит фокус в форме поиска, то он снова обламывается.</p>
<p>Для решения этих вот двух кейсов и был создан плагин <noindex><a rel="nofollow" href="http://github.com/adw0rd/jquery-cleverfocus" >jquery-cleverfocus</a></noindex>.<br />
<span id="more-6936"></span></p>
<h3>Пример использования</h3>
<p>Допустим у вам есть форма поиска с id="search_input":</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;search_input&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></div></div>
<p>То для неё следует использовать плагин так:</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#search_input&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">cleverfocus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; keypress_limit<span style="color: #339933;">:</span> <span style="color: #CC0000;">3</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>В поставку входит <noindex><a rel="nofollow" href="https://github.com/adw0rd/jquery-cleverfocus/blob/master/functional_test.html" >functional_test.html</a></noindex>, на котором вы можете проверить плагин, также в целях демонстрации я разместил плагин на <a href="http://demo.adw0rd.ru/jquery-cleverfocus/functional_test.html" >demo.adw0rd.ru/jquery-cleverfocus/functional_test.html</a></p>
<h3>Почему он так называется?</h3>
<p>Сначала, я дал ему имя &laquo;jquery-autofocus&raquo;, но потом поискал в гугле это название и нашёл <noindex><a rel="nofollow" href="https://github.com/miketaylr/autofocus" >плагин с таким же названием</a></noindex>, которой призван эмулировать атрибут autofocus из HTML5 в HTML меньших версий.</p>
<p>Потом я решил назвать его &laquo;jquery-smartfocus&raquo;, но и тут поджидало меня разочарование, так как есть и <noindex><a rel="nofollow" href="http://archive.plugins.jquery.com/project/smartFocus" >такой плагин</a></noindex>.</p>
<p>В итоге, назвал его по &laquo;человечному&raquo;&nbsp;&mdash; <strong>cleverfocus</strong>.</p>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/9ckCKEI7nxs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/jquery-cleverfocus/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/jquery-cleverfocus/</feedburner:origLink></item>
		<item>
		<title>Python. Работаем с xls через xlwt/xlrd и python-uno</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/KehGn3XYL3Q/</link>
		<comments>http://adw0rd.ru/2012/python-excel-xlwt-xlrd-xlutils-and-python-uno/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 13:50:09 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[xls]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6520</guid>
		<description><![CDATA[Понадобилось без потери данных и функциональности модифицировать xls документы, то есть мы имеем несколько листов в документе, на одном из листов есть фильтры, списки и прочие компоненты современного екселя. Первое что приходит на ум&#160;&#8212; это старый-добрый Python Excel (xlwt/xlrd), попробуем реализовать модификацию ячейки с помощью этого инструмента, а потом перейдем к PyUNO. Python Excel: xlwt, [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2012/python-excel-xlwt-xlrd-xlutils-and-python-uno/"><img src="http://adw0rd.ru/wp-content/uploads/2012/12/python-xls.png"  alt="" title="python-xls" width="366" height="102" class="alignright size-full wp-image-6860" /></a></noindex></p>
<p>Понадобилось без потери данных и функциональности модифицировать xls документы, то есть мы имеем несколько листов в документе, на одном из листов есть фильтры, списки и прочие компоненты современного екселя.</p>
<p>Первое что приходит на ум&nbsp;&mdash; это старый-добрый <strong>Python Excel</strong> (xlwt/xlrd), попробуем реализовать модификацию ячейки с помощью этого инструмента, а потом перейдем к <strong>PyUNO</strong>.<br />
<span id="more-6520"></span></p>
<h3>Python Excel: xlwt, xlrd, xlutils</h3>
<p>Более подробно об этих пакетах можно почитать на странице <noindex><a rel="nofollow" href="http://www.python-excel.org/" >Python Excel</a></noindex>.<br />
Для начала установим их:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> pip <span style="color: #c20cb9; font-weight: bold;">install</span> xlwt xlrd xlutils</div></div>
<p>А теперь пример кода:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> xlwt<span style="color: #66cc66;">,</span> xlrd<br />
<span style="color: #ff7700;font-weight:bold;">from</span> xlutils.<span style="color: #dc143c;">copy</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">copy</span> <span style="color: #ff7700;font-weight:bold;">as</span> xlcopy<br />
<br />
source_filename <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;/tmp/example.xls&quot;</span><br />
destination_filename <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;/tmp/example_new.xls&quot;</span><br />
<br />
read_book <span style="color: #66cc66;">=</span> xlrd.<span style="color: black;">open_workbook</span><span style="color: black;">&#40;</span>source_filename<span style="color: #66cc66;">,</span> on_demand<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Открываем исходный документ</span><br />
read_sheet <span style="color: #66cc66;">=</span> read_book.<span style="color: black;">get_sheet</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Читаем из первого листа</span><br />
write_book <span style="color: #66cc66;">=</span> xlcopy<span style="color: black;">&#40;</span>read_book<span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Копируем таблицу в память, в неё мы ниже будем записывать</span><br />
write_sheet <span style="color: #66cc66;">=</span> write_book.<span style="color: black;">get_sheet</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Будем записывать в первый лист</span><br />
write_sheet.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> read_sheet.<span style="color: black;">cell_value</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">42</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Прибавим к значению из ячейки &quot;A1&quot; число 42</span><br />
write_book.<span style="color: black;">save</span><span style="color: black;">&#40;</span>destination_filename<span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Сохраняем таблицу</span></div></div>
<p>Простейший пример использования <strong>испортит</strong> нам документ, в котором есть формулы, фильтры и прочие компоненты таблицы, поэтому это решение нам не подходит.</p>
<h3>PyUNO</h3>
<p>Теперь попробуем <strong>python-uno</strong>, его мы тоже установим, в добавок нам необходимо установить <strong>libreoffice</strong>, так как именно в libreoffice мы и будем производить изменения:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> python-uno libreoffice</div></div>
<p>Пакеты python-uno и libreoffice можно установить на разные хосты, так как первый будет клиентом для второго.</p>
<p>Теперь запустим <strong>libreoffice</strong> на локальном хосте:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">libreoffice <span style="color: #660033;">--accept</span>=<span style="color: #ff0000;">&quot;socket,host=localhost,port=2002;urp;StarOffice.ServiceManager&quot;</span></div></div>
<p>Пример кода по модификации одной ячейки через PyUNO:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> uno<br />
<br />
source_filename <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;/tmp/example.xls&quot;</span><br />
destination_filename <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;/tmp/example_new.xls&quot;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_document<span style="color: black;">&#40;</span>filename<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #483d8b;">&quot;&quot;&quot;Небольшая обертка для корретного открытия документа&quot;&quot;&quot;</span><br />
&nbsp; &nbsp; local <span style="color: #66cc66;">=</span> uno.<span style="color: black;">getComponentContext</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; resolver <span style="color: #66cc66;">=</span> local.<span style="color: black;">ServiceManager</span>.<span style="color: black;">createInstanceWithContext</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;com.sun.star.bridge.UnoUrlResolver&quot;</span><span style="color: #66cc66;">,</span> local<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; context <span style="color: #66cc66;">=</span> resolver.<span style="color: black;">resolve</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; desktop <span style="color: #66cc66;">=</span> context.<span style="color: black;">ServiceManager</span>.<span style="color: black;">createInstanceWithContext</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;com.sun.star.frame.Desktop&quot;</span><span style="color: #66cc66;">,</span> context<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; document <span style="color: #66cc66;">=</span> desktop.<span style="color: black;">loadComponentFromURL</span><span style="color: black;">&#40;</span>uno.<span style="color: black;">systemPathToFileUrl</span><span style="color: black;">&#40;</span>filename<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;_blank&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">tuple</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> document<br />
<br />
document <span style="color: #66cc66;">=</span> get_document<span style="color: black;">&#40;</span>source_filename<span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Окроем исходный документ</span><br />
sheet <span style="color: #66cc66;">=</span> document.<span style="color: black;">getSheets</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">getByIndex</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Получем первый лист</span><br />
cell <span style="color: #66cc66;">=</span> sheet.<span style="color: black;">getCellByPosition</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># Получим необходимую нам ячейку</span><br />
cell.<span style="color: black;">setString</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>cell.<span style="color: black;">getString</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">42</span><span style="color: black;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;"># И запишем в неё новый результат</span><br />
<br />
<span style="color: #808080; font-style: italic;"># Сохраняем документ</span><br />
document.<span style="color: black;">storeToURL</span><span style="color: black;">&#40;</span>uno.<span style="color: black;">systemPathToFileUrl</span><span style="color: black;">&#40;</span>destination_filename<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></div></div>
<p>Код далек от идеала, но для презентации возможностей это самое то.</p>
<p>Результат был достигнут&nbsp;&mdash; все компоненты в таблице остались не тронутыми, поменялась лишь ячейка, которую мы меняли.<br />
Вообщем <strong>python-uno</strong> идеально подходит для автоматизации работы с офисными документами без потерь!</p>
<h4>Рекомендую почитать</h4>
<ul>
<li><noindex><a rel="nofollow" href="http://wiki.services.openoffice.org/wiki/PyUNO_bridge" >PyUNO bridge&nbsp;&mdash; Apache OpenOffice.org Wiki</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://vorushin.ru/blog/61-pyuno-django-interactive-shell/" >Интерактивная консоль для pyuno + django</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://vorushin.ru/blog/58-openoffice-python-ms-word/" >OpenOffice + Python, pабота с файлами MS Word</a></noindex></li>
</ul>
<img src="http://feeds.feedburner.com/~r/adw0rd/~4/KehGn3XYL3Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/python-excel-xlwt-xlrd-xlutils-and-python-uno/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2012/python-excel-xlwt-xlrd-xlutils-and-python-uno/</feedburner:origLink></item>
	</channel>
</rss>

