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

<channel>
	<title>Мастерская интернет-разработчика &#187; Программирование</title>
	<atom:link href="http://adw0rd.ru/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://adw0rd.ru</link>
	<description>Блог Михаила Андреева (aka adw0rd)</description>
	<lastBuildDate>Wed, 18 Jan 2012 13:52:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Доступ к Wikipedia на время действия экрана SOPA</title>
		<link>http://adw0rd.ru/2012/wikipedia-sopa/</link>
		<comments>http://adw0rd.ru/2012/wikipedia-sopa/#comments</comments>
		<pubDate>Wed, 18 Jan 2012 13:43:32 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[SOPA]]></category>
		<category><![CDATA[Wiki]]></category>
		<category><![CDATA[Wikipedia]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6547</guid>
		<description><![CDATA[По просьбе моего друга решил запостить этот пост, вдруг кому пригодится! Википедия сегодня, 18 Января 2011 года, протестует против SOPA и закрыла доступ к контенту. Но при желании можно все равно этот контент посмотреть. Википедия никуда не убрала контент, она просто добавила на каждую страничку новый div, который и содержит слой с информацией про протест [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/wp-content/uploads/2012/01/WP_SOPA_Splash_Full.jpg" ><img src="http://adw0rd.ru/wp-content/uploads/2012/01/WP_SOPA_Splash_Full-150x150.jpg" alt="" title="WP_SOPA_Splash_Full" width="150" height="150" class="alignright size-thumbnail wp-image-6548" /></a></p>
<p>По просьбе моего друга решил запостить этот пост, вдруг кому пригодится!</p>
<blockquote>
<p>
Википедия сегодня, 18 Января 2011 года, протестует против SOPA и закрыла доступ к контенту.</p>
<p>Но при желании можно все равно этот контент посмотреть. Википедия никуда не убрала контент, она просто добавила на каждую страничку новый div, который и содержит слой с информацией про протест против SOPA. А также добавила стиль display=none к слоям с контентом.</p>
<p>Все это дело легко отключается следующим скриптом (я написал его за 1-2 минуты), который выполняется из консоли Chrome или Firefox:</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> jq <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
jq.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js&quot;</span><span style="color: #339933;">;</span><br />
document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'head'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>jq<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#mw-sopaOverlay'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#content'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Все элементарно: первые три строчки подключают jquery, 4-я строчка удаляет слой SOPA, 5-я строчка показывает слой с контентом.</p>
<p>Можно этот скрипт повесить на Greaemonkey, и тогда автоматически вся википедия будет нормально показываться, как и прежде.</p>
<p>И да, я поддерживаю их протест против SOPA. Просто иногда нужно срочно получить информацию, даже если она скрыта.
</p>
</blockquote>
<p>Автор: Ivan, 18 января 2012 16:18.<br />
Оригинал: <noindex><a rel="nofollow" href="http://jdevnotes.blogspot.com/2012/01/wikipedia-sopa.html" >http://jdevnotes.blogspot.com/2012/01/wikipedia-sopa.html</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2012/wikipedia-sopa/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Андрей Аксенов: “Как готовить Sphinx” / мастер-класс, Киев, 18-ое июня</title>
		<link>http://adw0rd.ru/2011/sphinx-master-class/</link>
		<comments>http://adw0rd.ru/2011/sphinx-master-class/#comments</comments>
		<pubDate>Wed, 01 Jun 2011 19:28:24 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Конференции]]></category>
		<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Sphinx]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=6322</guid>
		<description><![CDATA[В субботу, 18-го июня в Киеве пройдет мастер-класс создателя движка полнотекстового поиска Sphinx Андрея Аксенова ”Как готовить Sphinx”. Мастер-класс будет интересен разработчикам, руководителям и владельцам проектов, которые сталкиваются с проблемой поиска при высоких нагрузках. Sphinx используют такие монстры, как CraigsList, DailyMotion, Meetup, HupPages, HabraHabr и еще десятки высоконагруженных сайтов такие как Кинсбург. Андрей Аксенов выступал [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2011/sphinx-master-class/" ><img src="http://adw0rd.ru/wp-content/uploads/2011/06/axenov.jpg" alt="" title="axenov" width="100" height="112" class="alignright size-full wp-image-6323" /></a><br />
<strong>В субботу, 18-го июня в Киеве</strong> пройдет мастер-класс создателя движка полнотекстового поиска Sphinx Андрея Аксенова ”Как готовить Sphinx”.</p>
<p>Мастер-класс будет интересен разработчикам, руководителям и владельцам проектов, которые сталкиваются с проблемой поиска при высоких нагрузках.</p>
<p>Sphinx используют такие монстры, как <strong>CraigsList</strong>, <strong>DailyMotion</strong>, <strong>Meetup</strong>, <strong>HupPages</strong>, <strong>HabraHabr</strong> и еще десятки высоконагруженных сайтов такие как <noindex><a rel="nofollow" href="http://kinsburg.ru/" >Кинсбург</a></noindex>. Андрей Аксенов  выступал на многочисленных конференциях в России: <strong>“DevPoint 1-2″, “РИТ”, “DevConf 2011″, “HighLoad ++”</strong>. Организатор конференции пользователей Sphinx в Москве. Автор нашумевшего доклада “Как прекратить писать”.</p>
<p>Дополнительная информация и подробный план мастер-класса можно посмотреть на сайте <noindex><a rel="nofollow" href=" http://www.smartme.com.ua/sphinx-workshop/" >http://www.smartme.com.ua/sphinx-workshop/</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2011/sphinx-master-class/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>FreeBSD. XHProf для анализа производительности PHP</title>
		<link>http://adw0rd.ru/2010/freebsd-xhprof-php/</link>
		<comments>http://adw0rd.ru/2010/freebsd-xhprof-php/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 23:00:20 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XHProf]]></category>
		<category><![CDATA[Оптимизация]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5510</guid>
		<description><![CDATA[Решил я воспользоваться утилитой для профилирования производительности веб-приложения XHProf от Facebook. И она мне так понравилась, что я решил написать про неё небольшой пост. Утилита проводит анализ работы сайта, выводит информацию о использование каждой функции на пути работы приложения (например, загрузки определенной страницы сайта), а именно: количество вызовов определенной функции, затраченное время, кол-во потребляемой памяти [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/wp-content/uploads/2010/04/xhprof.jpg" ><img src="http://adw0rd.ru/wp-content/uploads/2010/04/xhprof.jpg" alt="" title="xhprof" width="199" height="100" class="alignright size-full wp-image-5526" /></a></p>
<p>Решил я воспользоваться утилитой для профилирования производительности веб-приложения <strong>XHProf</strong> от Facebook. И она мне так понравилась, что я решил написать про неё небольшой пост.</p>
<p>Утилита проводит анализ работы сайта, выводит информацию о использование каждой функции на пути работы приложения (например, загрузки определенной страницы сайта), а именно: количество вызовов определенной функции, затраченное время, кол-во потребляемой памяти и ресурсов процессора.</p>
<blockquote>
<p>
<strong>Профилирование</strong> — сбор характеристик работы программы, таких как время выполнения отдельных фрагментов (обычно подпрограмм), число верно предсказанных условных переходов, число кэш промахов и т. д. Инструмент, используемый для анализа работы, называют профилировщиком. Обычно выполняется совместно с оптимизацией программы.</p>
<p><noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29" >Профилирование в Wikipedia</a></noindex>
</p>
</blockquote>
<p><span id="more-5510"></span></p>
<p>Данные выводятся в виде таблицы:</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/05/xhprof_table.jpg" alt="" title="xhprof_table" width="809" height="407" class="alignnone size-full wp-image-6186" style="border:dotted 2px gray;padding:10px;" /></p>
<p>Так же она может отрисовать граф с помощью <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/Graphviz" >GraphViz</a></noindex>, но для этого он должен быть предварительно собран в системе (об этом ниже):</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2010/05/xhprof_callgraph.jpg" alt="" title="xhprof_callgraph" width="223" height="528" class="alignnone size-full wp-image-6187" style="border:dotted 2px gray;padding:10px;" /></p>
<p><strong>XHProf</strong> представляет собой pecl-расширение для PHP, написана она на си, поэтому достигается высокая с ее стороны производительность и ее можно использовать на продакшен сервере для анализа реальных данных.</p>
<h3>Установка</h3>
<p>Я собирал расширение из сорцов, для этого заходим на <noindex><a rel="nofollow" href="http://pecl.php.net/package/xhprof" >страницу расширения</a></noindex> и качаем необходимую нам версию, у меня это <noindex><a rel="nofollow" href="http://pecl.php.net/get/xhprof-0.9.2.tgz" >xhprof-0.9.2</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 />
fetch http:<span style="color: #000000; font-weight: bold;">//</span>pecl.php.net<span style="color: #000000; font-weight: bold;">/</span>get<span style="color: #000000; font-weight: bold;">/</span>xhprof-0.9.2.tgz<br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xzf</span> xhprof-0.9.2.tgz<br />
<span style="color: #7a0874; font-weight: bold;">cd</span> xhprof-0.9.2<span style="color: #000000; font-weight: bold;">/</span>extension<span style="color: #000000; font-weight: bold;">/</span><br />
phpize<br />
.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--with-php-config</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-config<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>Пропишите расширение в php.ini или в php/extensions.ini:</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">extension=xhprof.so</div></div>
<blockquote>
<p>
Вы можете поставить расширение <strong>XHProf</strong> из портов (/usr/ports/devel/pecl-xhprof/).<br />
В мае, когда я практически написал эту статью, его ещё там небыло.
</p>
</blockquote>
<p>Укажите в php.ini каталог, который будет играть роль хранилища ваших данных:</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">[xhprof] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
xhprof.output_dir=/usr/local/xhprof/out</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">mkdir -p /usr/local/xhprof/out</div></div>
<h4>XHProf UI</h4>
<p>Теперь настроим веб-интерфейс <strong>XHProf</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;">mkdir</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>xhprof<span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-R</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>xhprof-0.9.2<span style="color: #000000; font-weight: bold;">/</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>xhprof<span style="color: #000000; font-weight: bold;">/</span></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">server <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; listen <span style="color: #000000;">80</span>;<br />
&nbsp; &nbsp; server_name xhprof.test;<br />
&nbsp; &nbsp; charset utf8;<br />
&nbsp; &nbsp; root <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>xhprof<span style="color: #000000; font-weight: bold;">/</span>xhprof_html;<br />
&nbsp; &nbsp; index index.php;<br />
<br />
&nbsp; &nbsp; location ~ \.php$ <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_pass php-fpm;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_index index.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; fastcgi_param SCRIPT_FILENAME <span style="color: #007800;">$document_root</span><span style="color: #007800;">$fastcgi_script_name</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; include fastcgi_params;<br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span></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">nginx <span style="color: #660033;">-s</span> reload</div></div>
<p>А в локальном файле hosts завяжем домен:</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">123.45.67.89 xhprof.test</div></div>
<p>Где &laquo;123.45.67.89&raquo;&nbsp;&mdash; ip машины на которой стоит <strong>XHProf</strong>, то есть где мы его только что устанавливали.</p>
<h4>Собираем Graphviz</h4>
<p>Для построение визуализации соберем Graphviz (крайне рекомендую это сделать, будет намного нагляднее).</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>graphics<span style="color: #000000; font-weight: bold;">/</span>graphviz<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<h4>Собираем Ctype</h4>
<p>Вам так же может понадобится Ctype</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>textproc<span style="color: #000000; font-weight: bold;">/</span>php5-ctype<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<h3>Настройка</h3>
<p>Теперь настроим <strong>XHProf</strong> так, чтобы он профилировал только когда у нас установлена специальная кука. Для это создадим два файла &laquo;/usr/local/xhprof/header.php&raquo; и &laquo;/usr/local/xhprof/footer.php&raquo;, со следующим содержимым:</p>
<p>1. Отредактируйте &laquo;/usr/local/xhprof/header.php&raquo;:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'xhprof'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">extension_loaded</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xhprof'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$utils_path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/usr/local/xhprof/xhprof_lib/utils/&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">include_once</span> <span style="color: #000088;">$utils_path</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'xhprof_lib.php'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">include_once</span> <span style="color: #000088;">$utils_path</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'xhprof_runs.php'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; xhprof_enable<span style="color: #009900;">&#40;</span>XHPROF_FLAGS_CPU <span style="color: #339933;">+</span> XHPROF_FLAGS_MEMORY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Он срабатывает только если установлена кука &laquo;xhprof&raquo;, подключает необходимые библиотеки и устанавливает необходимые флаги (об этом чуть ниже).</p>
<p>2. Отредактируйте &laquo;/usr/local/xhprof/footer.php&raquo;:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_COOKIE</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'xhprof'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">extension_loaded</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'xhprof'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$profiler_namespace</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'myapp'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// namespace for your application</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$xhprof_data</span> <span style="color: #339933;">=</span> xhprof_disable<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$xhprof_runs</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XHProfRuns_Default<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$run_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$xhprof_runs</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save_run</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$xhprof_data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$profiler_namespace</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// url to the XHProf UI libraries (change the host name and path)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$profiler_url</span> <span style="color: #339933;">=</span> <span style="color: #990000;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://xhprof.test/index.php?run=%s&amp;source=%s'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$run_id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$profiler_namespace</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;a href=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$profiler_url</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;Profiler output&lt;/a&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Он срабатывает только если установлена кука &laquo;xhprof&raquo;, устанавливает неймспейс и сохраняет собранные показатели. После чего отрисовывает ссылку на веб-интерфейс <strong>XHProf</strong> для последующего анализа.</p>
<p>Теперь добавим в конец две строки в php.ini, для того чтобы эти два скрипта стартовали в начале и конце соответственно:</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">auto_prepend_file = /usr/local/xhprof/header.php<br />
auto_append_file = /usr/local/xhprof/footer.php</div></div>
<p>Более подробная документация по <strong>XHProf</strong>: <noindex><a rel="nofollow" href="http://mirror.facebook.net/facebook/xhprof/doc.html" >http://mirror.facebook.net/facebook/xhprof/doc.html</a></noindex></p>
<h3>Проблема с dot</h3>
<p>Утилита dot это тот самый Graphviz и с ним бывает проблема, что-то типа того:</p>
<blockquote>
<p>Error: either we can not find profile data for run_id 4ced888563969 or the threshold 0.01 is too small or you do not have &#39;dot&#39; image generation utility installed.</p>
</blockquote>
<p>Сначала зайдите в &laquo;/usr/local/xhprof/xhprof_lib/utils/callgraph_utils.php&raquo; и найдите функцию &laquo;xhprof_generate_image_by_dot&raquo; (примерно 96 строка). Отредактируйте массив $descriptorspec, указав путь до файла лога:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #000088;">$descriptorspec</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// stdin is a pipe that the child will read from</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">0</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// stdout is a pipe that the child will write to</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">1</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;pipe&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// stderr is a file to write to</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">//2 =&gt; array(&quot;file&quot;, &quot;/dev/null&quot;, &quot;a&quot;)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// Путь до файла лога</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">2</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;file&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;/var/log/xhprof.log&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;a+&quot;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Ну и теперь запускайте и смотрите лог, если у вас там:</p>
<blockquote>
<p>
dot: not found
</p>
</blockquote>
<p>То просто укажите полный путь до dot:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$cmd</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot; /usr/local/bin/dot -T&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$type</span><span style="color: #339933;">;</span></div></div>
<p>Это примерно 107 строка того же файла &laquo;/usr/local/xhprof/xhprof_lib/utils/callgraph_utils.php&raquo;.</p>
<h3>Ссылки</h3>
<p>Посты, от которых я узнал о <strong>XHProf</strong>:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://highload.com.ua/index.php/2009/08/21/xhprof-%D0%BF%D1%80%D0%BE%D1%84%D0%B8%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-php-%D0%BE%D1%82-facebook/" >XHprof&nbsp;&mdash; профилирование PHP от Facebook</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/php/78210/" >Профилирование PHP-кода</a></noindex></li>
</ul>
<p>Советую почитать:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://tigor.com.ua/blog/2009/12/13/profiling-php-with-xhprof/" >XHprof – профайлер PHP от Facebook</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://mirror.facebook.net/facebook/xhprof/doc.html" >XHProf Documentation</a></noindex></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/freebsd-xhprof-php/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Django. Первое приложение</title>
		<link>http://adw0rd.ru/2010/django-first-app/</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 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> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> 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: #66cc66;">=</span> <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: #66cc66;">=</span> <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: #66cc66;">=</span> <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: #66cc66;">=</span> <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: #66cc66;">=</span> <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: #66cc66;">=</span> <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: #66cc66;">=</span> <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: #66cc66;">=</span> <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: #66cc66;">=</span> <span style="color: #483d8b;">'/admin-media/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Путь до каталога с шаблонами</span><br />
TEMPLATE_DIRS <span style="color: #66cc66;">=</span> <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">&quot;/www/myproject/blog/templates&quot;</span><span style="color: #66cc66;">,</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: #66cc66;">=</span> <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.auth'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.contenttypes'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.sessions'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.sites'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.admin'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'myproject.blog'</span><span style="color: #66cc66;">,</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;">'''<br />
Blog posts<br />
'''</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 <span style="color: #66cc66;">=</span> models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length<span style="color: #66cc66;">=</span><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 <span style="color: #66cc66;">=</span> models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># функция необходима для того, чтобы при выводе объекта Post</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># как строки выводился вместо этого его title</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__unicode__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">title</span><span style="color: #66cc66;">;</span><br />
<br />
<span style="color: #483d8b;">'''<br />
Класс для админки, тут будут дополнительные атрибуты необходимые для админки<br />
'''</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: #66cc66;">=</span> <span style="color: black;">&#40;</span><span style="color: #483d8b;">'title'</span><span style="color: #66cc66;">,</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<span style="color: #66cc66;">,</span> PostAdmin<span style="color: black;">&#41;</span></div></div>
<blockquote class="info">
<p>Вы можете все что связано с админкой вынести в <strong>admins.py</strong> и импортировать его, чтобы избавится от лишнего кода</p>
</blockquote>
<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> *<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<span style="color: #66cc66;">,</span> 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 <span style="color: #66cc66;">=</span> patterns<span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: #66cc66;">,</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><span style="color: #66cc66;">,</span> main_page<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</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><span style="color: #66cc66;">,</span> get_post<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</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><span style="color: #66cc66;">,</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><span style="color: #66cc66;">,</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 <span style="color: #66cc66;">=</span> 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: #66cc66;">,</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<span style="color: #66cc66;">,</span> 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 <span style="color: #66cc66;">=</span> Post.<span style="color: black;">objects</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span>pk<span style="color: #66cc66;">=</span>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: #66cc66;">,</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: #66cc66;">,</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>
		</item>
		<item>
		<title>Установка node.js на FreeBSD и использование под Nginx</title>
		<link>http://adw0rd.ru/2010/nodejs-freebsd/</link>
		<comments>http://adw0rd.ru/2010/nodejs-freebsd/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 14:55:17 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4980</guid>
		<description><![CDATA[Случайно нашел сайт nodejs.ru, полистал и добавил в ридер. Давно хотел попробовать node.js, но именно этот сайт стал той самой последней каплей в чаше желания и я решил незамедлительно попробовать node.js в действии. Установка Заходим на оф. сайт node.js и копируем ссылку на архив с сорцами. # cd /tmp # fetch http://s3.amazonaws.com/four.livejournal/20100120/node-v0.1.26.tar.gz # tar -xzvf [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2010/nodejs-freebsd/nodejs/"  rel="attachment wp-att-4988"><img src="http://adw0rd.ru/wp-content/uploads/2010/02/nodejs.jpg" alt="" title="nodejs" width="239" height="81" class="alignright size-full wp-image-4988" /></a></p>
<p>Случайно нашел сайт <noindex><a rel="nofollow" href="http://nodejs.ru" >nodejs.ru</a></noindex>, полистал и добавил в ридер. Давно хотел попробовать node.js, но именно этот сайт стал той самой последней каплей в чаше желания и я решил незамедлительно попробовать node.js в действии.</p>
<h3>Установка</h3>
<p>Заходим на оф. сайт <noindex><a rel="nofollow" href="http://nodejs.org/" >node.js</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: #666666; font-style: italic;"># cd /tmp</span><br />
<span style="color: #666666; font-style: italic;"># fetch http://s3.amazonaws.com/four.livejournal/20100120/node-v0.1.26.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># tar -xzvf node-v0.1.26.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># cd node-v0.1.26 </span><br />
<span style="color: #666666; font-style: italic;"># ./configure --prefix=/usr/local</span><br />
<span style="color: #666666; font-style: italic;"># make &amp;&amp; make install</span><br />
<span style="color: #666666; font-style: italic;"># rehash</span></div></div>
<p>Если у вас не установлен <strong>libexecinfo</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;"># cd /usr/ports/devel/libexecinfo</span><br />
<span style="color: #666666; font-style: italic;"># make install</span></div></div>
<h3>Использование</h3>
<p>Потестим для начала сам node, для этого создайте файлик example.js со следующим содержимым:</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">var</span> sys <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'sys'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
sys.<span style="color: #660066;">puts</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello, people!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</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: #666666;"># </span>node example.js</div></div>
<p>Если нет ошибок, то можете продолжить и завязать node с nginx. А если есть ошибки&nbsp;&mdash; пишите в комментарии, помогу.<br />
<span id="more-4980"></span></p>
<h3>Использование с Nginx</h3>
<p>Думаю у вас уже стоит Nginx, поэтому привожу сразу конфиг для нашего node.js хоста.<br />
А если Nginx у вас НЕ установлен/настроен, то <a href="/tag/nginx/">вам сюда</a>.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">...<br />
location /nodejs/ {<br />
&nbsp; &nbsp; proxy_pass http://127.0.0.1:8081/;<br />
&nbsp; &nbsp; proxy_redirect off;<br />
&nbsp; &nbsp; proxy_set_header Host $host;<br />
&nbsp; &nbsp; proxy_set_header X-Real-IP $remote_addr;<br />
&nbsp; &nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
}<br />
...</div></div>
<p>Далее, создадим скрипт server.js со следующим содержимым:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var sys = require('sys');<br />
var http = require('http');<br />
<br />
http.createServer(function (req, res) {<br />
&nbsp; &nbsp; res.sendHeader(200, {'Content-Type': 'text/plain'});<br />
&nbsp; &nbsp; res.sendBody('Hello, people!', 'utf8');<br />
&nbsp; &nbsp; res.finish();<br />
}).listen(8081);<br />
<br />
sys.puts('Server running at port 8081');</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;"># node server.js</span><br />
<span style="color: #666666; font-style: italic;"># /usr/local/etc/rc.d/nginx restart</span></div></div>
<p>Если вы запустите с ключом --debug, то вам станет доступен дебагер на tcp-порту 5858</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;">#</span>node <span style="color: #660033;">--debug</span> server.js</div></div>
<p>Заходим на http://localhost:8081/ и наблюдаем за результатом!</p>
<h3>Резюме</h3>
<p>Это вступительная статья, в ней ничего нет сложного. но чтобы опробовать node.js тут достаточно информации.<br />
То, с чем я советую ознакомиться:</p>
<ul>
<li>Посмотрите реализацию серверного компонента <noindex><a rel="nofollow" href="http://chat.nodejs.org/" >чата</a></noindex> на node.js <noindex><a rel="nofollow" href="http://github.com/ry/node_chat/blob/master/server.js" >http://github.com/ry/node_chat/blob/master/server.js</a></noindex></li>
<li>Можно еще посмотреть бенчмарки <noindex><a rel="nofollow" href="http://four.livejournal.com/1019177.html" >http://four.livejournal.com/1019177.html</a></noindex></li>
<li>И почитать интересную статью <noindex><a rel="nofollow" href="http://habrahabr.ru/blogs/nginx/82511/" >Nginx + серверный Javascript</a></noindex></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/nodejs-freebsd/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Легкая замена стандартного поиска в SMF на Sphinx</title>
		<link>http://adw0rd.ru/2009/smf-sphinx/</link>
		<comments>http://adw0rd.ru/2009/smf-sphinx/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 12:32:13 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Pyha]]></category>
		<category><![CDATA[SMF]]></category>
		<category><![CDATA[Sphinx]]></category>
		<category><![CDATA[Поисковые системы]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4040</guid>
		<description><![CDATA[Потребовалась замена на ПыхоФоруме стандартного поиска на Sphinx, а также сделать нормальный поиск по пользователям. Для этого потребовалось установить Sphinx и движок для MySQL&#160;&#8212; SphinxSE. Подготавливаем индекс Пишем Sphinx-source: source pyha_forum { &#160; &#160; type = mysql &#160; &#160; sql_host = localhost &#160; &#160; sql_user = pyha &#160; &#160; sql_pass = &#160; &#160; sql_db = [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/smf-sphinx/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/07/smf_sphinx.png" alt="smf_sphinx" title="smf_sphinx" width="274" height="120" class="alignright size-full wp-image-4059" /></a></p>
<p>Потребовалась замена на <a href="http://pyha.ru/forum/" >ПыхоФоруме</a> стандартного поиска на <a href="/tag/sphinx/">Sphinx</a>, а также сделать нормальный поиск по пользователям. Для этого потребовалось <a href="/2009/sphinxsearch/">установить Sphinx</a> и <a href="/2009/mysql-sphinxse/">движок для MySQL&nbsp;&mdash; SphinxSE</a>.</p>
<h3>Подготавливаем индекс</h3>
<p>Пишем Sphinx-source:</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">source pyha_forum<br />
{<br />
&nbsp; &nbsp; type = mysql<br />
&nbsp; &nbsp; sql_host = localhost<br />
&nbsp; &nbsp; sql_user = pyha<br />
&nbsp; &nbsp; sql_pass = <br />
&nbsp; &nbsp; sql_db = pyha<br />
&nbsp; &nbsp; sql_port = 3306<br />
&nbsp; &nbsp; sql_sock = /tmp/mysql.sock<br />
<br />
&nbsp; &nbsp; sql_query_pre = SET NAMES utf8<br />
&nbsp; &nbsp; sql_query_pre = SET CHARACTER SET utf8<br />
<br />
&nbsp; &nbsp; sql_query = \<br />
&nbsp; &nbsp; &nbsp; &nbsp; select ID_MSG, concat('user:',posterName) as posterName, subject, body \<br />
&nbsp; &nbsp; &nbsp; &nbsp; from smf_messages<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; sql_query_info = select ID_MSG, posterName, subject, body from smf_messages where ID_MSG = $id<br />
&nbsp; &nbsp; sql_ranged_throttle = 0<br />
}</div></div>
<blockquote class="info">
<p>Поиск по пользователям реализован за счет &laquo;concat (&#39;user:&#39;,posterName)&raquo;. И достаточно в поисковую строку ввести &laquo;user:adw0rd php&raquo;, чтобы найти все мои сообщения связанные с php на <a href="http://pyha.ru" >пыхе</a>.</p>
</blockquote>
<p><span id="more-4040"></span><br />
Пишем Sphinx-index:</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">index pyha_forum<br />
{<br />
&nbsp; &nbsp; source = pyha_forum<br />
&nbsp; &nbsp; path = /var/sphinxsearch/pyha_forum<br />
&nbsp; &nbsp; docinfo = extern<br />
&nbsp; &nbsp; mlock = 0<br />
&nbsp; &nbsp; morphology = stem_enru<br />
&nbsp; &nbsp; min_word_len = 2<br />
&nbsp; &nbsp; charset_type = utf-8<br />
&nbsp; &nbsp; charset_table = 0..9, A..Z-&gt;a..z, _, a..z, U+410..U+42F-&gt;U+430..U+44F, U+430..U+44F<br />
&nbsp; &nbsp; min_infix_len = 2<br />
&nbsp; &nbsp; enable_star = 1<br />
}</div></div>
<p>Далее, создаем таблицу для Sphinx&#39;a:</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;">TABLE</span> <span style="color: #ff0000;">`sphinx_smf_messages`</span> <span style="color: #66cc66;">&#40;</span><br />
&nbsp; <span style="color: #ff0000;">`id`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #ff0000;">`weight`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #ff0000;">`query`</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3072</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #ff0000;">`group_id`</span> <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">11</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #ff0000;">`query`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`query`</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1024</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>SPHINX <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARSET<span style="color: #66cc66;">=</span>utf8 CONNECTION<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'sphinx://localhost:3312/pyha_forum'</span>;</div></div>
<p>Подробнее о SphinxSE: <a href="/2009/mysql-sphinxse/">http://adw0rd.ru/2009/mysql-sphinxse/</a></p>
<h3>Меняем код в SMF</h3>
<p>В <strong>/Source/Search.php</strong> (строка ~1377) ищем:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> db_query<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp;<span style="color: #0000ff;">&quot;SELECT &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$search_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'topic'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'lsr.ID_TOPIC'</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$search_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'topic'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' AS ID_TOPIC'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;, lsr.ID_MSG, lsr.relevance, lsr.num_matches<br />
&nbsp; &nbsp; FROM (<span style="color: #006699; font-weight: bold;">{$db_prefix}</span>log_search_results AS lsr&quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$search_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sort'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'numReplies'</span> ? <span style="color: #0000ff;">&quot;, <span style="color: #006699; font-weight: bold;">{$db_prefix}</span>topics AS t&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;)<br />
&nbsp; &nbsp; WHERE ID_SEARCH = &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search_cache'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ID_SEARCH'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$search_params</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sort'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'numReplies'</span> ? <span style="color: #0000ff;">&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; AND t.ID_TOPIC = lsr.ID_TOPIC&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<br />
&nbsp; &nbsp; ORDER BY <span style="color: #006699; font-weight: bold;">$search_params[sort]</span> <span style="color: #006699; font-weight: bold;">$search_params[sort_dir]</span><br />
&nbsp; &nbsp; LIMIT &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;, <span style="color: #006699; font-weight: bold;">$modSettings[search_results_per_page]</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__LINE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>и заменяем на</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> db_query<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp;<span style="color: #0000ff;">&quot;SELECT `sm`.`ID_TOPIC`, `ssm`.`id` AS `ID_MSG`, 1000 AS `relevance`, 0 AS `num_matches`<br />
&nbsp; &nbsp; FROM `sphinx_smf_messages` AS `ssm` <br />
&nbsp; &nbsp; LEFT JOIN `smf_messages` AS `sm`<br />
&nbsp; &nbsp; &nbsp; &nbsp; ON `ssm`.`id` = `sm`.`ID_MSG`<br />
&nbsp; &nbsp; WHERE `ssm`.`query` = '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$context</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search_params'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;;weights=1,2,3'<br />
&nbsp; &nbsp; LIMIT &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;, <span style="color: #006699; font-weight: bold;">$modSettings[search_results_per_page]</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__LINE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Вот и все, без лишних усложнений мы решили задачу! Если кто знаком с сорцами SMF&nbsp;&mdash; то понимает на сколько данное решение оказалось легким ;)</p>
<p><strong>UP[2010-Feb-11]:</strong> Обновленная версия поиска:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$searchQuery</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[^[a-z][а-я]\s\d_-]+/iu'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$context</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search_params'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$searchQuery</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$searchQuery</span> ? <span style="color: #000088;">$searchQuery</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'*'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> db_query<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp;<span style="color: #0000ff;">&quot;SELECT `sm`.`ID_TOPIC`, `ssm`.`id` AS `ID_MSG`, 1000 AS `relevance`, 0 AS `num_matches`<br />
&nbsp; &nbsp; FROM `sphinx_smf_messages` AS `ssm` <br />
&nbsp; &nbsp; LEFT JOIN `smf_messages` AS `sm`<br />
&nbsp; &nbsp; &nbsp; &nbsp; ON `ssm`.`id` = `sm`.`ID_MSG`<br />
&nbsp; &nbsp; WHERE `ssm`.`query` = '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$searchQuery</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;;index=pyha_forum,pyha_forum_delta;weights=30,20,10,5;offset=&quot;</span><span style="color: #339933;">.</span><span style="color: #990000;">intVal</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff;">&quot;;limit=<span style="color: #006699; font-weight: bold;">{$modSettings['search_results_per_page']}</span>;maxmatches=1000;mode=extended;groupby=day:created;sort=extended:@weight desc, created desc'&quot;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__LINE__</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Если вы в недоумении что за &laquo;pyha_forum_delta&raquo;, то читайте <a href="/2009/sphinx-delta-index/">Sphinx. Для чего нужны дельта-индексы и как их готовить?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/smf-sphinx/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Sphinx. Установка PHP расширения pecl-sphinx</title>
		<link>http://adw0rd.ru/2009/sphinx-pecl-sphinx/</link>
		<comments>http://adw0rd.ru/2009/sphinx-pecl-sphinx/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 23:35:12 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[PECL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sphinx]]></category>
		<category><![CDATA[Поисковые системы]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3368</guid>
		<description><![CDATA[Как я и обещал в статье &#171;Sphinx. Установка, настройка и использование поискового движка&#187;, расскажу как поставить расширение для PHP, дабы не инклудить файл &#171;sphinxapi.php&#187;. Сначала соберем &#171;libsphinxclient&#187;: # fetch http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz # tar -xzf sphinx-0.9.8.1.tar.gz # cd sphinx-0.9.8.1 # chmod -R 777 * # cd ./api/libsphinxclient/ # ./buildconf.sh # ./configure &#38;&#38; make install Теперь установим PECL-расширение: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/sphinx-pecl-sphinx/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/sphinx-pecl-sphinx.png" alt="sphinx-pecl-sphinx" title="sphinx-pecl-sphinx" width="247" height="127" class="alignright size-full wp-image-3767" /></a></p>
<p>Как я и обещал в статье &laquo;<a href="http://adw0rd.ru/2009/sphinxsearch/" >Sphinx. Установка, настройка и использование поискового движка</a>&raquo;, расскажу как поставить расширение для <strong>PHP</strong>, дабы не инклудить файл &laquo;sphinxapi.php&raquo;.</p>
<p>Сначала соберем <strong>&laquo;libsphinxclient&raquo;</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;"># fetch http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># tar -xzf sphinx-0.9.8.1.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># cd sphinx-0.9.8.1</span><br />
<span style="color: #666666; font-style: italic;"># chmod -R 777 *</span><br />
<span style="color: #666666; font-style: italic;"># cd ./api/libsphinxclient/</span><br />
<span style="color: #666666; font-style: italic;"># ./buildconf.sh</span><br />
<span style="color: #666666; font-style: italic;"># ./configure &amp;&amp; make install</span></div></div>
<p>Теперь установим PECL-расширение:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd sphinx-0.9.8.1/api/libsphinxclient/</span><br />
<span style="color: #666666; font-style: italic;"># pecl install sphinx</span></div></div>
<blockquote class="info">
<p>
Когда спросит про &laquo;libsphinxclient&raquo;, просто согласитесь с умолчанием, так как вы в том же каталоге где собирали &laquo;libsphinxclient&raquo;, то он сам подцепится.
</p>
</blockquote>
<p>После установки, надо прописать модуль в &laquo;php.ini&raquo; или в &laquo;php/extensions.ini&raquo;:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># echo &quot;extension=sphinx.so&quot; &gt;&gt; /usr/local/etc/php/extensions.ini</span><br />
<span style="color: #666666; font-style: italic;"># cat /usr/local/etc/php/extensions.ini</span></div></div>
<p>Получится что-то вроде:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">extension=mbstring.so<br />
extension=simplexml.so<br />
extension=spl.so<br />
extension=mysql.so<br />
....<br />
extension=sphinx.so</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"># apachectl restart</div></div>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/sphinx-pecl-sphinx/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Sphinx. Установка, настройка и использование поискового движка</title>
		<link>http://adw0rd.ru/2009/sphinxsearch/</link>
		<comments>http://adw0rd.ru/2009/sphinxsearch/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 01:52:22 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sphinx]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Поисковые системы]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3366</guid>
		<description><![CDATA[Не так давно, я написал статью &#171;FreeBSD. Установка и настройка Яндекс.Сервер&#187; и пообещал в комментариях рассказать про поисковый движок Sphinx. Это одна из трех запланированных статей про этот замечательный поисковый движок, в следующих статьях расскажу про расширение для PHP и расширение для MySQL. Операционная система, в которой будем производить установку и настройки&#160;&#8212; FreeBSD, но так [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/sphinxsearch/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/sphinx.jpg" alt="sphinx" title="sphinx" width="200" height="51" class="alignright size-full wp-image-3380" /></a></p>
<p>Не так давно, я написал статью &laquo;<a href="http://adw0rd.ru/2009/yandex-server/" >FreeBSD. Установка и настройка Яндекс.Сервер</a>&raquo; и пообещал в комментариях рассказать про поисковый движок <strong>Sphinx</strong>. Это одна из трех запланированных статей про этот замечательный поисковый движок, в следующих статьях расскажу про <a href="http://adw0rd.ru/2009/sphinx-pecl-sphinx/" >расширение для PHP</a> и <a href="http://adw0rd.ru/2009/mysql-sphinxse/" >расширение для MySQL</a>.</p>
<p>Операционная система, в которой будем производить установку и настройки&nbsp;&mdash; <strong>FreeBSD</strong>, но так же буду давать советы и для <strong>Windows</strong>-пользователей.</p>
<p>В качестве примера, будем разрабатывать поиск для моего блога на WordPress. Для самых не терпеливых, вот демонстрация работы поисковика <a href="http://demo.adw0rd.ru/sphinxsearch/" >http://demo.adw0rd.ru/sphinxsearch/</a>.</p>
<h3>Установка</h3>
<p>Установка достаточно простая</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/textproc/sphinxsearch</span><br />
<span style="color: #666666; font-style: italic;"># make config</span></div></div>
<p><strong>Выбираем:</strong></p>
<ul>
<li>&laquo;mysql&raquo;, если вы пользуетесь данной СУБД и хотите работать с данными непосредственно из <strong>Sphinx</strong></li>
<li>&laquo;iconv&raquo; для поддержки разных кодировок</li>
</ul>
<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;"># </span><span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></div></div>
<p>Вот и все, установка завершена!<br />
<span id="more-3366"></span></p>
<blockquote class="download">
<p>
Скачать <strong>исходники</strong> и <strong>Windows-версии</strong> можно тут: <noindex><a rel="nofollow" href="http://sphinxsearch.com/downloads.html" >http://sphinxsearch.com/downloads.html</a></noindex>.</p>
<p>После скачки <strong>Windows-версии</strong>, достаточно распаковать архив и указать в системной переменной <strong>&laquo;Path&raquo;</strong> полный путь до каталога <strong>\sphinx\bin</strong>.
</p>
</blockquote>
<h3>Настройка</h3>
<p>До начала поиска надо проиндексировать вашу информацию, создадим наш конфигурационный файл и укажем что и как индексировать, а также как отдавать результаты поиска.</p>
<p>Создадим конфигурационный файл для нашего поиска по блогу <strong>/home/sphinx/sphinx.conf</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: #7a0874; font-weight: bold;">source</span> adw0rd_wp<br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Параметры подключения к БД</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">type</span> = mysql<br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_host = localhost<br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_user = user<br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_pass = password<br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_db = database_name<br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_port = <span style="color: #000000;">3306</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Установим кодировку для работы с БД</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_query_pre = SET NAMES utf8<br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_query_pre = SET CHARACTER SET utf8<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Запрос выборки данных для индексации</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_query = SELECT ID <span style="color: #c20cb9; font-weight: bold;">as</span> post_id, post_title, post_content FROM wp_posts WHERE post_type = <span style="color: #ff0000;">'post'</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Запрос доп. информации для вывода результата (используется утилитой &quot;search&quot;)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_query_info = SELECT <span style="color: #000000; font-weight: bold;">*</span> FROM wp_posts WHERE ID = <span style="color: #007800;">$id</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Время простоя (sleep) перед посылкой запросов серверу (предназначен для разгрузки сервера БД)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Если установите &quot;= 1000&quot;, то засыпание будет длится 1 секунду</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; sql_ranged_throttle = <span style="color: #000000;">0</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
index adw0rd_wp<br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Использовать соответствующий source-блок настроек при индексации</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">source</span> = adw0rd_wp<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Путь до файлов индекса</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; path = <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>data<span style="color: #000000; font-weight: bold;">/</span>adw0rd_wp<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Способ хранения индекса (none, inline, extern)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Подробнее http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-docinfo</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; docinfo = extern<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Memory lock (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-mlock)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; mlock = <span style="color: #000000;">0</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Использование английского и русского стемминга</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; morphology = stem_enru<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Минимальная длина индексируемого слова</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; min_word_len = <span style="color: #000000;">2</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Установка используемой кодировки</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; charset_type = utf-<span style="color: #000000;">8</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Таблица символов (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-charset-table)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; charset_table = <span style="color: #000000;">0</span>..<span style="color: #000000;">9</span>, A..Z-<span style="color: #000000; font-weight: bold;">&gt;</span>a..z, _, a..z, U+<span style="color: #000000;">410</span>..U+42F-<span style="color: #000000; font-weight: bold;">&gt;</span>U+<span style="color: #000000;">430</span>..U+44F, U+<span style="color: #000000;">430</span>..U+44F<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Минимальная длина инфикса (префикс в том числе)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; min_infix_len = <span style="color: #000000;">2</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Использовать оператор усечения &quot;*&quot; (http://www.sphinxsearch.com/docs/manual-0.9.8.html#conf-enable-star)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; enable_star = <span style="color: #000000;">1</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
indexer<br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Максимальный лимит используемой памяти RAM</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; mem_limit = 32M<br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
searchd<br />
<span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Адрес сервера</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; address = 127.0.0.1<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Порт</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; port = <span style="color: #000000;">3312</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Лог</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; log = <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>searchd.log<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Лог запросов</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; query_log = <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>query.log<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Таймаут на соединение с сервером (в секундах). При истечении времени происходит обрыв</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; read_timeout = <span style="color: #000000;">5</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Максимальное кол-во потомков от процесса</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; max_children = <span style="color: #000000;">30</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Путь до pid-файла</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pid_file = <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>log<span style="color: #000000; font-weight: bold;">/</span>searchd.pid<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Максимальное кол-во результатов выдачи</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; max_matches = <span style="color: #000000;">1000</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span></div></div>
<blockquote class="info">
<p>В новых версиях SphinxSearch надо использовать:</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">listen = 127.0.0.1:3312</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"># Адрес сервера<br />
address = 127.0.0.1<br />
<br />
# Порт<br />
port = 3312</div></div>
</blockquote>
<p>Полная документация: <noindex><a rel="nofollow" href="http://www.sphinxsearch.com/docs/" >http://www.sphinxsearch.com/docs/</a></noindex>.</p>
<p><strong>Разберем используемые нами SQL-запросы:</strong></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"># Запрос выборки данных для индексации<br />
sql_query <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">SELECT</span> post_title<span style="color: #66cc66;">,</span> post_content <span style="color: #993333; font-weight: bold;">FROM</span> wp_posts <span style="color: #993333; font-weight: bold;">WHERE</span> post_type <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'post'</span></div></div>
<p>Тут мы выбираем заголовки и содержимое статей таблицы постов блога, при этом надо указать что типа поста&nbsp;&mdash; &laquo;post&raquo; (это та самая версия поста, которая считается опубликованной и текущей, так как есть еще ревизионные подверсии постов).</p>
<p><br clear="all" /></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: #66cc66;">.</span> информации для вывода результата <span style="color: #66cc66;">&#40;</span>используется утилитой <span style="color: #ff0000;">&quot;search&quot;</span><span style="color: #66cc66;">&#41;</span><br />
sql_query_info <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`wp_posts`</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`ID`</span> <span style="color: #66cc66;">=</span> $id</div></div>
<p>Этот запрос применяется для вывода дополнительных данных результатов поиска используемый утилитой коммандной строки &laquo;search&raquo;.</p>
<h4>Индексация</h4>
<p>Укажем в качестве конфига созданный нами конфигурационный файл:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span>indexer <span style="color: #660033;">--config</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>sphinx.conf <span style="color: #660033;">--all</span></div></div>
<p>Для обновления текущего индекса используйте &laquo;--rotate&raquo;, он добавит к созданному индексу новые данные, а измененные соответственно изменит.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span>indexer <span style="color: #660033;">--config</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>sphinx.conf <span style="color: #660033;">--rotate</span></div></div>
<p><strong>P.S.</strong> Если индексация не удалась, пишите комментарии к статье, посмотрим что случилось... :)</p>
<h4>Использование поиска</h4>
<p>Для поиска в консоли есть утилита <strong>&laquo;search&raquo;</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;"># </span>search <span style="color: #660033;">--config</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>sphinx.conf искомая комбинация</div></div>
<h4>Запуск поискового сервера</h4>
<p>Для работы с поисковым сервером, нам надо его запустить:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span>searchd <span style="color: #660033;">--config</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>sphinx<span style="color: #000000; font-weight: bold;">/</span>sphinx.conf</div></div>
<p>Далее, мы сможем использовать <strong>Sphinx API</strong>.</p>
<h3>Использование Sphinx API для PHP</h3>
<p>Для работы со <strong>Sphinx API</strong> необходимо подключить файл <strong>sphinxapi.php</strong>, вы можете найти эту библиотеку в поставке с дистрибутивом. Например для установки из портов <strong>FreeBSD</strong>&nbsp;&mdash; путь <strong>&laquo;/usr/ports/textproc/sphinxsearch/work/sphinx-0.9.8.1/api/sphinxapi.php&raquo;</strong>, а для <strong>Windows</strong>&nbsp;&mdash; <strong>&laquo;sphinx\api\sphinxapi.php&raquo;</strong>.</p>
<p>А теперь напишем скрипт для работы с проиндексируемыми данными поисковика, то есть для запросов искомых слов и вывода результатов поиска!</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp; &nbsp; &lt;meta content=&quot;text/html; charset=utf-8&quot; http-equiv=&quot;Content-Type&quot;/&gt;<br />
&nbsp; &nbsp; &lt;title&gt;Sphinx search for Wordpress&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
<br />
&lt;form action=&quot;&quot; method=&quot;get&quot;&gt;<br />
&nbsp; &nbsp; &lt;input name=&quot;s&quot; size=&quot;40&quot; value=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #339933;">@</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'s'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; /&gt;<br />
&nbsp; &nbsp; &lt;input type=&quot;submit&quot; value=&quot;Искать!&quot; /&gt;<br />
&lt;/form&gt;<br />
<span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<br />
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'s'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> and <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'s'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Подключаем sphinx-api</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">require_once</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;sphinxapi.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Искомая комбинация</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$string</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'s'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Создаем объект клиента для Sphinx API</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$sphinx</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SphinxClient<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Подсоединяемся к Sphinx-серверу</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$sphinx</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetServer</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">3312</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Совпадение по любому слову</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$sphinx</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetMatchMode</span><span style="color: #009900;">&#40;</span>SPH_MATCH_ANY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Результаты сортировать по релевантности</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$sphinx</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetSortMode</span><span style="color: #009900;">&#40;</span>SPH_SORT_RELEVANCE<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Задаем полям веса (для подсчета релевантности)</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$sphinx</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SetFieldWeights</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'post_title'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">20</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'post_content'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Результат по запросу (* - использование всех индексов)</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sphinx</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$string</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'*'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Если есть результаты поиска, то</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'matches'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Соединяемся с БД</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #990000;">mysql_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #990000;">mysql_select_db</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'adw0rd_wp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Устанавливаем кодировки</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SET NAMES utf8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SET CHARACTER SET utf8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Получаем массив ID постов блога</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$ids</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_keys</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'matches'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Выводим посты отсортированные по релевантности</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$id_list</span> <span style="color: #339933;">=</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ids</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SELECT `ID`, `post_title`, `post_content`<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FROM `wp_posts`<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WHERE `ID` IN ('</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_list</span><span style="color: #339933;">.</span><span style="color: #0000ff;">')<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ORDER BY FIELD(`ID`, '</span><span style="color: #339933;">.</span><span style="color: #000088;">$id_list</span><span style="color: #339933;">.</span><span style="color: #0000ff;">')'</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$resource</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Выводим результаты поиска</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;ol&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$resource</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;li&gt;&lt;span&gt;&lt;a href=&quot;http://adw0rd.ru/?p='</span><span style="color: #339933;">.</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ID'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/a&gt;&lt;/span&gt;&lt;div&gt;'</span><span style="color: #339933;">.</span><span style="color: #990000;">mb_substr</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_content'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">400</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/div&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/ol&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&lt;/body&gt;<br />
&lt;/html&gt;</div></div>
<p>Документация по <strong>Sphinx API</strong> для <strong>PHP</strong>: <noindex><a rel="nofollow" href="http://www.sphinxsearch.com/wiki/doku.php?id=php_api_docs" >http://www.sphinxsearch.com/wiki/doku.php?id=php_api_docs</a></noindex></p>
<h3>Резюме</h3>
<p>За короткое время нам удалось развернуть быстрейший &laquo;поисковый сервис своими руками&raquo;, с возможностями полнотекстового поиска. Демонстрация работы: <a href="http://demo.adw0rd.ru/sphinxsearch/" >http://demo.adw0rd.ru/sphinxsearch/</a>.</p>
<p>По всем вопросам, касающемся этой статьи пишите в комментарии.</p>
<p><strong>P.S.</strong> Если вам не знакомы слова: &laquo;<noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BC%D0%BC%D0%B8%D0%BD%D0%B3" >стемминг</a></noindex>&raquo;, &laquo;<noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%84%D0%B8%D0%BA%D1%81" >инфикс</a></noindex>&raquo;, &laquo;<noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE%D1%84%D0%BE%D1%80%D0%BC%D0%B0" >словоформа</a></noindex>&raquo; и т.д., то существует проект <noindex><a rel="nofollow" href="http://ru.wikipedia.org/" >Википедия</a></noindex>, в которой можно с легкостью об этом узнать!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/sphinxsearch/feed/</wfw:commentRss>
		<slash:comments>199</slash:comments>
		</item>
		<item>
		<title>Видеосервис своими руками и организация псевдостримминга</title>
		<link>http://adw0rd.ru/2009/videoservice-handmade/</link>
		<comments>http://adw0rd.ru/2009/videoservice-handmade/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 01:07:02 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Интернет сервисы]]></category>
		<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flowplayer]]></category>
		<category><![CDATA[FLV]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[yamdi]]></category>
		<category><![CDATA[Сервисы]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=2801</guid>
		<description><![CDATA[Сегодня я расскажу как работают &#171;видеохостинги&#187; и мы разработаем свой &#171;видеосервис&#187; для закачивания видео-файлов, с последующим конвертирование и созданием картинки для превью. Далее организуем показ во флеш-плеере и эмулируем стримминг (для перемотки на не загруженные части видео-файла). Для всего этого нам понадобиться: Флеш-плеер для проигрывания видео-файлов&#160;&#8212; flowplayer Программа для конвертирования видео-файлов&#160;&#8212; ffmpeg Расширение PHP для [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/videoservice-handmade/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/videoservice1.png" alt="videoservice" title="videoservice" width="260" height="51" class="alignright size-full wp-image-2965" /></a></p>
<p>Сегодня я расскажу как работают <strong>&laquo;видеохостинги&raquo;</strong> и мы разработаем свой <strong>&laquo;видеосервис&raquo;</strong> для закачивания видео-файлов, с последующим конвертирование и созданием картинки для превью. Далее организуем показ во флеш-плеере и эмулируем стримминг (для перемотки на не загруженные части видео-файла).</p>
<p><strong>Для всего этого нам понадобиться:</strong></p>
<ul>
<li>Флеш-плеер для проигрывания видео-файлов&nbsp;&mdash; <strong>flowplayer</strong></li>
<li>Программа для конвертирования видео-файлов&nbsp;&mdash; <strong>ffmpeg</strong></li>
<li>Расширение <strong>PHP</strong> для получения превью-изображения&nbsp;&mdash; <strong>php-ffmpeg</strong> и библиотека для работы с графикой&nbsp;&mdash; <strong>GD</strong></li>
<li>Эмуляция потокового видео (псевдостримминг) с помощью утилиты <strong>yamdi</strong>, модуля для nginx&nbsp;&mdash; <strong>http_flv_module</strong> и плагина для flowplayer&nbsp;&mdash; <strong>flowplayer.pseudostreamming</strong></li>
</ul>
<p><img src="http://adw0rd.ru/wp-content/uploads/2009/06/scheme-medium.png" alt="scheme-medium" title="scheme-medium" width="682" height="156" class="aligncenter size-full wp-image-2956" style="border:dotted #c4c4c4 2px;padding:3px;" /></p>
<p>Серверная ОСь по традиции&nbsp;&mdash; <strong>FreeBSD</strong>.<br />
<span id="more-2801"></span></p>
<h3>Установка необходимых нам утилит</h3>
<h4>ffmpeg</h4>
<p>Для того чтобы конвертировать видео, нам необходимо установить утилиту <strong>ffmpeg</strong>. Есть еще аналогичная утилита&nbsp;&mdash; <strong>mencoder</strong>, тоже очень хорошая, но <strong>ffmpeg</strong> более популярен, поэтому именно его буду сейчас использовать. Эти утилиты с переменным успехом конкурируют между собой, поэтому также рекомендую посмотреть на <strong>mencoder</strong> в свободное время.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># cd /usr/ports/multimedia/ffmpeg<br />
# make config</div></div>
<p>и выбираем <strong>LAME</strong> (lame MP3 codec)</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"># make install</div></div>
<blockquote class="download">
<p>Windows сборки ffmpeg: <noindex><a rel="nofollow" href="http://ffmpeg.arrozcru.org/builds/" >http://ffmpeg.arrozcru.org/builds/</a></noindex></p>
</blockquote>
<p><a name="yamdi" /></a></p>
<h4>yamdi</h4>
<p>Далее, необходимо установить утилиту <strong>yamdi</strong>, которая вшивает мета-данные в видео-файл. Мета-данные необходимы для индексирования файла, то есть для того, чтобы можно было в еще не скачанном (не буферизированном) файле при перемотке перемещаться по индексам.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># cd /usr/ports/multimedia/yamdi<br />
# make install</div></div>
<h4>nginx</h4>
<p>Теперь подошло время для <strong>nginx</strong>, который будет отдавать индексируемый (с помощью yamdi) видео-файл. На его месте может быть и <strong>lighttpd</strong> или еще какой-нибудь другой веб-сервер. Но я поддержу отечественного производителя! :)</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># cd /usr/ports/www/nginx<br />
# make config</div></div>
<p>и выбираем <strong>HTTP_FLV_MODULE</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"># make install</div></div>
<p>Ну или просто при установке укажите опцию &laquo;--with-http_flv_module&raquo;.</p>
<blockquote class="download">
<p>nginx-0.7.52. Теперь и под Windows: <noindex><a rel="nofollow" href="http://rmcreative.ru/blog/post/nginx-0.7.52-teper-i-pod-windows" >http://rmcreative.ru/blog/post/nginx-0.7.52-teper-i-pod-windows</a></noindex></p>
</blockquote>
<blockquote class="info">
<p>
Можно конечно использовать в качестве бекенда&nbsp;&mdash; PHP, например с помощью такого кода:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$start</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #339933;">@</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'position'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$start</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;You fucking idiot&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #666666; font-style: italic;">// open file for reading</span><br />
<span style="color: #000088;">$fp</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'r+'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$fsize</span> <span style="color: #339933;">=</span> <span style="color: #990000;">filesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$start</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// seek to requested position</span><br />
&nbsp; &nbsp; <span style="color: #990000;">fseek</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #000088;">$start</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// FLV header for the movie part. Magic. Just trust me.</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Header code is completely taken from flv4php project</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$header</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;FLV&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">pack</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'C'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">pack</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'C'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">5</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">pack</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'N'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">9</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">pack</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'N'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">9</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Length: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$header</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$fsize</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$start</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$header</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Length: &quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$fsize</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #990000;">set_time_limit</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">feof</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">print</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1024</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #990000;">usleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">// limit download speed</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Но мне удобнее использовать для этого модуль <strong>nginx&#39;а</strong>, да и быстрее будет, имхо.</p>
</blockquote>
<h4>php5-ffmpeg</h4>
<p>Это расширение <strong>PHP</strong> нам понадобиться для того чтобы получать информацию о видео-файле, а также для получения видео-фрейма для превью. Также необходимо установить библиотеку <strong>GD</strong> и сам <strong>PHP</strong> в частности.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># cd /usr/ports/graphics/php5-ffmpeg<br />
# make install</div></div>
<blockquote class="download">
<p>php5-ffmpeg для Windows: <a href="http://pyha.ru/forum/attachment/1256/1317.0" >http://pyha.ru/forum/attachment/1256/1317.0</a> и <a href="http://pyha.ru/forum/attachment/1257/1317.0" >http://pyha.ru/forum/attachment/1257/1317.0</a></p>
</blockquote>
<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"># ffmpeg -i /path/filename.flv</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"># ffmpeg -i /path/filename.flv &nbsp;-an -ss ВРЕМЯ_ПОЗИЦИИ_В_СЕКУНДАХ -r 1 -vframes 1 -s 320x240 -y -f mjpeg /path/filename.jpg</div></div>
<p>Но мне нравиться использовать расширение, это удобнее, имхо.</p>
</blockquote>
<p>И перегрузите <strong>apache</strong> или <strong>nginx</strong>, смотря как вы используете <strong>PHP</strong>.</p>
<h3>Конвертирование видео и получение изображения для превью</h3>
<p>Для начала нам надо указать путь до исходного и результирующего файлов, прописать пути до превью-файлов, а также указать минимальную позицию фрейма для создания превью.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// Путь до залитого видео-файла, например временный файл полученный по $_FILES['tmp_file']</span><br />
<span style="color: #000088;">$inputPath</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tmp_file'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//Путь до результирующего файла, то есть отконвертированный и прошитый мета-данными видео-файл</span><br />
<span style="color: #000088;">$outputPath</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/path/video/filename.flv&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Указываем минимальную позицию фрейма для захвата превью</span><br />
<span style="color: #000088;">$previewFrameMin</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'3'</span><span style="color: #339933;">;</span> <br />
<br />
<span style="color: #666666; font-style: italic;">// Путь до превью-файла</span><br />
<span style="color: #000088;">$previewPath</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/path/preview/filename.jpg&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Путь до мини-превью</span><br />
<span style="color: #000088;">$previewMiniPath</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/path/preview/filename_mini.jpg&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">// Массив для сбора ошибок</span><br />
<span style="color: #000088;">$errorInfo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Конвертируем исходный файл во временный, в формате <strong>FLV</strong> и разрешением <strong>320&times;240</strong>, использую в качестве аудио-кодека <strong>mp3lame</strong> с частотой <strong>44100</strong>, остальные настройки по умолчанию. Временный файл нужен для того, чтобы <strong>yamdi</strong> смог вшить мета-данные, так как он не может вшить в исходный файл.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">/* <br />
&nbsp;* Конвертируем FLV во временный файл ($outputPath . '_temp').<br />
&nbsp;*/</span><br />
<span style="color: #990000;">passthru</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'/usr/local/bin/ffmpeg -i '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">escapeshellarg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$inputPath</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">' -f flv '</span><span style="color: #339933;">.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">' -s 320x240 '</span><span style="color: #339933;">.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">' -acodec libmp3lame '</span><span style="color: #339933;">.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">' -ar 44100 '</span><span style="color: #339933;">.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #990000;">escapeshellarg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputPath</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_temp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$errorInfo</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ffmpeg'</span><span style="color: #009900;">&#93;</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Прошиваем в видео-файл мета-данные для индексирования. Утилита <strong>yamdi</strong> написана на Си и работает очень быстро! А также удаляем временный файл.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* Прошиваем metadata (позиции ключевых фреймов) для перемотки<br />
&nbsp;*/</span><br />
<span style="color: #990000;">passthru</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'/usr/local/bin/yamdi -i '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">escapeshellarg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputPath</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_temp'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">' -o '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">escapeshellarg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputPath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$errorInfo</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'yamdi'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* Удаление временного файла, он нам уже не нужен...<br />
&nbsp;*/</span><br />
<span style="color: #990000;">unlink</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputPath</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_temp'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Теперь получаем информацию о видео-файле и получаем объект фрейма для превью.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* С помощью расширения php5-ffmpeg получаем информацию о видео-файле<br />
&nbsp;*/</span><br />
<span style="color: #000088;">$movie</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ffmpeg_movie<span style="color: #009900;">&#40;</span><span style="color: #000088;">$outputPath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* Вычисляем время воспроизведения видеофайла<br />
&nbsp;*/</span><br />
<span style="color: #000088;">$duration</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$movie</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDuration</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* Вычисляем количество кадров<br />
&nbsp;*/</span><br />
<span style="color: #000088;">$frameCount</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$movie</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFrameCount</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* Вычисляем позицию фрейма для его захвата<br />
&nbsp;*/</span><br />
<span style="color: #000088;">$framePosition</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$frameCount</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$previewFrameMin</span><span style="color: #009900;">&#41;</span> ? <span style="color: #000088;">$frameCount</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$previewFrameMin</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* Получаем объект фрейма для превью<br />
&nbsp;*/</span><br />
<span style="color: #000088;">$preview</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$movie</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFrame</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$framePosition</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>А теперь получим и сохраним наши превьюшки.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* Записываем в файл - Превью (320x240)<br />
&nbsp;*/</span><br />
<span style="color: #990000;">imagejpeg</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$preview</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">toGDImage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$previewPath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*<br />
&nbsp;* Записываем в файл - Мини-превью (160x120)<br />
&nbsp;*/</span><br />
<br />
<span style="color: #000088;">$previewMini</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecreatetruecolor</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">160</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">120</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$r</span> <span style="color: #339933;">=</span> <span style="color: #990000;">imagecopyresized</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$previewMini</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$preview</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">toGDImage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #cc66cc;">160</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">120</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <span style="color: #cc66cc;">320</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">240</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #990000;">imagejpeg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$previewMini</span><span style="color: #339933;">,</span> <span style="color: #000088;">$previewMiniPath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Все, файл отконвертирован в <strong>FLV</strong> и прошит мета-данными, также созданы превью, теперь займемся выводом видео-файла&nbsp;&mdash; клиенту.</p>
<h3>Плеер и показ видео</h3>
<h4>Почему flowplayer?</h4>
<p>Сначала нам понадобится флеш-плеер, умеющий проигрывать видео в формате <strong>FLV</strong> и показывать картинки в формате <strong>JPEG</strong> (для превью).</p>
<p>Из всех аналогов (смотрите ниже, в &laquo;Полезные ссылки -> Видео-плееры&raquo;) мне больше всего понравился <noindex><a rel="nofollow" href="http://flowplayer.org/" >flowplayer</a></noindex>, он:</p>
<ul>
<li>Кроссбраузерный и очень гибкий, и удобный в настройке</li>
<li>Бесплатный для некоммерческого использования, а коммерческая версия стоит его возможностей!</li>
<li>Имеет Flash и Javascript API, также поддерживает библиотеку JQuery (там доп. фишки какие-то)</li>
<li>Имеет кучу полезных плагинов</li>
<li>Умеет работать со стриммингом и псевдостриммингом</li>
<li>Легко поменять шаблоны оформления и языковые шаблоны для настройки локализованного интерфейса</li>
<li>Обширная документация, имеет достаточно большое сообщество в собственном форуме, а также оказывает бесплатную поддержку для коммерческой версии</li>
<li>Поддерживает плейлисты и имеет полноэкранный режим</li>
<li>Поддерживаемые форматы: FLV, SWF, MP3, MP4, H.264 video, JPG, PNG</li>
<li>Сырцы открыты!</li>
</ul>
<p><img src="http://adw0rd.ru/wp-content/uploads/2009/06/flowplayer.png" alt="flowplayer" title="flowplayer" width="416" height="312" class="alignnone size-full wp-image-2893" style="border:dotted #c4c4c4 2px;padding:3px;" /></p>
<p>Остальное описание возможностей на официальном сайте: <noindex><a rel="nofollow" href="http://flowplayer.org/" >http://flowplayer.org/</a></noindex></p>
<h4>Настройка flowplayer</h4>
<p>С плеером мы определились, теперь надо его настроить для показа видео. В дистрибутив плеера входит:</p>
<ul>
<li><strong>flowplayer-3.1.1.swf</strong>&nbsp;&mdash; сам плеер</li>
<li><strong>flowplayer.controls-3.1.1.swf</strong>&nbsp;&mdash; flash-controls</li>
<li><strong>flowplayer-3.1.1.min.js</strong>&nbsp;&mdash; это так называемый js-api</li>
</ul>
<p>Для реализации псевдо-стримминга нам не хватает <strong>flowplayer.pseudostreaming-3.1.2.swf</strong>, который можно скачать и ознакомиться с использованием тут: <noindex><a rel="nofollow" href="http://flowplayer.org/plugins/streaming/pseudostreaming.html" >http://flowplayer.org/plugins/streaming/pseudostreaming.html</a></noindex>.</p>
<p>Для работы со всеми видами стриминга есть титуриал: <noindex><a rel="nofollow" href="http://flowplayer.org/documentation/configuration/streaming.html" >http://flowplayer.org/documentation/configuration/streaming.html</a></noindex></p>
<p><strong>Итак, приступим:</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: #808080; font-style: italic;">&lt;!-- Подключаем js-api --&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/swf/flowplayer-3.1.1.min.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span><br />
<br />
<span style="color: #808080; font-style: italic;">&lt;!-- Настраиваем плеер --&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span><br />
&nbsp; &nbsp; flowplayer(<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;player&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;/swf/flowplayer-3.1.1.swf&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; playlist: [<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url: 'http://example.com/preview/filename.jpg' <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url: 'http://example.com/video/filename.flv', &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; autoPlay: false,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; autoBuffering: false,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; provider: 'pseudo'<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ],<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; plugins: {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pseudo: { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url: '/swf/flowplayer.pseudostreaming-3.1.2.swf' <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; );<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span><br />
<br />
<span style="color: #808080; font-style: italic;">&lt;!-- DIV в который мы поместим плеер --&gt;</span> <br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;width:416px;height:312px;display:block;padding:10px;&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;player&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></div></div>
<p>Все опции указанные в настройках можно посмотреть тут: <noindex><a rel="nofollow" href="http://flowplayer.org/documentation/configuration/clips.html" >http://flowplayer.org/documentation/configuration/clips.html</a></noindex></p>
<h4>Настройка http_flv_module</h4>
<p>Теперь настроим <strong>nginx</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">&nbsp; &nbsp; &nbsp; &nbsp; location ~ \.flv$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; flv;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; root /path/video;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }</div></div>
<p>То есть, говорим <strong>nginx&#39;у</strong> чтобы он для расширения &laquo;flv&raquo; использовал модуль <strong>http_flv_module</strong> и указываем в <strong>root</strong> путь до видео-файлов. Документация по <strong>http_flv_module</strong>: <noindex><a rel="nofollow" href="http://sysoev.ru/nginx/docs/http/ngx_http_flv_module.html" >Директивы модуля ngx_http_flv_module</a></noindex></p>
<p>Ну вот и все, теперь у вас полноценный &laquo;видеосервис&raquo;!</p>
<h3>Полезные ссылки</h3>
<p><strong>ffmpeg</strong><br />
<a href="http://pyha.ru/forum/topic/1317.0" >Работа с видео на php с помощью php ffmpeg</a><br />
<noindex><a rel="nofollow" href="http://vbolshov.org.ru/?id=20&#038;ctrl=article" >Продвинутый метод воспроизведения flash-видео на веб-страницах (или эмулируем стрим-видео)</a></noindex><br />
<noindex><a rel="nofollow" href="http://vbolshov.org.ru/?id=34&#038;ctrl=article" >Наносим водяной знак на видео с помощью ffmpeg</a></noindex><br />
<noindex><a rel="nofollow" href="http://alexsnet.ru/2008/12/how-does-it-works-videohost-part1/" >Как же работают видеохостинги? Часть первая. Сборка.</a></noindex><br />
<noindex><a rel="nofollow" href="http://alexsnet.ru/2008/12/how-does-it-works-videohost-part2-ffmpeg/" >Как же работают видеохостинги? Часть вторая. Ffmpeg.</a></noindex><br />
<!--<noindex><a rel="nofollow" href="http://boombick.org/blog/posts/19" >Обработка видео при помощи mencoder</a></noindex><br />
<noindex><a rel="nofollow" href="http://boombick.org/blog/posts/72" >Собственный видеохостинг</a></noindex>--></p>
<p><strong>Видео-плееры</strong><br />
<noindex><a rel="nofollow" href="http://chernev.ru/podborka-video-proigryvatelej-na-fleshe.html" >Подборка видео-проигрывателей на флэше</a></noindex><br />
<noindex><a rel="nofollow" href="http://vremenno.net/misc/video-and-audio-players-for-sites/" >Видео и аудио плееры для сайтов</a></noindex><br />
<noindex><a rel="nofollow" href="http://www.birzool.com/ideal-videoplayer/" >Идеальный видео-плеер</a></noindex><br />
<noindex><a rel="nofollow" href="http://www.birzool.com/ideal-videoplayer-2/" >Идеальный видеоплеер. Не утопия </a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/videoservice-handmade/feed/</wfw:commentRss>
		<slash:comments>78</slash:comments>
<enclosure url="http://example.com/video/filename.flv" length="0" type="video/x-flv" />
		</item>
		<item>
		<title>Eclipse плагин subclipse для работы с SVN (Subversion)</title>
		<link>http://adw0rd.ru/2009/eclipse-subclipse/</link>
		<comments>http://adw0rd.ru/2009/eclipse-subclipse/#comments</comments>
		<pubDate>Thu, 28 May 2009 22:32:20 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Svn]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=2677</guid>
		<description><![CDATA[Надоело использовать TortoiseSVN и я решил попробовать попользоваться плагином для Eclipse&#160;&#8212; subclipse, дабы интегрироваться одним комбайном :) По этой ссылке расположено официальное руководство и там рассказывается про установку на старые версии Eclipse, а я покажу как поставить на Eclipse 3.4.2 и Subversion 1.5.5. Установка Заходим в Help -> Software Updates... -> Available Software, нажимаем по [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/eclipse-subclipse/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/02/subversion.png" alt="subversion" title="subversion" width="234" height="32" class="alignright size-full wp-image-858" /></a></p>
<p>Надоело использовать <strong>TortoiseSVN</strong> и я решил попробовать попользоваться плагином для <strong>Eclipse&nbsp;&mdash; subclipse</strong>, дабы интегрироваться одним комбайном :)</p>
<p>По <noindex><a rel="nofollow" href="http://subclipse.tigris.org/servlets/ProjectProcess;jsessionid=FB9D1D8537C319842D00DDC718B9C64D?pageID=p4wYuA" >этой ссылке расположено официальное руководство</a></noindex> и там рассказывается про установку на старые версии <strong>Eclipse</strong>, а я покажу как поставить на <strong>Eclipse 3.4.2</strong> и <a href="http://adw0rd.ru/2009/freebsd-subversion/" >Subversion 1.5.5</a>.</p>
<h3>Установка</h3>
<p>Заходим в <strong>Help -> Software Updates... -> Available Software</strong>, нажимаем по <strong>&laquo;Add Site...&raquo;</strong> и вбиваем в <strong>&laquo;Location&raquo;</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">http://subclipse.tigris.org/update_1.6.x</div></div>
<p>Далее отмечаем необходимые пункты:<br />
<img src="http://adw0rd.ru/wp-content/uploads/2009/05/subclipse-insall.png" alt="subclipse-insall" title="subclipse-insall" width="444" height="226" class="alignnone size-full wp-image-2684" style="border: dotted #c4c4c4 2px;padding:3px;" /></p>
<p>Устанавливаем и перегружаем <strong>Eclipse</strong>...</p>
<p>У меня была проблема, пока не включил в установку <strong>&laquo;Subversion JavaHL Native Library Adapter&raquo;</strong>&nbsp;&mdash; не работал <strong>svn-client и Eclipse</strong> посылал на все 3 буквы! Так что не забудьте его включить в список установки! <strong>&laquo;Revision Graph&raquo;</strong>&nbsp;&mdash; можете отключить, если вам ненужен, я так понял это для построения графа ревизий...<br />
<span id="more-2677"></span></p>
<h3>Использование</h3>
<p>Создаем новую перспективу:<br />
<strong>Windows -> Open Perspective -> Other ->SVN Repository Exploring</strong></p>
<p>Заходим в перспективу и создаем новый локейшен:<br />
<strong>New -> Repository Location...</strong></p>
<p>Вставляем URL вашего репозитория:<br />
<a href="http://adw0rd.ru/wp-content/uploads/2009/05/new-rep.png" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/new-rep-150x150.png" alt="new-rep" title="new-rep" width="150" height="150" class="alignnone size-thumbnail wp-image-2693" style="border: dotted #c4c4c4 2px;padding:3px;" /></a></p>
<p>После чего вызываем контекстное меню вашего созданного подключения и выбираем <strong>&laquo;Checkout&raquo;</strong>, далее вписываем имя проекта, у меня <strong>&laquo;pyha.loc&raquo;</strong> (будет создан одноименный каталог):<br />
<a href="http://adw0rd.ru/wp-content/uploads/2009/05/co-name.png" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/co-name-150x150.png" alt="co-name" title="co-name" width="150" height="150" class="alignnone size-thumbnail wp-image-2697" style="border: dotted #c4c4c4 2px;padding:3px;" /></a></p>
<p>Жмем по <strong>&laquo;Next&raquo;</strong> и указываем <strong>&laquo;Workspace Location&raquo;</strong>, у меня это <strong>c:\WebServer\home</strong> и там находятся все веб-проекты:<br />
<a href="http://adw0rd.ru/wp-content/uploads/2009/05/co-location.png" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/co-location-150x150.png" alt="co-location" title="co-location" width="150" height="150" class="alignnone size-thumbnail wp-image-2698" style="border: dotted #c4c4c4 2px;padding:3px;" /></a></p>
<p>Нажимаем <strong>&laquo;Finish&raquo;</strong> и после чекаута у нас доступен проект в других перспективах, а в <strong>&laquo;c:\WebServer\home&raquo;</strong> создан каталог <strong>&laquo;pyha.loc&raquo;</strong>!</p>
<p>Для работы с <strong>SVN-репозиторием</strong> надо вызвать контекстное меню проекта той перспективы, в которой вы работаете (например PDT или Java) и выбрать <strong>&laquo;Team&raquo;</strong>, а для настройки плагина зайти в <strong>Preferences -> Team -> SVN</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/eclipse-subclipse/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

