<?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>Wed, 28 Jul 2010 18:10:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</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>Восстановление данных в Ubuntu</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/KWfReiYI4dw/</link>
		<comments>http://adw0rd.ru/2010/recovery-files-ubuntu/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 21:19:49 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5709</guid>
		<description><![CDATA[Удалил я все файлы в домашней директории на своем нетбуке. Удалял через консоль, поэтому из корзины не восстановить. Самое важное было наверное фотографии, конфиг emacs и некоторые документы малой важности. Начал искать средства типа &#171;undelete&#187; и прочие, и натолкнулся на foremost, которая мне показалась самой простой в использовании. Сразу скажу любителям высказываний &#171;это все из-за [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2010/recovery-files-ubuntu/" ><img src="http://adw0rd.ru/wp-content/uploads/2010/02/ubuntulogomini.png" alt="" title="ubuntu-logo" width="225" height="59" class="alignright size-full wp-image-5249"  style="padding:0 20px" /></a></p>
<p>Удалил я все файлы в домашней директории на своем нетбуке. Удалял через консоль, поэтому из корзины не восстановить. Самое важное было наверное фотографии, конфиг emacs и некоторые документы малой важности. Начал искать средства типа &laquo;undelete&raquo; и прочие, и натолкнулся на <noindex><a rel="nofollow" href="http://foremost.sourceforge.net/" >foremost</a></noindex>, которая мне показалась самой простой в использовании.</p>
<p>Сразу скажу любителям высказываний &laquo;это все из-за того что ты сидишь с правами рута постоянно&raquo;, в домашнем каталоге все файлы с моими правами и сидя я под собой я удалил бы их всеравно! Если бы это была другая директория, то я бы согласился с ними.</p>
<h3>Предыстория</h3>
<p>А вообще удалил я при странных стечениях обстоятельств, вот как это было:<br />
Запустил <strong>mc</strong>, нажал Ctrl+O, попал в консоль, далее:</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;">cp</span> <span style="color: #660033;">-R</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>project <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>adw0rd<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>adw0rd<br />
<span style="color: #c20cb9; font-weight: bold;">find</span> .<span style="color: #000000; font-weight: bold;">/</span>project <span style="color: #660033;">-name</span> <span style="color: #ff0000;">&quot;.svn&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">xargs</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span></div></div>
<p>Теперь захотел выйти из консоли и попасть в mc:<br />
и нажимая Crtl+O, случайно нажал Ctrl+P (прям как наш президент с <noindex><a rel="nofollow" href="http://twitter.com/KremlinRussia/status/16863556707" >мое6</a></noindex>), при этом нажалась сначала Ctrl+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;">find</span> .<span style="color: #000000; font-weight: bold;">/</span>project <span style="color: #660033;">-name</span> <span style="color: #ff0000;">&quot;.svn&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">xargs</span> <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span></div></div>
<p>и после чего нажалась сразу Ctrl+O что вернула меня в mc.</p>
<p>Я подумал что ничего страшного, так как я уже в режиме файлового менеджера (в нижней консоли ничего не было), и я захотел зайти в ./project.<br />
Нажимаю на каталог &laquo;project&raquo;... И вот тут то и настал пипец, <strong>mc</strong> завис, <strong>HDD</strong> зашуршал, я стал вырубать консоль, но видимо было уже поздно... :)<br />
<span id="more-5709"></span></p>
<h3>Восстановление файлов</h3>
<p>Установим утилиту foremost:</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</span> <span style="color: #c20cb9; font-weight: bold;">install</span> foremost</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">foremost <span style="color: #660033;">-w</span> <span style="color: #660033;">-i</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sda1 <span style="color: #660033;">-o</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>recovery</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">foremost <span style="color: #660033;">-i</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sda1 <span style="color: #660033;">-o</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>recovery</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">foremost <span style="color: #660033;">-t</span> jpg <span style="color: #660033;">-i</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>sda1 <span style="color: #660033;">-o</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>recovery</div></div>
<p>Желательно каталог для восстановления иметь на другом носителе, примонтированный в вашу систему, например внешний жесткий диск и т.д. Для того, чтобы восстановленные данные не перезатерли то что вы еще не восстановили.</p>
<h4>Скрипт для удаления дубликатов</h4>
<p>Так как <strong>foremost</strong> восстанавливает все подряд, то попадаются дубликаты файлов, которые по содержимому полностью идентичны.<br />
Поэтому я решил написать скриптик, который удалит дубликаты и оставит только оригиналы.</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;">#!/usr/bin/env python</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> hashlib <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">md5</span><br />
<br />
COLOR_RESET = <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>33[0m&quot;</span><br />
COLOR_RED = <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>33[1;31m&quot;</span><br />
COLOR_GREEN = <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>33[1;32m&quot;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:<br />
<br />
&nbsp; &nbsp; hashes = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; filenames = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> root, dirs, files <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">walk</span><span style="color: black;">&#40;</span>path<span style="color: black;">&#41;</span>:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; files_len = <span style="color: #ff4500;">0</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> <span style="color: #008000;">file</span> <span style="color: #ff7700;font-weight:bold;">in</span> files:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; files_len += <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; path_to_file = path + <span style="color: #008000;">file</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>path_to_file<span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fhash = <span style="color: #dc143c;">md5</span><span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>.<span style="color: black;">hexdigest</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = hashes.<span style="color: black;">index</span><span style="color: black;">&#40;</span>fhash<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#if f == open(path + filenames[i]).read():</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># &nbsp; &nbsp;print COLOR_RED + path_to_file + ' --- remove!' + COLOR_RESET</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># &nbsp; &nbsp;os.remove(path_to_file)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> COLOR_RED + path_to_file + <span style="color: #483d8b;">' --- remove!'</span> + COLOR_RESET<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>path_to_file<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">ValueError</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> COLOR_GREEN + path_to_file + <span style="color: #483d8b;">' --- UNIQ!'</span> + COLOR_RESET<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hashes.<span style="color: black;">append</span><span style="color: black;">&#40;</span>fhash<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; filenames.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">file</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; hashes_len = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>hashes<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;--------------------------------&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Files: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>files_len<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Deleted: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>files_len - hashes_len<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Rest: &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>hashes_len<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:<br />
&nbsp; &nbsp; main<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></div></div>
<p>Он получает md5-хеш содержимого файла, кладет его в список, если в списке уже есть такой хеш, то файл удаляется, если нет, то переходит к следующему файлу.<br />
Для тех кто думает что могут быть коллизии, то надо расскоментить в середине скрипта блок кода, который проверит еще и по содержимому файлу, в случае если его хеш найден в списке.</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: #000000; font-weight: bold;">/</span>remover.py <span style="color: #000000; font-weight: bold;">/</span>recovery<span style="color: #000000; font-weight: bold;">/</span>jpg<span style="color: #000000; font-weight: bold;">/</span></div></div>
<h3>Обезопасим себя на будущее</h3>
<p>Ну, начнем с малого, в ~/.bashrc (либо в другом шеле, например ~/.cshrc) пропишем алиас, который перед удалением будет задавать вопрос:</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;">alias</span> <span style="color: #007800;">rm</span>=<span style="color: #ff0000;">&quot;rm -i&quot;</span></div></div>
<p>Мне это не особо нравится, так как надоедает...</p>
<h4>Утилита trash-cli</h4>
<p>Еще лучше идея с фоновым перемещением данных в корзину, например изложенная недавно <noindex><a rel="nofollow" href="http://larin.in/archives/176" >тут</a></noindex> Анатолием Лариным. Для этого будем использовать утилиту trash-cli, которая написана на python и состоящая из нескольких команд, о которых ниже...</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: #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>.local<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>Trash<span style="color: #000000; font-weight: bold;">/</span>files<br />
<span style="color: #000000; font-weight: bold;">/</span>root<span style="color: #000000; font-weight: bold;">/</span>.local<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>Trash<span style="color: #000000; font-weight: bold;">/</span>files</div></div>
<p>Вот там то и будут храниться наши файлы, которые при необходимости мы сможем вытащить или удалить насовсем.</p>
<p>Установим утилиту &laquo;trash-cli&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</span> <span style="color: #c20cb9; font-weight: bold;">install</span> trash-cli</div></div>
<p>Создаем алиас на удаление (~/.bashrc, а так же не забудьте прописать для /root/.bashrc):</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;">alias</span> <span style="color: #007800;">rm</span>=<span style="color: #ff0000;">'trash'</span></div></div>
<p>Удаление как и раньше будет через <strong>rm</strong>, а просмотреть список &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">list-trash</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">empty-trash</div></div>
<p><strong>Для любопытных:</strong> я пробовал создать пользователя, накидать туда файлов и каталогов, после чего удалить все у него, но он споткнулся на каталоге корзины и выкинул эксепшен, так что данные останутся целы.</p>
<h4>Напоследок</h4>
<p>После удаления поменьше нервничайте и все вы сможете восстановить, главное не паникуйте, а то дров еще больших нарубите! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/recovery-files-ubuntu/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/recovery-files-ubuntu/</feedburner:origLink></item>
		<item>
		<title>С днём рождения меня, с днём рождения меня!</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/hPI5cjiRBFs/</link>
		<comments>http://adw0rd.ru/2010/happy-birthday-2/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 10:19:28 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Личка]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5693</guid>
		<description><![CDATA[Ну вот, прошёл еще один год и теперь мне наступило 26 лет... В этом году планирую жениться и наклепать еще больше совместных проектов со своими друзьями. По традиции меня уже поздравили на Пыхе, лично, по телефону, скайпу, почтой и джабберу очень много людей, всем им огромное спасибо! Кто еще не успел&#160;&#8212; добро пожаловать в камменты! [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://adw0rd.ru/wp-content/uploads/2010/06/hb2010.png" alt="" title="hb2010" width="292" height="274" class="alignnone size-full wp-image-5694" /></p>
<p>Ну вот, <a href="/2009/happy-birthday/">прошёл еще один год</a> и теперь мне наступило 26 лет...<br />
В этом году планирую жениться и наклепать еще больше совместных проектов со своими друзьями.</p>
<p>По традиции меня уже поздравили на <a href="http://pyha.ru/forum/topic/4534.0" >Пыхе</a>, лично, по телефону, скайпу, почтой и джабберу очень много людей, всем им огромное спасибо!<br />
Кто еще не успел&nbsp;&mdash; добро пожаловать в камменты! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/happy-birthday-2/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/happy-birthday-2/</feedburner:origLink></item>
		<item>
		<title>Django. Первое приложение</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/0a99MbCd_Ok/</link>
		<comments>http://adw0rd.ru/2010/django-first-app/#comments</comments>
		<pubDate>Wed, 26 May 2010 17:09:03 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Python. Изучаем вместе!]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4852</guid>
		<description><![CDATA[Захотелось мне поведать как использовать связь ManyToMany, начал я значит писать пост, но так как я хотел его детализировать то он слишком разросся... И я решил сначала написать пост о том, как создавать первый проект и приложение на Django, чтобы потом ссылаться сюда. &#8212; начинал я этот пост писать еще в том году, да все [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://adw0rd.ru/wp-content/uploads/2009/11/Djangologo.gif" alt="Djangologo" title="Djangologo" width="125" height="50" class="alignright size-full wp-image-4834" /></p>
<p>Захотелось мне поведать как использовать связь <strong>ManyToMany</strong>, начал я значит писать пост, но так как я хотел его детализировать то он слишком разросся... И я решил сначала написать пост о том, как создавать первый проект и приложение на <strong>Django</strong>, чтобы потом ссылаться сюда.</p>
<p><i style="color:#c4c4c4">&mdash; начинал я этот пост писать еще в том году, да все руки не доходили его закончить, спасибо vasa_c за терпение</i></p>
<h3>Устанавливаем Django</h3>
<p>Заходим на страницу <noindex><a rel="nofollow" href="http://www.djangoproject.com/download/" >загрузки официального сайта</a></noindex>, скачиваем <noindex><a rel="nofollow" href="http://www.djangoproject.com/download/1.1.1/tarball/" >Django 1.1.1</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: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<br />
<span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> Django-1.1.1.tar.gz http:<span style="color: #000000; font-weight: bold;">//</span>www.djangoproject.com<span style="color: #000000; font-weight: bold;">/</span>download<span style="color: #000000; font-weight: bold;">/</span>1.1.1<span style="color: #000000; font-weight: bold;">/</span>tarball<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzvf</span> Django-1.1.1.tar.gz<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> Django-1.1.1<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> python setup.py <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p>Все, джанго установлен!<br />
<span id="more-4852"></span><br />
Так как мы будем работать с MySQL, то вам надо установить библиотеку py-mysqldb, представляющая собой интерфейс к MySQL.</p>
<h4>Для Ubuntu:</h4>
<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</span> <span style="color: #c20cb9; font-weight: bold;">install</span> python-mysqldb</div></div>
<h4>Для FreeBSD</h4>
<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>databases<span style="color: #000000; font-weight: bold;">/</span>py-MySQLdb<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p>А для Windows можно скачать <noindex><a rel="nofollow" href="http://sourceforge.net/projects/mysql-python/files/mysql-python/" >тут</a></noindex>.</p>
<h3>Создаем наш первый проект</h3>
<p>Допустим, что имя проекта у нас будет &laquo;myproject&raquo;:</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: #dc143c;">cd</span> /www<br />
django-admin.<span style="color: black;">py</span> startproject myproject</div></div>
<p>Теперь создайте себе новую БД &laquo;myproject&raquo;:</p>
<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"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #ff0000;">`myproject`</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARACTER <span style="color: #993333; font-weight: bold;">SET</span> utf8 COLLATE utf8_general_ci;</div></div>
<p>И отредактируйте &laquo;/www/myproject/settings.py&raquo;, заменив только соответствующие части:</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;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Настройки БД</span><br />
DATABASE_ENGINE = <span style="color: #483d8b;">'mysql'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.</span><br />
DATABASE_NAME = <span style="color: #483d8b;">'myproject'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Or path to database file if using sqlite3.</span><br />
DATABASE_USER = <span style="color: #483d8b;">'username'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Not used with sqlite3.</span><br />
DATABASE_PASSWORD = <span style="color: #483d8b;">'password'</span> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Not used with sqlite3.</span><br />
DATABASE_HOST = <span style="color: #483d8b;">''</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Set to empty string for localhost. Not used with sqlite3.</span><br />
DATABASE_PORT = <span style="color: #483d8b;">''</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Set to empty string for default. Not used with sqlite3.</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Путь до каталога, где лежат наши медиа файлы (css, js, images)</span><br />
MEDIA_ROOT = <span style="color: #483d8b;">'/www/myproject/static/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># URL медиа файлов (css, js, images)</span><br />
MEDIA_URL = <span style="color: #483d8b;">'/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># URL медиа файлов админки (css, js, images, etc)</span><br />
ADMIN_MEDIA_PREFIX = <span style="color: #483d8b;">'/admin-media/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Путь до каталога с шаблонами</span><br />
TEMPLATE_DIRS = <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">&quot;/www/myproject/blog/templates&quot;</span><br />
<span style="color: black;">&#41;</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Установленные приложения в нашем проекте</span><br />
INSTALLED_APPS = <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.auth'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.contenttypes'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.sessions'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.sites'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.admin'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'myproject.blog'</span>,<br />
<span style="color: black;">&#41;</span><br />
<span style="color: #808080; font-style: italic;"># в конец добавлено две строки, первая подключает джанговскую админку,</span><br />
<span style="color: #808080; font-style: italic;"># а второе наше приложение, которое мы ниже опишем</span></div></div>
<p>Для чего я ставлю в начале строки <strong>&laquo;#~*~ coding: utf-8 ~*~&raquo;</strong> читайте <noindex><a rel="nofollow" href="http://www.python.org/dev/peps/pep-0263/" >тут</a></noindex>.</p>
<h3>Создаем наше первое приложение</h3>
<p>После того, как вы создали проект, надо создать приложение, если у вас проект состоит из одного приложения&nbsp;&mdash; можете его назвать &laquo;main&raquo;.</p>
<p>Создаем приложение &laquo;blog&raquo;:</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: #dc143c;">cd</span> /www/myproject<br />
python manage.<span style="color: black;">py</span> startapp blog</div></div>
<h4>Файл модели</h4>
<p>Теперь перейдем к разработке модели нашего приложения, отредактируем &laquo;/www/myproject/blog/models.py&raquo;.<br />
У нас будет пока одна сущность, это Посты в Блоге:</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;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем класс модели</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models<br />
<span style="color: #808080; font-style: italic;"># и админки</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin<br />
<br />
<span style="color: #483d8b;">''</span><span style="color: #483d8b;">'<br />
Blog posts<br />
'</span><span style="color: #483d8b;">''</span><br />
<span style="color: #ff7700;font-weight:bold;">class</span> Post<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># название поста</span><br />
&nbsp; &nbsp; title = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># содержимое поста</span><br />
&nbsp; &nbsp; text = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #483d8b;">''</span><span style="color: #483d8b;">'<br />
Класс для админки, тут будут дополнительные атрибуты необходимые для админки<br />
'</span><span style="color: #483d8b;">''</span><br />
<span style="color: #ff7700;font-weight:bold;">class</span> PostAdmin<span style="color: black;">&#40;</span>admin.<span style="color: black;">ModelAdmin</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># в таблице списка постов выводить только колонку title, если вы добавите еще одно имя поля, то и оно выведется</span><br />
&nbsp; &nbsp; list_display = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'title'</span>,<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># связываем эту модель с моделью PostAdmin</span><br />
admin.<span style="color: #dc143c;">site</span>.<span style="color: black;">register</span><span style="color: black;">&#40;</span>Post, PostAdmin<span style="color: black;">&#41;</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"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myproject<br />
python manage.py syncdb</div></div>
<blockquote class="info">
<p>
Для более детального изучения команд manage.py введите:</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">python manage.py <span style="color: #7a0874; font-weight: bold;">help</span></div></div>
<p>Если вас интересует конкретная комманда, например syncdb, то:</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">python manage.py <span style="color: #7a0874; font-weight: bold;">help</span> syncdb</div></div>
<p>Вы так же можете создавать свои команды, но об этом поговорим не в этот раз.
</p>
</blockquote>
<p><strong>syncdb</strong> создаст таблицы в вашей БД, а также при первой инициализации попросит <em>создать</em> рутовую учетную запись для вашего проекта в django (это будет админский аккаунт):</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">Creating table auth_permission<br />
Creating table auth_group_permissions<br />
Creating table auth_group<br />
Creating table auth_user_user_permissions<br />
Creating table auth_user_groups<br />
Creating table auth_user<br />
Creating table auth_message<br />
Creating table django_content_type<br />
Creating table django_session<br />
Creating table django_site<br />
Creating table django_admin_log<br />
Creating table blog_post<br />
<br />
You just installed Django's auth system, which means you don't have any superusers defined.<br />
Would you like to create one now? (yes/no): yes<br />
Username (Leave blank to use 'root'): <br />
E-mail address: mail@example.com<br />
Password: <br />
Password (again): <br />
Superuser created successfully.<br />
Installing index for auth.Permission model<br />
Installing index for auth.Message model<br />
Installing index for admin.LogEntry model</div></div>
<p>Когда вы создадите новый класс модели вам будет необходимо вновь запустить syncdb.<br />
Если вы внесли изменения в уже синхронизированное приложение, а именно в его модель, то syncdb НЕ внесет их в вашу БД, для этого используйте sqlall и другие sql* комманды:</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">python manage.py sqlall название_приложения <span style="color: #7a0874; font-weight: bold;">&#40;</span>например: blog<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></div>
<p>Или попробуйте расширение для Django <noindex><a rel="nofollow" href="http://code.google.com/p/django-evolution/" >Django Evolution</a></noindex> (для этого необходимо его установить в вашу систему и добавить в INSTALLED_APPS&nbsp;&mdash; &laquo;django_evolution&raquo;).</p>
<h4>Файл урлов</h4>
<p>Для навигации по вашему проекту вам нужен роутер (URL диспетчер).<br />
Отредактируем &laquo;/www/myproject/urls.py&raquo;:</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;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем админку</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin<br />
<br />
<span style="color: #808080; font-style: italic;"># Makes the patterns() function available</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span>.<span style="color: black;">urls</span>.<span style="color: black;">defaults</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем наши вьюхи (см. ниже описание файла вьюх)</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> myproject.<span style="color: black;">blog</span>.<span style="color: black;">views</span> <span style="color: #ff7700;font-weight:bold;">import</span> main_page, get_post<br />
<br />
<span style="color: #808080; font-style: italic;"># Above we used admin.autodiscover() to automatically load the INSTALLED_APPS admin.py modules</span><br />
admin.<span style="color: black;">autodiscover</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
urlpatterns = patterns<span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если ничего не введено, то отдаем управление mainpage вьюхе</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^$'</span>, main_page<span style="color: black;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если передан id поста, то отдаем управление get_post вьюхе</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^post/([0-9]{1,5})'</span>, get_post<span style="color: black;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если введен /admin/, то идем в админку</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^admin/'</span>, include<span style="color: black;">&#40;</span>admin.<span style="color: #dc143c;">site</span>.<span style="color: black;">urls</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,<br />
<span style="color: black;">&#41;</span></div></div>
<p>Вы конечно можете отредактировать локальный для приложения &laquo;blog&raquo;&nbsp;&mdash; urls.py (&laquo;/www/myproject/blog/urls.py&raquo;), но тогда вам надо будет импортировать &laquo;/www/myproject/blog/urls.py&raquo; в корневом &laquo;urls.py&raquo;. Либо вы можете его определить в settings.py (ROOT_URLCONF).</p>
<h4>Файл вьюхи</h4>
<p>Ту роль, которую играет &laquo;Controller&raquo; в MVC, в Django играет роль View. Почему это так читайте <noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names" >тут</a></noindex>.<br />
Отредактируем &laquo;/www/myproject/blog/views.py&raquo;:</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;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># функция генерирующая 404 страницу</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> Http404<br />
<br />
<span style="color: #808080; font-style: italic;"># функция отрисовки страницы, принимающая путь до шаблона и данные помещенные в шаблон</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">shortcuts</span> <span style="color: #ff7700;font-weight:bold;">import</span> render_to_response<br />
<br />
<span style="color: #808080; font-style: italic;"># наша модель</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> myproject.<span style="color: black;">blog</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Post<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> main_page <span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Получаем список постов</span><br />
&nbsp; &nbsp; posts = Post.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># отрисовываем</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">'list.html'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;posts&quot;</span>: &nbsp;posts<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_post <span style="color: black;">&#40;</span>request, post_id<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># выбираем конкретный пост, pk - primary key</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; post = Post.<span style="color: black;">objects</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span>pk=post_id<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> Post.<span style="color: black;">DoesNotExist</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># если такого поста нет, то генерируем 404</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">raise</span> Http404<br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># отрисовываем</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">'single.html'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;title&quot;</span>: &nbsp;post.<span style="color: black;">title</span>, <span style="color: #483d8b;">&quot;text&quot;</span>: post.<span style="color: black;">text</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span></div></div>
<h3>Вывод в шаблоне</h3>
<p>В Django очень мощный и гибкий шаблонизатор, у него даже есть аналог на PHP&nbsp;&mdash; <strong>Twig</strong>, что говорит о его удобстве (был бы неудобным&nbsp;&mdash; не копировали бы), хотя <strong>Twig</strong> по слухам сильно хуже.<br />
Однако, есть более крутой шаблонизатор для Django&nbsp;&mdash; <noindex><a rel="nofollow" href="http://jinja.pocoo.org/2/" >Jinja2</a></noindex>, с более высокой производительностью и более гибкими возможностями. Описывать <strong>Jinja</strong> я не буду, ведь не это цель сего поста, поэтому делюсь только ссылочками:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://vostryakov.ru/blog/13-perehod-ot-django-templejtovk-jinja2/" >Переход от Django темплэйтов к Jinja2</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/ref/templates/api/#using-an-alternative-template-language" >Django: Using an alternative template language</a></noindex></li>
</ul>
<p>С более полными возможностями <strong>Django Template</strong> вы можете познакомится на <noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/topics/templates/" >официальной странице</a></noindex>.</p>
<p>В <strong>Django Template</strong> поддерживается наследование, поэтому мы напишем общий шаблон и будем его использовать <strong>base.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: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;content-type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>{% block title %}Default{% endblock %} / MyProject<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span><br />
&nbsp; &nbsp; {% block content %}<br />
&nbsp; &nbsp; {% endblock %}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></div></div>
<p>Шаблон вывода списка постов <strong>list.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">{% extends &quot;base.html&quot; %}<br />
<br />
{% block title %}List!{% endblock %}<br />
<br />
{% block content %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;list-style-type:none&quot;</span>&gt;</span><br />
{% for post in posts %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;padding-left:10px;{% if forloop.counter0|divisibleby:&quot;</span><span style="color: #cc66cc;">4</span><span style="color: #ff0000;">&quot; %}background-color:#E1F3C9{% endif %}&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/post/{{ post.id }}/&quot;</span>&gt;</span>{{ post.title }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>{{ post.text }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span><br />
{% endfor %}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{% endblock %}</div></div>
<p>Шаблон вывода одной записи <strong>single.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">{% extends &quot;base.html&quot; %}<br />
<br />
{% block title %}{{ title }}{% endblock %}<br />
<br />
{% block content %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>{{ title }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span><br />
<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{{ text }}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{% endblock %}</div></div>
<h3>Nginx</h3>
<p>Теперь настроим Nginx для того, чтобы запуская &laquo;manage.py runserver&raquo; нам не прописывать порт в URL и чтобы использовать нормальное имя хоста, хотя вы может вполне без это обойтись.<br />
Но я очень рекомендую использовать 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">server {<br />
&nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; server_name myproject.loc;<br />
<br />
&nbsp; &nbsp; location ^~ /admin-media {<br />
&nbsp; &nbsp; &nbsp; &nbsp; alias /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location /static/ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; root /www/myproject/static/;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location ~* \.(jpg|jpeg|gif|png|ico|css|zip|js|swf)$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; root /www/myproject/static/;<br />
&nbsp; &nbsp; &nbsp; &nbsp; expires 7d;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location / {<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://127.0.0.1:8001/;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_redirect off;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header Host $host;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Real-IP $remote_addr;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>Добавить в &laquo;/etc/hosts&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 &nbsp; &nbsp; &nbsp;myproject.loc</div></div>
<p>И перезагрузить 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: #666666; font-style: italic;"># в новых версиях nginx можно послать сигнал</span><br />
nginx <span style="color: #660033;">-s</span> reload<br />
<br />
<span style="color: #666666; font-style: italic;"># или для ubuntu/debian через скрипт инициализации</span><br />
service nginx restart<br />
<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>nginx restart<br />
<br />
<span style="color: #666666; font-style: italic;"># или для freebsd</span><br />
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>nginx restart</div></div>
<p>Запускаем веб-сервер проекта на 8001 порту, так как мы туда будем проксировать из 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: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myproject<br />
python manage.py runserver <span style="color: #000000;">8001</span></div></div>
<p>Теперь зайдите в админку (<noindex><a rel="nofollow" href="http://myproject.loc/admin/" >http://myproject.loc/admin/</a></noindex>), введите вашу &laquo;root&raquo; учетку, которую создавали при syncdb.</p>
<blockquote class="download">
<p>Вы можете скачать архив с исходниками проекта <a href="/files/django-myproject/myproject-20100526.tgz">тут</a></p>
</blockquote>
<p>Вот мы и познакомились с первым приложение на Django, как я и обещал в начале этого поста следующая статья будет о <strong>ManyToMany</strong>, где мы подключим к нашему &laquo;Блогу&raquo; возможность создавать и выводить теги, а также расскажу более полно о возможностях моделях и ORM, View и о URL диспетере.</p>
<p>P.S. Пост дописывал в торопях, если найдете любые ошибки&nbsp;&mdash; обязательно отпишитесь в комментарии, спасибо!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/django-first-app/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/django-first-app/</feedburner:origLink></item>
		<item>
		<title>Ubuntu. Откат PHP с 5.3.2 на 5.2.10</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/6qOClYsi75I/</link>
		<comments>http://adw0rd.ru/2010/ubuntu-downgrade-php532-to-php5210/#comments</comments>
		<pubDate>Mon, 17 May 2010 15:26:15 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5559</guid>
		<description><![CDATA[Некоторое время назад я обновил свою Ubuntu на 10.04, при этом обновились все пакеты в соответствии с репозиторием новой убунты. Мне это не подходило, так как PHP стал 5.3.2 и Zend Optimizer в нем не работал, а он мне был срочно нужен на рабочей системе. Как откатить? Нам необходимо добавить старые репозитории. Добавьте в конец [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2010/ubuntu-downgrade-php532-to-php5210/" ><img src="http://adw0rd.ru/wp-content/uploads/2010/02/ubuntulogomini.png" alt="" title="ubuntu-logo" width="225" height="59" class="alignright size-full wp-image-5249" /></a></p>
<p>Некоторое время назад я обновил свою Ubuntu на 10.04, при этом обновились все пакеты в соответствии с репозиторием новой убунты. Мне это не подходило, так как PHP стал 5.3.2 и Zend Optimizer в нем не работал, а он мне был срочно нужен на рабочей системе.</p>
<h3>Как откатить?</h3>
<p>Нам необходимо добавить старые репозитории.<br />
Добавьте в конец файла &laquo;/etc/apt/sources.list&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">deb http://ru.archive.ubuntu.com/ubuntu/ karmic main restricted<br />
deb-src http://ru.archive.ubuntu.com/ubuntu/ karmic main restricted</div></div>
<p>Далее, зайдите в &laquo;System > Administration > Synaptic Package Manager&raquo; и нажмите &laquo;Reload&raquo; <strong>(1)</strong>.<br />
После чего выберите пакет &laquo;php5&raquo; <strong>(2)</strong> (и другие, необходимые для даунгрейда) и нажмите &laquo;Ctrl+E&raquo; (или "Package > Force Version...<strong>" (3)</strong>) и выберите версию, у меня это &laquo;5.2.10&raquo; <strong>(4)</strong>.</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/05/synaptic-downgrade.jpg" alt="" title="synaptic-downgrade" width="590" height="357" class="alignnone size-full wp-image-5566" /></p>
<p>Если не появится версия &laquo;5.2.10&raquo; в Force Version, то зайдите в &laquo;Settings > Repositories > Other Software&raquo; и выберите репозитории, которые вы указали в конце файла &laquo;/etc/apt/sources.list&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/ubuntu-downgrade-php532-to-php5210/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/ubuntu-downgrade-php532-to-php5210/</feedburner:origLink></item>
		<item>
		<title>Первые меры безопасности во FreeBSD</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/6ahdsocZ8VM/</link>
		<comments>http://adw0rd.ru/2010/first-measures-security-freebsd/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 09:05:31 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Bind]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[IPFW]]></category>
		<category><![CDATA[Sendmail]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5055</guid>
		<description><![CDATA[Не так давно попросили меня написать о первых мерах безопасности во FreeBSD. Я конечно протянул время, но статью всетаки публику, авось кому пригодиться. Закрываем SSH Отредактируйте в файле /etc/ssh/sshd_config следующие строки: # Будет добавлено к названию версии, посмотреть можно через telnet на 2244 порт VersionAddendum SuperPuperSSH-9.8.7 # Указываем порт который будем слушать, главное чтобы он [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/" ><img src="http://adw0rd.ru/wp-content/uploads/2010/03/freebsd_security2.jpg" alt="" title="freebsd_security2" width="131" height="132" class="alignright size-full wp-image-5319" /></a></p>
<p>Не так давно попросили меня написать о первых мерах безопасности во FreeBSD. Я конечно протянул время, но статью всетаки публику, авось кому пригодиться.</p>
<h3>Закрываем SSH</h3>
<p>Отредактируйте в файле <strong>/etc/ssh/sshd_config</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"># Будет добавлено к названию версии, посмотреть можно через telnet на 2244 порт<br />
VersionAddendum SuperPuperSSH-9.8.7<br />
# Указываем порт который будем слушать, главное чтобы он отличался от 22-го,<br />
# так как много тупых ботов подбирающих пароли на 22 порт<br />
Port 2244<br />
# Внешний адрес моей машины<br />
ListenAddress 82.146.63.195</div></div>
<p>И еще рекомендую закрыть доступ для пользователя <strong>root</strong>, все в том же <strong>sshd_config</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">#PermitRootLogin yes</div></div>
<p>От перебора паролей по <a href="/2009/denyhosts/">SSH вам может помочь DenyHost</a>.</p>
<p><span id="more-5055"></span></p>
<h3>Закрываем порты</h3>
<p>Теперь запустим файрволл <strong>IPFW</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"><span style="color: #007800;">firewall_enable</span>=<span style="color: #ff0000;">&quot;YES&quot;</span><br />
<span style="color: #007800;">firewall_script</span>=<span style="color: #ff0000;">&quot;/etc/fw.sh&quot;</span><br />
<span style="color: #007800;">firewall_logging</span>=<span style="color: #ff0000;">&quot;YES&quot;</span></div></div>
<p>И напишем инициализирующий скрипт <strong>/etc/fw.sh</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"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<span style="color: #007800;">FwCMD</span>=<span style="color: #ff0000;">&quot;/sbin/ipfw&quot;</span><br />
<br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #660033;">-f</span> flush<br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">10</span> add check-state<br />
<span style="color: #666666; font-style: italic;"># закрываем sendmail</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">15</span> add allow tcp from me to me <span style="color: #000000;">25</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">20</span> add deny tcp from any to me <span style="color: #000000;">25</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">30</span> add deny tcp from any to me <span style="color: #000000;">587</span><br />
<span style="color: #666666; font-style: italic;"># закрываем mysql</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">40</span> add deny tcp from any to me <span style="color: #000000;">3306</span><br />
<span style="color: #666666; font-style: italic;"># закрываем sphinx</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">45</span> add allow tcp from me to me <span style="color: #000000;">3312</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">50</span> add deny tcp from any to me <span style="color: #000000;">3312</span><br />
<span style="color: #666666; font-style: italic;"># закрываем apache</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">55</span> add allow tcp from me to me <span style="color: #000000;">88</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">60</span> add deny tcp from any to me <span style="color: #000000;">88</span><br />
<span style="color: #666666; font-style: italic;"># закрываем tornado web server</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">75</span> add allow tcp from me to me <span style="color: #000000;">8001</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">80</span> add deny tcp from any to me <span style="color: #000000;">8001</span><br />
<span style="color: #666666; font-style: italic;"># закрываем tracd</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">105</span> add allow tcp from me to me <span style="color: #000000;">3050</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">110</span> add deny tcp from any to me <span style="color: #000000;">3050</span><br />
<span style="color: #666666; font-style: italic;"># разрешаем все остальное</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">1000</span> add allow ip from any to any</div></div>
<p><!--<br />
<strong>UPD.</strong> Более правильное решение указать какие порты оставить открытыми, а все остальное вообще закрыть:</p>
<blockquote>
<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;">#!/bin/sh</span><br />
<span style="color: #007800;">FwCMD</span>=<span style="color: #ff0000;">&quot;/sbin/ipfw&quot;</span><br />
<br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #660033;">-f</span> flush<br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">10</span> add check-state<br />
<span style="color: #666666; font-style: italic;"># разрешаем</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">20</span> add allow tcp from me to me <span style="color: #000000;">25</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">40</span> add allow tcp from me to me <span style="color: #000000;">3312</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">60</span> add allow tcp from me to me <span style="color: #000000;">88</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">80</span> add allow tcp from me to me <span style="color: #000000;">8001</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">100</span> add allow tcp from me to me <span style="color: #000000;">3050</span><br />
<span style="color: #666666; font-style: italic;"># запрещаем все остальное</span><br />
<span style="color: #800000;">${FwCMD}</span> <span style="color: #000000;">1000</span> add deny ip from any to any</div></div>
<p>Спасибо <a href="#comment-4618">bappoy</a>!</p>
</blockquote>
<p>--></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: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>ipfw.sh</div></div>
<p>Далее <noindex><a rel="nofollow" href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/faq/admin.html#REREAD-RC" >перегружаем rc.conf</a></noindex>.</p>
<p>На 88, 8001, 3050 я проксирую с помощью Nginx, поэтому доступа с внешки мне к ним не надо.<br />
На сегодняшний момент у меня отсутствует Apache, а с <a href="/2010/nginx-and-php-fpm/">PHP-FPM</a> я работаю через unix-сокет, поэтому закрывать порт не имеет смысла.</p>
<p>Еще рекомендую прочитать <a href="/2009/http-ddos-and-ipfw/">Боремся с HTTP-флудом средствами IPFW</a>.</p>
<h3>Закрываем DNS-рекурсию и меняем версию Bind</h3>
<p>Для <a href="/2009/freebsd-dns-bind9/">DNS-сервера Bind</a> меняем в named.conf атрибуты <strong>allow-recursion</strong> и <strong>version</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">// Relative to the chroot directory, if any<br />
directory &nbsp; &nbsp; &nbsp; &quot;/etc/namedb&quot;;<br />
pid-file &nbsp; &nbsp; &nbsp; &nbsp;&quot;/var/run/named/pid&quot;;<br />
dump-file &nbsp; &nbsp; &nbsp; &quot;/var/dump/named_dump.db&quot;;<br />
statistics-file &quot;/var/stats/named.stats&quot;;<br />
allow-recursion { localnets; localhost; };<br />
version &quot;SuperPuperDNS-9.8.7&quot;;</div></div>
<p>Вкратце <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/DNS#.D0.A0.D0.B5.D0.BA.D1.83.D1.80.D1.81.D0.B8.D1.8F" >DNS-рекурсия</a></noindex> это когда DNS сервер по запросу пользователя выполняет сам все запросы для поиска нужной информации во всей системе DNS. А нам лишнюю работу выполнять не хочется, поэтому мы отключаем рекурсию.</p>
<p>Проверить версию DNS-сервера Bind можно так:</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">dig @ns1.adw0rd.ru version.bind chaos txt</div></div>
<h3>Sendmail только для внутреннего использования</h3>
<p>Отредактируем <strong>/etc/rc.conf</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">sendmail_enable=&quot;NO&quot; #&quot;NO&quot; - for listen only 127.0.0.1</div></div>
<p>В общем то и все, это минимум, который вам поможет защититься от мелких атак и всяких скрипткидесов. Главное следите за обновлениями ПО, которое вы используете и все будет хорошо!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/first-measures-security-freebsd/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/first-measures-security-freebsd/</feedburner:origLink></item>
		<item>
		<title>Восстановление GRUB</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/PoETHbwRjCM/</link>
		<comments>http://adw0rd.ru/2010/grub-rescue/#comments</comments>
		<pubDate>Mon, 05 Apr 2010 20:54:01 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[GRUB]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5469</guid>
		<description><![CDATA[Удалось мне немного поломать граб, из-за того что я удалил перед ним стоящий раздел с NTFS, ибо Windows мне уже не нужен. Что и следовало ожидать&#160;&#8212; появилась проблема: error: unknown filesystem grub rescue > Решение Вводим команду ls и наблюдаем следующее: (hd0) (hd0,2) (hd0,3) (hd0,5) (hd0,6) А теперь set: prefix=(hd0,6)/boot/grub root=(hd0,6) Так как мы сместились [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/grub-rescue/"><img src="http://adw0rd.ru/wp-content/uploads/2010/02/ubuntulogomini.png"  alt="" title="ubuntu-logo" width="225" height="59" class="alignright size-full wp-image-5249" /></a></noindex></p>
<p>Удалось мне немного поломать граб, из-за того что я удалил перед ним стоящий раздел с NTFS, ибо Windows мне уже не нужен. Что и следовало ожидать&nbsp;&mdash; появилась проблема:</p>
<blockquote>
<p>
error: unknown filesystem<br />
grub rescue >
</p>
</blockquote>
<p><span id="more-5469"></span></p>
<h3>Решение</h3>
<p>Вводим команду <strong>ls</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">(hd0) (hd0,2) (hd0,3) (hd0,5) (hd0,6)</div></div>
<p>А теперь <strong>set</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">prefix=(hd0,6)/boot/grub<br />
root=(hd0,6)</div></div>
<p>Так как мы сместились на 1 раздел, то сетим на один меньше:</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">set prefix=(hd0,5)/boot/grub<br />
set root=(hd0,5)</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">ls /boot/grub<br />
insmod /boot/grub/linux.mod<br />
insmod /boot/grub/normal.mod</div></div>
<blockquote class="info">
<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">insmod normal</div></div>
</blockquote>
<p>Теперь вбиваем команду normal и попадаем в меню загрузки граба:</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">normal</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">sudo upgrade-from-grub-legacy</div></div>
<p>А вообще во всем этом мне помог <noindex><a rel="nofollow" href="https://help.ubuntu.com/community/Grub2" >https://help.ubuntu.com/community/Grub2</a></noindex> и особенно раздел &laquo;Rescue Mode&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/grub-rescue/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/grub-rescue/</feedburner:origLink></item>
		<item>
		<title>Ubuntu. Рабочее окружение Nginx+PHP5.3+FPM+MySQL</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/aAbP_FCbeHA/</link>
		<comments>http://adw0rd.ru/2010/ubuntu-php53/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 14:04:58 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php-fpm]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5325</guid>
		<description><![CDATA[Собирали с васяцом на выходных рабочее окружение на своих нетбуках и решили юзать PHP 5.3 и PHP-FPM. Для себя я решил ставить все наиболее простым способом, если это возможно, поэтому сначала прибегаю к apt-get, а потом уже к сборке из сорцов. Кстати, если у вас уже установлен какой-либо PHP, то предварительно удалите его (libapache2-mod-php5 в [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2010/ubuntu-php5/" ><img src="http://adw0rd.ru/wp-content/uploads/2010/03/ubuntu-dev2.png" alt="" title="ubuntu-dev2" width="153" height="140" class="alignright size-full wp-image-5417" style="padding: 0px 10px" /></a></p>
<p>Собирали с <a href="http://blgo.ru/" >васяцом</a> на выходных рабочее окружение на своих нетбуках и решили юзать PHP 5.3 и PHP-FPM. Для себя я решил ставить все наиболее простым способом, если это возможно, поэтому сначала прибегаю к apt-get, а потом уже к сборке из сорцов. Кстати, если у вас уже установлен какой-либо PHP, то предварительно удалите его (libapache2-mod-php5 в том числе, если он есть).</p>
<p>Вообще эта инструкция применительна и к <strong>FreeBSD</strong>, просто вместо &laquo;apt-get install&raquo; используйте <a href="/2009/freebsd-ports-and-pkg/">установку из портов</a>.</p>
<h3>Добавляем пользователя</h3>
<p>Для начала создадим пользователя и группу <strong>www</strong>, от которой будет работать <strong>Nginx</strong> и <strong>PHP</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">addgroup www<br />
adduser <span style="color: #660033;">--shell</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>nologin <span style="color: #660033;">--no-create-home</span> <span style="color: #660033;">--ingroup</span> www <span style="color: #660033;">--disabled-password</span> <span style="color: #660033;">--disabled-login</span> www</div></div>
<p><span id="more-5325"></span></p>
<h3>Ставим Nginx</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;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> nginx</div></div>
<p>Теперь отредактируем <strong>/etc/nginx/nginx.conf</strong> и добавим <strong>upstream</strong> для php-fpm:</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">user www www;<br />
worker_processes &nbsp;1;<br />
<br />
error_log &nbsp;/var/log/nginx/error.log;<br />
pid &nbsp; &nbsp; &nbsp; &nbsp;/var/run/nginx.pid;<br />
<br />
events {<br />
&nbsp; &nbsp; worker_connections &nbsp;1024;<br />
}<br />
<br />
http {<br />
&nbsp; &nbsp; include &nbsp; &nbsp; /etc/nginx/mime.types;<br />
&nbsp; &nbsp; access_log&nbsp; /var/log/nginx/access.log;<br />
<br />
&nbsp; &nbsp; sendfile &nbsp; &nbsp; &nbsp; &nbsp;on;<br />
&nbsp; &nbsp; keepalive_timeout &nbsp;65;<br />
&nbsp; &nbsp; tcp_nodelay &nbsp; &nbsp; &nbsp; &nbsp;on;<br />
<br />
&nbsp; &nbsp; upstream php-fpm {<br />
&nbsp; &nbsp; &nbsp; &nbsp; #server 127.0.0.1:9000;<br />
&nbsp; &nbsp; &nbsp; &nbsp; server unix:/tmp/php-fpm.sock;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; include /etc/nginx/conf.d/*.conf;<br />
}</div></div>
<p>Теперь приступим к установке PHP.</p>
<h3>Ставим PHP 5.3 + PHP-FPM</h3>
<p>Для того чтобы собрать <strong>php 5.3 + php-fpm</strong> нам потребуется слить сорцы <noindex><a rel="nofollow" href="http://php-fpm.org/download/" >php-fpm 5.3</a></noindex>, но для начала убедитесь что у вас версия <strong>autoconf</strong>&nbsp;&mdash; 2.13, говорят что с другой версией будут проблемы. Пробовал собирать с более высокой версией (autoconf 2.59, вроде)&nbsp;&mdash; правда, проблемы есть. Поэтому ставим именно 2.13:</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</span> <span style="color: #c20cb9; font-weight: bold;">install</span> autoconf2.13</div></div>
<p>Теперь надо поставить <strong>bison</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"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">bison</span></div></div>
<p>Далее <strong>libevent</strong> из сорцов. А именно версию 1.4.13 (установленная более ранняя версия не подходила).<br />
Во время установки libevent была проблема&nbsp;&mdash; не хватало <strong>libtoolize</strong>... Сначала поставим <strong>libtool</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"><span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libtool</div></div>
<p>А теперь libevent:</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> http:<span style="color: #000000; font-weight: bold;">//</span>www.monkey.org<span style="color: #000000; font-weight: bold;">/</span>~provos<span style="color: #000000; font-weight: bold;">/</span>libevent-1.4.13-stable.tar.gz<br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzvf</span> libevent-1.4.13-stable.tar.gz<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> libevent-1.4.13-stable<br />
.<span style="color: #000000; font-weight: bold;">/</span>autogen.sh<br />
.<span style="color: #000000; font-weight: bold;">/</span>configure<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p>Все версии libevent <noindex><a rel="nofollow" href="http://www.monkey.org/~provos/libevent/" >тут</a></noindex>.</p>
<p>И напоследок соберем libxml:</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: #c20cb9; font-weight: bold;">ftp</span>:<span style="color: #000000; font-weight: bold;">//</span>xmlsoft.org<span style="color: #000000; font-weight: bold;">/</span>libxml2<span style="color: #000000; font-weight: bold;">/</span>libxml2-2.7.6.tar.gz<br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzvf</span> libxml2-2.7.6.tar.gz<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> libxml2-2.7.6<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;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p>Вам может понадобится <strong>mysql_config</strong>, например для <strong>Sphinx</strong> или модуля <strong>MySQL</strong> для PHP, то поставьте libmysqld-dev:</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</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libmysqld-dev</div></div>
<p>А теперь наконец сольем <strong>php-fpm</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"><span style="color: #c20cb9; font-weight: bold;">svn</span> <span style="color: #c20cb9; font-weight: bold;">co</span> http:<span style="color: #000000; font-weight: bold;">//</span>svn.php.net<span style="color: #000000; font-weight: bold;">/</span>repository<span style="color: #000000; font-weight: bold;">/</span>php<span style="color: #000000; font-weight: bold;">/</span>php-src<span style="color: #000000; font-weight: bold;">/</span>branches<span style="color: #000000; font-weight: bold;">/</span>PHP_5_3_FPM php_5_3_fpm<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> php_5_3_fpm<br />
.<span style="color: #000000; font-weight: bold;">/</span>buildconf</div></div>
<p>Теперь у нас появился ./configure и мы можем указать с какими опциями собрать <strong>PHP</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">.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span> <span style="color: #660033;">--disable-short-tags</span> <span style="color: #660033;">--enable-fpm</span> <span style="color: #660033;">--with-layout</span>=GNU <span style="color: #660033;">--without-pear</span> \<br />
<span style="color: #660033;">--enable-mbstring</span> <span style="color: #660033;">--with-mysql</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mysql_config <span style="color: #660033;">--with-mysqli</span>=mysqlnd<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>некоторые опции по пыху можно вычитать <noindex><a rel="nofollow" href="http://www.php.net/manual/en/configure.about.php" >тут</a></noindex>, а по поводу расширений типа mysqli/mbstring и прочих можно почитать в разделе &laquo;Installation&raquo; официальной документации, например <noindex><a rel="nofollow" href="http://www.php.net/manual/en/mbstring.installation.php" >mbstring</a></noindex> или <noindex><a rel="nofollow" href="http://ru.php.net/manual/en/mysqli.installation.php" >mysqli</a></noindex>.</p>
<p>Многие <noindex><a rel="nofollow" href="http://www.php.net/manual/en/configure.about.php" >опции включены по умолчанию</a></noindex>, вы можете это поменять с помощью <strong>--disable-all</strong>.</p>
<p>Так как я ставил в кастомный каталог, то делаю ссылку на мой <strong>php</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"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php</div></div>
<p>Нам понадобится скрипт управления php-fpm, скопируем его из сорцов:</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;">cp</span> php_5_3_fpm<span style="color: #000000; font-weight: bold;">/</span>sapi<span style="color: #000000; font-weight: bold;">/</span>fpm<span style="color: #000000; font-weight: bold;">/</span>init.d.php-fpm <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>php-fpm<br />
<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>php-fpm</div></div>
<p>У меня стоял до этого PHP 5.2.10 (ставил из пакетов), поэтому у меня остался <strong>php.ini</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"><span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php5<span style="color: #000000; font-weight: bold;">/</span>apache2<span style="color: #000000; font-weight: bold;">/</span>php.ini <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php.ini</div></div>
<p>Если вы не знаете куда класть ваш php.ini, то зайдите в phpinfo и посмотрим пункт &laquo;Configuration File (php.ini) Path&raquo; и положите туда свой <strong>php.ini</strong>. В момент перезапуска PHP объявил некоторые опции как <strong>deprecated</strong> и я их закоментил просто-напросто. Если у вас нет файла php.ini, могу дать <a href="http://adw0rd.ru/files/ubuntu-php53/php.ini" >свой</a>, в нем нет ничего особенного, это на случай отсутствия у вас этого файла.</p>
<h3>Настройка PHP-FPM</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;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php-fpm.conf.default <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php-fpm.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">Address to accept fastcgi requests on.<br />
Valid syntax is 'ip.ad.re.ss:port' or just 'port' or '/path/to/unix/socket'<br />
&lt;!--&lt;value name=&quot;listen_address&quot;&gt;127.0.0.1:9000&lt;/value&gt;--&gt;<br />
&lt;value name=&quot;listen_address&quot;&gt;/tmp/php-fpm.sock&lt;/value&gt;<br />
....<br />
&lt;value name=&quot;listen_options&quot;&gt;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Set listen(2) backlog<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;value name=&quot;backlog&quot;&gt;-1&lt;/value&gt;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; Set permissions for unix socket, if one used.<br />
&nbsp; &nbsp; &nbsp; &nbsp; In Linux read/write permissions must be set in order to allow connections from web server.<br />
&nbsp; &nbsp; &nbsp; &nbsp; Many BSD-derrived systems allow connections regardless of permissions.<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;value name=&quot;owner&quot;&gt;www&lt;/value&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;value name=&quot;group&quot;&gt;www&lt;/value&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &lt;value name=&quot;mode&quot;&gt;0666&lt;/value&gt;<br />
&lt;/value&gt;<br />
...<br />
&lt;value name=&quot;php_defines&quot;&gt;<br />
&nbsp; &nbsp; &lt;!-- &lt;value name=&quot;sendmail_path&quot;&gt;/usr/sbin/sendmail -t -i&lt;/value&gt; --&gt;<br />
&nbsp; &nbsp; &lt;value name=&quot;display_errors&quot;&gt;1&lt;/value&gt; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &lt;value name=&quot;error_log&quot;&gt;/var/log/php-error.log&lt;/value&gt; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &lt;value name=&quot;log_errors&quot;&gt;true&lt;/value&gt;<br />
&lt;/value&gt;<br />
...<br />
Unix user of processes<br />
&lt;value name=&quot;user&quot;&gt;www&lt;/value&gt;<br />
<br />
Unix group of processes<br />
&lt;value name=&quot;group&quot;&gt;www&lt;/value&gt;<br />
...<br />
Comma separated list of ipv4 addresses of FastCGI clients that allowed to connect.<br />
Equivalent to FCGI_WEB_SERVER_ADDRS environment in original php.fcgi (5.2.2+)<br />
Makes sense only with AF_INET listening socket.<br />
&lt;value name=&quot;allowed_clients&quot;&gt;127.0.0.1&lt;/value&gt;</div></div>
<p>Вкратце что меняем:<br />
1. Используем не tcp, а unix-сокет<br />
2. Назначаем юзера и группу&nbsp;&mdash; www<br />
3. Делаем вывод ошибок в стандартный поток и указываем файл лога ошибок</p>
<p>Это конфиг я уже приводил <a href="/2010/nginx-and-php-fpm/#php-fpm_conf">тут</a>.</p>
<h3>Проблемы с MySQLi</h3>
<p><strong>MySQLi</strong> ругался что не может открыть mysql-сокет по адресу &laquo;/tmp/mysql.sock&raquo;, я отыскал путь до сокета в &laquo;/etc/my.cnf&raquo;, скопировал его и поправил в &laquo;/usr/local/etc/php.ini&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">mysqli.default_socket = /var/run/mysqld/mysqld.sock</div></div>
<h3>Запускаем наш сервер приложений</h3>
<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">server {<br />
&nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; server_name test.loc;<br />
&nbsp; &nbsp; root /www/test/htdocs;<br />
<br />
&nbsp; &nbsp; location / {<br />
&nbsp; &nbsp; &nbsp; &nbsp; index index.php;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location ~ \.php$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; include fastcgi_params;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass php-fpm;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br />
&nbsp; &nbsp; }<br />
}</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 mysql start<br />
service nginx start<br />
service php-fpm start</div></div>
<p>Как всегда все просто! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/ubuntu-php53/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/ubuntu-php53/</feedburner:origLink></item>
		<item>
		<title>MySQL. Остановка выполнения sql-запроса через триггер</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/HiirrvLHmNc/</link>
		<comments>http://adw0rd.ru/2010/mysql-stop-trigger/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 12:43:43 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Триггеры]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5203</guid>
		<description><![CDATA[Как приостановить выполнения SQL после триггера? То есть, при определенных условиях, описанных в триггере надо остановить выполнения SQL который и вызвал этот триггер. Я размышлял и гуглил на эту тему, но единственное что у меня получилось, это выполнять ошибочный SQL-код, тем самым останавливать выполнение SQL кода, который выполнится после триггера. Задача была такая, что у [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/mysql-stop-trigger/"><img src="http://adw0rd.ru/wp-content/uploads/2009/05/mysql-logo.png"  alt="" title="mysql-logo" width="150" height="76" class="alignright size-full wp-image-2595" /></a></noindex></p>
<p>Как приостановить выполнения SQL после триггера? То есть, при определенных условиях, описанных в триггере надо остановить выполнения SQL который и вызвал этот триггер.<br />
Я размышлял и гуглил на эту тему, но единственное что у меня получилось, это выполнять ошибочный SQL-код, тем самым останавливать выполнение SQL кода, который выполнится после триггера.</p>
<p>Задача была такая, что у кастомеров есть статусы, но если новый статус (который устанавливается) меньше чем текущий, то надо приостановить такой запрос.<br />
Городить проверки на стороне скриптового языка не хотелось, ибо это поведение должно быть глобальным, да и переписывать чудо-код доставшийся мне по наследству совсем не хотелось.</p>
<p>Ну это все слова, а теперь покажу реализацию:</p>
<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">delimiter <span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`customers_update_status`</span><span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> <span style="color: #ff0000;">`customers_update_status`</span> BEFORE <span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">`customers`</span> <span style="color: #993333; font-weight: bold;">FOR</span> EACH ROW BEGIN<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">IF</span> new<span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> <span style="color: #66cc66;">&lt;</span> old<span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> THEN<br />
&nbsp; &nbsp; &nbsp; &nbsp; BEGIN<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`customers`</span> <span style="color: #993333; font-weight: bold;">SET</span> old<span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;STOP_SQL_QUERY&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; END;<br />
&nbsp; &nbsp; END <span style="color: #993333; font-weight: bold;">IF</span>;<br />
END<span style="color: #66cc66;">//</span><br />
delimiter ;</div></div>
<p>Поле <strong>status</strong> имеет тип <strong>ENUM</strong> и у него нет значения <strong>STOP_SQL_QUERY</strong>, поэтому происходит ошибка и <strong>SQL</strong>-запрос идущий за триггером не выполняется. Это не корректное, но единственное найденное мной решение. Вообще, наверное еще лучше чтобы был не INSERT, а UPDATE. Тогда будет ошибка более корректна с виду.</p>
<p>зы. Кстати на <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html" >официальной страничке CREATE TRIGGER</a></noindex> в камментах приводится именно такой способ по остановке выполнения sql-запроса.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/mysql-stop-trigger/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/mysql-stop-trigger/</feedburner:origLink></item>
		<item>
		<title>Ставим Ubuntu Netbook Remix на Sony Vaio VPCW12Z1R</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/_sQfEkquGbc/</link>
		<comments>http://adw0rd.ru/2010/unr-vaio/#comments</comments>
		<pubDate>Sat, 27 Feb 2010 18:29:08 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Личка]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Vaio]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5205</guid>
		<description><![CDATA[В общем попросили меня описать процесс установки UNR на мой нетбук. Вообще тут все описано, но есть одна деталь, без знания которой я изрядно попарился. Дело в том, что при установке убунты, мой нетбук (да и мой лептоп тоже) впадали в черный экран и ничего не происходило. На лептопе дела были получше, там я хотя [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/unr-vaio/"><img src="http://adw0rd.ru/wp-content/uploads/2010/02/ubuntulogomini.png"  alt="" title="ubuntu-logo" width="225" height="59" class="alignright size-full wp-image-5249" style="padding:20px" /></a></noindex></p>
<p>В общем попросили меня описать процесс установки UNR на мой нетбук. Вообще <noindex><a rel="nofollow" href="https://help.ubuntu.com/community/Installation/FromUSBStick" >тут все описано</a></noindex>, но есть одна деталь, без знания которой я изрядно попарился. Дело в том, что при установке убунты, мой нетбук (да и мой лептоп тоже) <strong>впадали в черный экран</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">... can not mount /dev/loop1 on /cow ...</div></div>
<p>Погуглив я наткнулся на тему <noindex><a rel="nofollow" href="http://ubuntuforums.org/showthread.php?t=1306277" >Install gives sorta blank screen on netbook</a></noindex> и конкретно 9-й пост мне помог решить проблему с черным экраном. Ну теперь я все расскажу по порядку...<br />
<span id="more-5205"></span></p>
<h3>Сборка usb-образа</h3>
<p>Так как в комплекте шла <strong>Windows 7 Starter</strong>, то создание загрузочного usb и прочие приготовления будут происходить под этой ОС. А после переместимся уже в <strong>UNR</strong> и доустановим убунту.</p>
<blockquote class="info">
<p>
Если вам надо забэкапиться или отредактировать разделы, то могу посетовать &laquo;Hiren&#39;s Boot CD&raquo;, но так как у нас не CD, а USB, то читаем как <noindex><a rel="nofollow" href="http://www.hiren.info/pages/bootcd-on-usb-disk" >сделать usb-версию</a></noindex>. А свеженький дистрибутив можете взять тут <noindex><a rel="nofollow" href="http://www.hirensbootcd.net/" >http://www.hirensbootcd.net/</a></noindex>.
</p>
</blockquote>
<p>Заходим на сайт <noindex><a rel="nofollow" href="http://www.ubuntu.com/GetUbuntu/download-netbook" >http://www.ubuntu.com/GetUbuntu/download-netbook</a></noindex> и качаем <strong>ubuntu-9.10-netbook-remix-i386.iso</strong>, после этого открываем любым архиватором iso-файл (я использовал 7zip) и распаковываем оттуда программку &laquo;usb-creator.exe&raquo;.</p>
<p>Размер флэшки должен быть не меньше 700 МБ и должна быть предварительно отформатирована.</p>
<p>Запускаем <strong>usb-creator</strong>, в первой плашке жмем на &laquo;Other&raquo; [1] и подгружаем наш iso-образ, во второй плашке выбираем носитель [2], далее выбираем &laquo;discarded on shutdown, unlessyou save them elsewhere&raquo; [3] и жмем &laquo;Make startup disk&raquo; [4].</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/02/usb-creator.jpg" alt="" title="usb-creator" width="376" height="426" class="alignnone size-full wp-image-5258" /></p>
<p>Все, образ создан, приступим к установке!</p>
<h3>Установка</h3>
<p>Вставляем нашу флешку в usb, перегружаем ноутбук, заходим в BIOS (при загрузке&nbsp;&mdash; F2) и выбираем &laquo;загрузка с flash drive&raquo;. Сохраняем настройки и выходим из BIOSа.</p>
<p>Теперь, если все хорошо вы увидите загрузочное меню убунты. Можете ее запустить с флешки, либо приступить к установке, либо еще несколько опций: проверка целостности дистрибутива, памяти компьютера и т.д.</p>
<p>Выбираете соответствующий пункт и переходим к установке. Там вам понадобится создать свой аккаунт. указать свое местоположение и локаль, думаю с этим справитесь. В конце установки вас попросят выделить место на жестком диске для вашей убунты (Prepare disk space), этот шаг тоже достаточно прост и убунта корректно выделит на жестком диске тот кусок памяти, который вы укажите. Я выделил 50 Гб.</p>
<blockquote class="info">
<p>Можно также воспользоваться утилитами с <strong>Hiren&#39;s Boot CD</strong> для разметки жесткого диска.</p>
</blockquote>
<p>На этом установка закончится. Кстати, после перезагрузки <strong>grub</strong> удачно подцепил раздел с Windows 7, что несомненно радует, такого от FreeBSD я не смог добиться.</p>
<h3>Запуск</h3>
<p>Себе я ставил чисто английскую версию, и только добавил раскладку русскую после установки, поэтому интерфейс у меня выглядит так:</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/02/fav.jpg" alt="" title="my unr" width="683" height="384" class="alignnone size-full wp-image-5266" /></p>
<p>Вот еще один скриншот, Firefox:</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/02/ff.jpg" alt="" title="firefox" width="683" height="384" class="alignnone size-full wp-image-5277" /></p>
<p>После установки рекомендую обновить систему и ядро в частности, для этого запустите утилиту &laquo;System > Update Manager&raquo; (Когда зайдете во вкладку System прокрутите скрол вниз).</p>
<p>Вроде как и все. Особых проблем кроме записи usb-образа не было.</p>
<h3>Ощущения</h3>
<p>Вообще мне почти все понравилось! Все устройства заработали нормально. А интерфейс больше всего радует, как раз для нетбуков. Но мне не понравилось например как он переходит в спящий/ждущий режимы (hibernate/suspend), это как-то криво: просто все зависает и через какое-то время переходит в соответствующий режим. А до этого сидишь как дурак и вдупляешь что случилось. Могли бы хоть делать черный фон и писать что осуществляется переход, а еще лучше каждое состояние перехода.</p>
<p>И еще заметил баг: ноутбук заряжался, и зарядился полностью, после чего я его погрузил в спящий режим и вынул шнур питания. Позже я его включил без сети и поработал на нем 4 часа, но убунта мне все это время говорила что батарея полностью заряжена. Но я как-то ей не поверил... либо у меня супер-ноутбук питающийся биотоками ;)</p>
<p>зы. Ощущения от UNR Сергея Можайского&nbsp;&mdash; <noindex><a rel="nofollow" href="http://frenzytechnix.livejournal.com/22541.html" >Нетбук, Ubuntu Netbook Remix и мой линукс-экспириенс</a></noindex> (автор любимого мной freebsd-дистрибутива <noindex><a rel="nofollow" href="http://frenzy.org.ua/" >frenzy</a></noindex>)</p>
<p>upd: Если у вас глючит интерфейс скайпа, то есть у него в контексном меню один цвет как у фона, так и у текста. То вам надо зайти в &laquo;Skype > Options&raquo; и в &laquo;Choose style&raquo; выбрать &laquo;GTK+&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/unr-vaio/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/unr-vaio/</feedburner:origLink></item>
		<item>
		<title>Прикупил себе мини-ноутбук Vaio</title>
		<link>http://feedproxy.google.com/~r/adw0rd/~3/5_KPKvXww5k/</link>
		<comments>http://adw0rd.ru/2010/mini-vaio/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 22:56:15 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Личка]]></category>
		<category><![CDATA[Vaio]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5201</guid>
		<description><![CDATA[Купил себе Sony VAIO VPC-W12Z1R, заказывал &#171;белый&#187; (w), а продали &#171;белоснежный&#187; (wz). Но мне понравился больше белоснежный, поэтому я даже не спросил почему такая фигня. Покупал в смартшопе, на 6 тысяч дешевле ($200) чем в кее, проблем с покупкой не было&#160;&#8212; вообщем магазин рекомендую. Что касается самого нетбука, то он по словам сони на самом [...]]]></description>
			<content:encoded><![CDATA[<p>Купил себе <noindex><a rel="nofollow" href="http://market.yandex.ru/model.xml?hid=91013&#038;modelid=5145816" >Sony VAIO VPC-W12Z1R</a></noindex>, заказывал &laquo;белый&raquo; (w), а продали &laquo;белоснежный&raquo; (wz). Но мне понравился больше белоснежный, поэтому я даже не спросил почему такая фигня. Покупал в <noindex><a rel="nofollow" href="http://www.smartshop.spb.ru/sony-vaio-vpcw12z1rw-n280-white-p-14733.html" >смартшопе</a></noindex>, <strong>на 6 тысяч дешевле</strong> ($200) чем в <noindex><a rel="nofollow" href="http://shop.key.ru/shop/goods/28964/" >кее</a></noindex>, проблем с покупкой не было&nbsp;&mdash; вообщем магазин рекомендую.</p>
<p>Что касается самого нетбука, то он по словам сони на самом деле не нетбук, а мини-ноутбук. Типа нет у них нетбуков и не будет. На самом деле это очень качественный, стильный и дорогой нетбук :)</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/02/17022010631_1.jpg" alt="" title="фронт" width="405" height="540" class="alignnone size-full wp-image-5211" /></p>
<p>Программировать на нем не особо удобно, но думаю привыкну.<br />
Зато писать в бложик, сидеть в консоле и читать интернеты&nbsp;&mdash; самое то.<br />
<span id="more-5201"></span><br />
<img src="http://adw0rd.ru/wp-content/uploads/2010/02/17022010636_1.jpg" alt="" title="бэк" width="614" height="500" class="alignnone size-full wp-image-5212" /></p>
<p>Еще в комплекте шли чехол и мышь от вайо!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/mini-vaio/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		<feedburner:origLink>http://adw0rd.ru/2010/mini-vaio/</feedburner:origLink></item>
	</channel>
</rss>
