<?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, 28 Jul 2010 18:10:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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</span> <span style="color: #c20cb9; font-weight: bold;">install</span> python-mysqldb</div></div>
<h4>Для FreeBSD</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>ports<span style="color: #000000; font-weight: bold;">/</span>databases<span style="color: #000000; font-weight: bold;">/</span>py-MySQLdb<br />
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span> clean</div></div>
<p>А для Windows можно скачать <noindex><a rel="nofollow" href="http://sourceforge.net/projects/mysql-python/files/mysql-python/" >тут</a></noindex>.</p>
<h3>Создаем наш первый проект</h3>
<p>Допустим, что имя проекта у нас будет &laquo;myproject&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #dc143c;">cd</span> /www<br />
django-admin.<span style="color: black;">py</span> startproject myproject</div></div>
<p>Теперь создайте себе новую БД &laquo;myproject&raquo;:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #ff0000;">`myproject`</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> CHARACTER <span style="color: #993333; font-weight: bold;">SET</span> utf8 COLLATE utf8_general_ci;</div></div>
<p>И отредактируйте &laquo;/www/myproject/settings.py&raquo;, заменив только соответствующие части:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Настройки БД</span><br />
DATABASE_ENGINE = <span style="color: #483d8b;">'mysql'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.</span><br />
DATABASE_NAME = <span style="color: #483d8b;">'myproject'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Or path to database file if using sqlite3.</span><br />
DATABASE_USER = <span style="color: #483d8b;">'username'</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Not used with sqlite3.</span><br />
DATABASE_PASSWORD = <span style="color: #483d8b;">'password'</span> &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Not used with sqlite3.</span><br />
DATABASE_HOST = <span style="color: #483d8b;">''</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Set to empty string for localhost. Not used with sqlite3.</span><br />
DATABASE_PORT = <span style="color: #483d8b;">''</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Set to empty string for default. Not used with sqlite3.</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Путь до каталога, где лежат наши медиа файлы (css, js, images)</span><br />
MEDIA_ROOT = <span style="color: #483d8b;">'/www/myproject/static/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># URL медиа файлов (css, js, images)</span><br />
MEDIA_URL = <span style="color: #483d8b;">'/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># URL медиа файлов админки (css, js, images, etc)</span><br />
ADMIN_MEDIA_PREFIX = <span style="color: #483d8b;">'/admin-media/'</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Путь до каталога с шаблонами</span><br />
TEMPLATE_DIRS = <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">&quot;/www/myproject/blog/templates&quot;</span><br />
<span style="color: black;">&#41;</span><br />
<br />
...<br />
<span style="color: #808080; font-style: italic;"># Установленные приложения в нашем проекте</span><br />
INSTALLED_APPS = <span style="color: black;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.auth'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.contenttypes'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.sessions'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.sites'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'django.contrib.admin'</span>,<br />
&nbsp; &nbsp; <span style="color: #483d8b;">'myproject.blog'</span>,<br />
<span style="color: black;">&#41;</span><br />
<span style="color: #808080; font-style: italic;"># в конец добавлено две строки, первая подключает джанговскую админку,</span><br />
<span style="color: #808080; font-style: italic;"># а второе наше приложение, которое мы ниже опишем</span></div></div>
<p>Для чего я ставлю в начале строки <strong>&laquo;#~*~ coding: utf-8 ~*~&raquo;</strong> читайте <noindex><a rel="nofollow" href="http://www.python.org/dev/peps/pep-0263/" >тут</a></noindex>.</p>
<h3>Создаем наше первое приложение</h3>
<p>После того, как вы создали проект, надо создать приложение, если у вас проект состоит из одного приложения&nbsp;&mdash; можете его назвать &laquo;main&raquo;.</p>
<p>Создаем приложение &laquo;blog&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #dc143c;">cd</span> /www/myproject<br />
python manage.<span style="color: black;">py</span> startapp blog</div></div>
<h4>Файл модели</h4>
<p>Теперь перейдем к разработке модели нашего приложения, отредактируем &laquo;/www/myproject/blog/models.py&raquo;.<br />
У нас будет пока одна сущность, это Посты в Блоге:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем класс модели</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">db</span> <span style="color: #ff7700;font-weight:bold;">import</span> models<br />
<span style="color: #808080; font-style: italic;"># и админки</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin<br />
<br />
<span style="color: #483d8b;">''</span><span style="color: #483d8b;">'<br />
Blog posts<br />
'</span><span style="color: #483d8b;">''</span><br />
<span style="color: #ff7700;font-weight:bold;">class</span> Post<span style="color: black;">&#40;</span>models.<span style="color: black;">Model</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># название поста</span><br />
&nbsp; &nbsp; title = models.<span style="color: black;">CharField</span><span style="color: black;">&#40;</span>max_length=<span style="color: #ff4500;">100</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># содержимое поста</span><br />
&nbsp; &nbsp; text = models.<span style="color: black;">TextField</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #483d8b;">''</span><span style="color: #483d8b;">'<br />
Класс для админки, тут будут дополнительные атрибуты необходимые для админки<br />
'</span><span style="color: #483d8b;">''</span><br />
<span style="color: #ff7700;font-weight:bold;">class</span> PostAdmin<span style="color: black;">&#40;</span>admin.<span style="color: black;">ModelAdmin</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># в таблице списка постов выводить только колонку title, если вы добавите еще одно имя поля, то и оно выведется</span><br />
&nbsp; &nbsp; list_display = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'title'</span>,<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># связываем эту модель с моделью PostAdmin</span><br />
admin.<span style="color: #dc143c;">site</span>.<span style="color: black;">register</span><span style="color: black;">&#40;</span>Post, PostAdmin<span style="color: black;">&#41;</span></div></div>
<p>После создания файла моделей, вам необходимо запустить синхронизацию с БД, для того чтобы создались структуры данных:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myproject<br />
python manage.py syncdb</div></div>
<blockquote class="info">
<p>
Для более детального изучения команд manage.py введите:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python manage.py <span style="color: #7a0874; font-weight: bold;">help</span></div></div>
<p>Если вас интересует конкретная комманда, например syncdb, то:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python manage.py <span style="color: #7a0874; font-weight: bold;">help</span> syncdb</div></div>
<p>Вы так же можете создавать свои команды, но об этом поговорим не в этот раз.
</p>
</blockquote>
<p><strong>syncdb</strong> создаст таблицы в вашей БД, а также при первой инициализации попросит <em>создать</em> рутовую учетную запись для вашего проекта в django (это будет админский аккаунт):</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Creating table auth_permission<br />
Creating table auth_group_permissions<br />
Creating table auth_group<br />
Creating table auth_user_user_permissions<br />
Creating table auth_user_groups<br />
Creating table auth_user<br />
Creating table auth_message<br />
Creating table django_content_type<br />
Creating table django_session<br />
Creating table django_site<br />
Creating table django_admin_log<br />
Creating table blog_post<br />
<br />
You just installed Django's auth system, which means you don't have any superusers defined.<br />
Would you like to create one now? (yes/no): yes<br />
Username (Leave blank to use 'root'): <br />
E-mail address: mail@example.com<br />
Password: <br />
Password (again): <br />
Superuser created successfully.<br />
Installing index for auth.Permission model<br />
Installing index for auth.Message model<br />
Installing index for admin.LogEntry model</div></div>
<p>Когда вы создадите новый класс модели вам будет необходимо вновь запустить syncdb.<br />
Если вы внесли изменения в уже синхронизированное приложение, а именно в его модель, то syncdb НЕ внесет их в вашу БД, для этого используйте sqlall и другие sql* комманды:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python manage.py sqlall название_приложения <span style="color: #7a0874; font-weight: bold;">&#40;</span>например: blog<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></div>
<p>Или попробуйте расширение для Django <noindex><a rel="nofollow" href="http://code.google.com/p/django-evolution/" >Django Evolution</a></noindex> (для этого необходимо его установить в вашу систему и добавить в INSTALLED_APPS&nbsp;&mdash; &laquo;django_evolution&raquo;).</p>
<h4>Файл урлов</h4>
<p>Для навигации по вашему проекту вам нужен роутер (URL диспетчер).<br />
Отредактируем &laquo;/www/myproject/urls.py&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем админку</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">contrib</span> <span style="color: #ff7700;font-weight:bold;">import</span> admin<br />
<br />
<span style="color: #808080; font-style: italic;"># Makes the patterns() function available</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">conf</span>.<span style="color: black;">urls</span>.<span style="color: black;">defaults</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span><br />
<br />
<span style="color: #808080; font-style: italic;"># импортируем наши вьюхи (см. ниже описание файла вьюх)</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> myproject.<span style="color: black;">blog</span>.<span style="color: black;">views</span> <span style="color: #ff7700;font-weight:bold;">import</span> main_page, get_post<br />
<br />
<span style="color: #808080; font-style: italic;"># Above we used admin.autodiscover() to automatically load the INSTALLED_APPS admin.py modules</span><br />
admin.<span style="color: black;">autodiscover</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
urlpatterns = patterns<span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если ничего не введено, то отдаем управление mainpage вьюхе</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^$'</span>, main_page<span style="color: black;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если передан id поста, то отдаем управление get_post вьюхе</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^post/([0-9]{1,5})'</span>, get_post<span style="color: black;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Если введен /admin/, то идем в админку</span><br />
&nbsp; &nbsp; <span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'^admin/'</span>, include<span style="color: black;">&#40;</span>admin.<span style="color: #dc143c;">site</span>.<span style="color: black;">urls</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,<br />
<span style="color: black;">&#41;</span></div></div>
<p>Вы конечно можете отредактировать локальный для приложения &laquo;blog&raquo;&nbsp;&mdash; urls.py (&laquo;/www/myproject/blog/urls.py&raquo;), но тогда вам надо будет импортировать &laquo;/www/myproject/blog/urls.py&raquo; в корневом &laquo;urls.py&raquo;. Либо вы можете его определить в settings.py (ROOT_URLCONF).</p>
<h4>Файл вьюхи</h4>
<p>Ту роль, которую играет &laquo;Controller&raquo; в MVC, в Django играет роль View. Почему это так читайте <noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/faq/general/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names" >тут</a></noindex>.<br />
Отредактируем &laquo;/www/myproject/blog/views.py&raquo;:</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># ~*~ coding: utf-8 ~*~</span><br />
<br />
<span style="color: #808080; font-style: italic;"># функция генерирующая 404 страницу</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">http</span> <span style="color: #ff7700;font-weight:bold;">import</span> Http404<br />
<br />
<span style="color: #808080; font-style: italic;"># функция отрисовки страницы, принимающая путь до шаблона и данные помещенные в шаблон</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">shortcuts</span> <span style="color: #ff7700;font-weight:bold;">import</span> render_to_response<br />
<br />
<span style="color: #808080; font-style: italic;"># наша модель</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> myproject.<span style="color: black;">blog</span>.<span style="color: black;">models</span> <span style="color: #ff7700;font-weight:bold;">import</span> Post<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> main_page <span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># Получаем список постов</span><br />
&nbsp; &nbsp; posts = Post.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># отрисовываем</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">'list.html'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;posts&quot;</span>: &nbsp;posts<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_post <span style="color: black;">&#40;</span>request, post_id<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># выбираем конкретный пост, pk - primary key</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; post = Post.<span style="color: black;">objects</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span>pk=post_id<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span> Post.<span style="color: black;">DoesNotExist</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># если такого поста нет, то генерируем 404</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">raise</span> Http404<br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># отрисовываем</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> render_to_response<span style="color: black;">&#40;</span><span style="color: #483d8b;">'single.html'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;title&quot;</span>: &nbsp;post.<span style="color: black;">title</span>, <span style="color: #483d8b;">&quot;text&quot;</span>: post.<span style="color: black;">text</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span></div></div>
<h3>Вывод в шаблоне</h3>
<p>В Django очень мощный и гибкий шаблонизатор, у него даже есть аналог на PHP&nbsp;&mdash; <strong>Twig</strong>, что говорит о его удобстве (был бы неудобным&nbsp;&mdash; не копировали бы), хотя <strong>Twig</strong> по слухам сильно хуже.<br />
Однако, есть более крутой шаблонизатор для Django&nbsp;&mdash; <noindex><a rel="nofollow" href="http://jinja.pocoo.org/2/" >Jinja2</a></noindex>, с более высокой производительностью и более гибкими возможностями. Описывать <strong>Jinja</strong> я не буду, ведь не это цель сего поста, поэтому делюсь только ссылочками:</p>
<ul>
<li><noindex><a rel="nofollow" href="http://vostryakov.ru/blog/13-perehod-ot-django-templejtovk-jinja2/" >Переход от Django темплэйтов к Jinja2</a></noindex></li>
<li><noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/ref/templates/api/#using-an-alternative-template-language" >Django: Using an alternative template language</a></noindex></li>
</ul>
<p>С более полными возможностями <strong>Django Template</strong> вы можете познакомится на <noindex><a rel="nofollow" href="http://docs.djangoproject.com/en/dev/topics/templates/" >официальной странице</a></noindex>.</p>
<p>В <strong>Django Template</strong> поддерживается наследование, поэтому мы напишем общий шаблон и будем его использовать <strong>base.html</strong>:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;content-type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=utf-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>{% block title %}Default{% endblock %} / MyProject<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span><br />
&nbsp; &nbsp; {% block content %}<br />
&nbsp; &nbsp; {% endblock %}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></div></div>
<p>Шаблон вывода списка постов <strong>list.html</strong>:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">{% extends &quot;base.html&quot; %}<br />
<br />
{% block title %}List!{% endblock %}<br />
<br />
{% block content %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">ul</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;list-style-type:none&quot;</span>&gt;</span><br />
{% for post in posts %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">li</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;padding-left:10px;{% if forloop.counter0|divisibleby:&quot;</span><span style="color: #cc66cc;">4</span><span style="color: #ff0000;">&quot; %}background-color:#E1F3C9{% endif %}&quot;</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;/post/{{ post.id }}/&quot;</span>&gt;</span>{{ post.title }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span>{{ post.text }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">li</span>&gt;</span><br />
{% endfor %}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">ul</span>&gt;</span><br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{% endblock %}</div></div>
<p>Шаблон вывода одной записи <strong>single.html</strong>:</p>
<div class="codecolorer-container html4strict default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="html4strict codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">{% extends &quot;base.html&quot; %}<br />
<br />
{% block title %}{{ title }}{% endblock %}<br />
<br />
{% block content %}<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>{{ title }}<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span><br />
<br />
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{{ text }}<br />
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span><br />
{% endblock %}</div></div>
<h3>Nginx</h3>
<p>Теперь настроим Nginx для того, чтобы запуская &laquo;manage.py runserver&raquo; нам не прописывать порт в URL и чтобы использовать нормальное имя хоста, хотя вы может вполне без это обойтись.<br />
Но я очень рекомендую использовать Nginx.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">server {<br />
&nbsp; &nbsp; listen 80;<br />
&nbsp; &nbsp; server_name myproject.loc;<br />
<br />
&nbsp; &nbsp; location ^~ /admin-media {<br />
&nbsp; &nbsp; &nbsp; &nbsp; alias /usr/local/lib/python2.6/dist-packages/django/contrib/admin/media;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location /static/ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; root /www/myproject/static/;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location ~* \.(jpg|jpeg|gif|png|ico|css|zip|js|swf)$ {<br />
&nbsp; &nbsp; &nbsp; &nbsp; root /www/myproject/static/;<br />
&nbsp; &nbsp; &nbsp; &nbsp; expires 7d;<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; location / {<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://127.0.0.1:8001/;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_redirect off;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header Host $host;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Real-IP $remote_addr;<br />
&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
&nbsp; &nbsp; }<br />
}</div></div>
<p>Добавить в &laquo;/etc/hosts&raquo; ваш хост:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">127.0.0.1 &nbsp; &nbsp; &nbsp;myproject.loc</div></div>
<p>И перезагрузить Nginx:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># в новых версиях nginx можно послать сигнал</span><br />
nginx <span style="color: #660033;">-s</span> reload<br />
<br />
<span style="color: #666666; font-style: italic;"># или для ubuntu/debian через скрипт инициализации</span><br />
service nginx restart<br />
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx restart<br />
<br />
<span style="color: #666666; font-style: italic;"># или для freebsd</span><br />
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>nginx restart</div></div>
<p>Запускаем веб-сервер проекта на 8001 порту, так как мы туда будем проксировать из Nginx:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>myproject<br />
python manage.py runserver <span style="color: #000000;">8001</span></div></div>
<p>Теперь зайдите в админку (<noindex><a rel="nofollow" href="http://myproject.loc/admin/" >http://myproject.loc/admin/</a></noindex>), введите вашу &laquo;root&raquo; учетку, которую создавали при syncdb.</p>
<blockquote class="download">
<p>Вы можете скачать архив с исходниками проекта <a href="/files/django-myproject/myproject-20100526.tgz">тут</a></p>
</blockquote>
<p>Вот мы и познакомились с первым приложение на Django, как я и обещал в начале этого поста следующая статья будет о <strong>ManyToMany</strong>, где мы подключим к нашему &laquo;Блогу&raquo; возможность создавать и выводить теги, а также расскажу более полно о возможностях моделях и ORM, View и о URL диспетере.</p>
<p>P.S. Пост дописывал в торопях, если найдете любые ошибки&nbsp;&mdash; обязательно отпишитесь в комментарии, спасибо!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/django-first-app/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</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; font-style: italic;"># node example.js</span></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; font-style: italic;">#node --debug server.js</span></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>10</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> int<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> int<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> varchar<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> int<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>5</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>8</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; font-style: italic;"># make 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>..9, 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>
<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; font-style: italic;"># indexer --config /home/sphinx/sphinx.conf --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; font-style: italic;"># indexer --config /home/sphinx/sphinx.conf --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; font-style: italic;"># search –-config /home/sphinx/sphinx.conf искомая комбинация</span></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; font-style: italic;"># searchd –-config /home/sphinx/sphinx.conf</span></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>165</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>
<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>51</slash:comments>
		</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>2</slash:comments>
		</item>
		<item>
		<title>Java. Наша первая программа</title>
		<link>http://adw0rd.ru/2009/java-first-programm/</link>
		<comments>http://adw0rd.ru/2009/java-first-programm/#comments</comments>
		<pubDate>Wed, 20 May 2009 00:14:06 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Java. Изучаем вместе!]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ООП]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=2519</guid>
		<description><![CDATA[Продолжение статьи &#171;Java. Установка среды разработки и Eclipse IDE&#187;, в которой мы напишем нашу первую программу на языке Java. В Java для работы с объектами используются ссылки на объекты. Объекты хранятся в куче (пул памяти общего назначения, по скорости уступает стеку), а данные с примитивным типом хранятся в стеке (область хранения данных в RAM, обращение [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/java-first-programm/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/java1.png" alt="java" title="java" width="58" height="108" class="alignright size-full wp-image-2472" style="padding:0px 30px 0px 20px;" /></a></p>
<p>Продолжение статьи &laquo;<a href="http://adw0rd.ru/2009/java-install-jdk-and-eclipse/" >Java. Установка среды разработки и Eclipse IDE</a>&raquo;, в которой мы напишем нашу первую программу на языке <strong>Java</strong>.</p>
<p>В <strong>Java</strong> для работы с объектами используются ссылки на объекты. Объекты хранятся в куче (пул памяти общего назначения, по скорости уступает стеку), а данные с примитивным типом хранятся в стеке (область хранения данных в RAM, обращение к данным происходит по указателю стека).</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003399;">String</span> x <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;test&quot;</span><span style="color: #339933;">;</span></div></div>
<p>В <strong>x</strong> храниться ссылка на объект String со значением &laquo;test&raquo;.</p>
<p>Объекты из кучи удаляются сами, сборщиком мусора, так что делать это явно нет необходимости.</p>
<h3>Типы данных</h3>
<p>В Java существую так же и примитивные типы данных: <strong>boolean, char, byte, short, int, float, long, double и void</strong>. Данные этих типов хранятся в стеке. Все числовые значения являются знаковыми!</p>
<p>Остальные типы данных являются классами (String, Character и т.д.) и производные их объекты хранятся в куче.</p>
<h3>Класс и члены класса</h3>
<p>Имя класса должно начинаться с заглавной буквы. Имена методов и свойств (переменных класса) должны начинаться в нижнем регистре, за исключением конструктора класса, который имеет одинаковое имя с именем класса.</p>
<p><strong>UPD:</strong> Все что сказано выше, касается стиля, никто вам не запретит начинать имя класса с прописной буквы...</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestClass<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; testMethod<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> testMethod <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Date: &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">int</span> x <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">double</span> y<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TestClass2<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> TestClass2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// Конструктор</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Статический метод <strong>main</strong> запускается первым, это так называемая точка входа программы.</p>
<p>Конструктор никогда ничего не возвращает! Он необходим для инициализации объекта.</p>
<p>Статические члены класса в Java принято вызывать в таком виде:</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">Class.function() и Class.var</div></div>
<p>а для нестатических членов класса не доступна возможность обращаться к членам по имени класса, доступна только при обращению к объекту:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">Class</span> var <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000000; font-weight: bold;">Class</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">Class</span>.<span style="color: #006633;">method</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// не доступно</span><br />
var.<span style="color: #006633;">method</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// доступно</span></div></div>
<p><span id="more-2519"></span></p>
<h3>Инкапсуляция</h3>
<p><noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D0%BA%D0%B0%D0%BF%D1%81%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)" >Сокрытие данных</a></noindex> осуществляется при помощи трех ключевых слов:</p>
<ol>
<li><strong>public</strong>&nbsp;&mdash; член класса доступен для всех</li>
<li><strong>private</strong>&nbsp;&mdash; доступ к члену имеют только члены класса</li>
<li><strong>protected</strong>&nbsp;&mdash; доступ имеют как члены класса, так и потомки этого класса (см. наследование)</li>
</ol>
<h3>Пример нашей программы</h3>
<p>Так как для работы нам нужно подключать пакеты (библиотеки классов), например для работы с датой, то необходимо использовать ключевое слово <strong>import</strong>.</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.*</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #008000; font-style: italic; font-weight: bold;">/**<br />
&nbsp;* Класс вывода текущей даты<br />
&nbsp;* @author adw0rd<br />
&nbsp;*/</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JavaTest<br />
<span style="color: #009900;">&#123;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #008000; font-style: italic; font-weight: bold;">/**<br />
&nbsp; &nbsp; &nbsp;* @param args<br />
&nbsp; &nbsp; &nbsp;* @return Date Stamp<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Date: &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">Date</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Жмем в <strong>Eclipse</strong>&nbsp;&mdash; <strong>Ctrl+F11</strong> (или <strong>Run->Run</strong>) и запускаем программу, в окне <strong>Console</strong> выведется текущая дата и время. При сохранении файла, Eclipse откомпилирует его вновь, если в коде нет ошибок.</p>
<p>Так же можно откомпилировать через <strong>javac.exe</strong> и запустить через <strong>java.exe</strong>, вам решать, но мне удобнее работать в IDE.</p>
<h3>Комментарии</h3>
<p>Доступны в Java два вида комментариев:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// однострочный</span><br />
<br />
<span style="color: #666666; font-style: italic;">/*<br />
многострочный<br />
*/</span></div></div>
<p>Так же для документирования классов и членов класса нужно пользоваться форматом <strong>Javadoc</strong>, доступно множество команд, вот некоторые из них:</p>
<div class="codecolorer-container java default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000; font-style: italic; font-weight: bold;">/**<br />
&nbsp;* @author ИмяАвтора (И дополнительная информация, например e-mail)<br />
&nbsp;* @see ИмяКласса (Ссылка на другие классы)<br />
&nbsp;* @version Версия<br />
&nbsp;* @param Входные параметры метода<br />
&nbsp;* @return Описание того, что возвращает метод<br />
&nbsp;*/</span></div></div>
<p>На сегодня все, в следующий раз рассмотрим <strong>основные и условные операторы</strong>, а также <strong>циклы</strong> в Java.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/java-first-programm/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Java. Установка среды разработки и Eclipse IDE</title>
		<link>http://adw0rd.ru/2009/java-install-jdk-and-eclipse/</link>
		<comments>http://adw0rd.ru/2009/java-install-jdk-and-eclipse/#comments</comments>
		<pubDate>Wed, 20 May 2009 00:13:09 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Java. Изучаем вместе!]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDK]]></category>
		<category><![CDATA[ООП]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=2457</guid>
		<description><![CDATA[Решил изучить Java и заодно написать ряд статей &#171;Java. Изучаем вместе!&#187;, может кому пригодится. Изучаю этот замечательный язык по книгам подаренных девушкой на день Святого Валентина. Я не собираюсь перепечатывать эти книги, по мере надобности буду освещать некоторые аспекты языка и сред разработки. Итак, преступим! Для работы нам понадобится JDK и среда разработки Eclipse. Установка [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/java-install-jdk-and-eclipse/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/java1.png" alt="java" title="java" width="58" height="108" class="alignright size-full wp-image-2472" style="padding:0px 30px 0px 20px;" /></a></p>
<p>Решил изучить <strong>Java</strong> и заодно написать ряд статей <strong>&laquo;Java. Изучаем вместе!&raquo;</strong>, может кому пригодится. Изучаю этот замечательный язык по книгам подаренных девушкой <a href="http://adw0rd.ru/2009/java-and-sv/" >на день Святого Валентина</a>.</p>
<p><img src="http://adw0rd.ru/wp-content/uploads/2009/02/1.jpg" alt="Философия Java" style="padding:2px;border: dotted #c4c4c4 2px;" /> <img src="http://adw0rd.ru/wp-content/uploads/2009/02/2.jpg" alt="Гибкая разработки приложений на Java" style="border: dotted #c4c4c4 2px;" /></p>
<p>Я не собираюсь перепечатывать эти книги, по мере надобности буду освещать некоторые аспекты языка и сред разработки.</p>
<p>Итак, преступим! Для работы нам понадобится <strong>JDK</strong> и среда разработки <strong>Eclipse</strong>.</p>
<h3>Установка JDK</h3>
<blockquote>
<p>Java Development Kit, сокращенно JDK — бесплатно распространяемый фирмой Sun комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE). В состав JDK не входит интегрированная среда разработки на Java (IDE), поэтому разработчик, использующий только JDK, вынужден использовать внешний текстовый редактор и компилировать свои программы, используя утилиты командной строки.</p>
<p><noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/JDK" >http://ru.wikipedia.org/wiki/JDK</a></noindex>
</p>
</blockquote>
<p>Качаем <noindex><a rel="nofollow" href="http://java.sun.com/javase/downloads/index.jsp" >JDK</a></noindex> и устанавливаем. Я качал дистрибутив <strong>&laquo;JDK 6 Update 13 with Java EE&raquo;</strong>.</p>
<p>Пропишем путь до исполняемых файлов среды разработки в системную переменную <strong>PATH</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">C:\Program Files\Sun\SDK\jdk\bin</div></div>
<p>После установки нам доступны утилиты <strong>javac.exe</strong>&nbsp;&mdash; для компиляции нашей программы и <strong>java.exe</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">#&gt; javac JavaTest.java<br />
#&gt; java JavaTest.class</div></div>
<h3>Установка Eclipse IDE</h3>
<p>У меня была установлена сборка <strong>Eclipse PDT2</strong> для работы с PHP, а также <strong>Spket</strong> для работы с JavaScript. Я доустановил набор плагинов <strong>Java Development</strong> через <strong>Help -> Software Updates… -> Available Software</strong>.</p>
<p><a href="http://adw0rd.ru/wp-content/uploads/2009/05/java-install.jpg" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/java-install-300x208.jpg" alt="java-install" title="java-install" width="300" height="208" class="alignnone size-medium wp-image-2491" /></a></p>
<p>После чего перезагрузил Eclipse и выбрал перспективу <strong>Java</strong>. Далее <strong>New -> Java Project</strong> и заполнил все необходимые поля. В появившемся проекте, щелкнул по <strong>&laquo;src&raquo;</strong>, создал класс (<strong>New -> Class</strong>) и заполнил необходимы поля.</p>
<p><a href="http://adw0rd.ru/wp-content/uploads/2009/05/new-class.jpg" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/new-class-300x271.jpg" alt="new-class" title="new-class" width="300" height="271" class="alignnone size-medium wp-image-2493" /></a></p>
<p>Все, готово, приступим к созданию <a href="http://adw0rd.ru/2009/java-first-programm/" >нашей первой программы</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/java-install-jdk-and-eclipse/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eclipse плагин RSE для работы с FTP и SFTP</title>
		<link>http://adw0rd.ru/2009/eclipse-rse/</link>
		<comments>http://adw0rd.ru/2009/eclipse-rse/#comments</comments>
		<pubDate>Tue, 19 May 2009 20:40:38 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[SFTP]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=2443</guid>
		<description><![CDATA[Понадобилась возможность работать с SFTP в Eclipse. Погуглив наткнулся на статью &#171;Работа с FTP через Eclipse&#187;, человек очень расхваливал плагин Remote System Explorer (RSE). Я заинтересовался и решил установил себе этот плагин! Установка У меня версия Eclipse 3.4.2, поэтому ставим через Help -> Software Updates... -> Available Software и вбиваем в фильтр &#171;rse&#187;. После чего [...]]]></description>
			<content:encoded><![CDATA[<p>Понадобилась возможность работать с <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/SFTP" >SFTP</a></noindex> в <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/Eclipse" >Eclipse</a></noindex>. Погуглив наткнулся на статью &laquo;<noindex><a rel="nofollow" href="http://xaoc-pro.ru/2008/10/30/rabota_s_ftp_cherez_eclipse/" >Работа с FTP через Eclipse</a></noindex>&raquo;, человек очень расхваливал плагин <noindex><a rel="nofollow" href="http://www.eclipse.org/dsdp/tm/" >Remote System Explorer</a></noindex> (RSE). Я заинтересовался и решил установил себе этот плагин!</p>
<h3>Установка</h3>
<p>У меня версия Eclipse 3.4.2, поэтому ставим через <strong>Help -> Software Updates... -> Available Software</strong> и вбиваем в фильтр &laquo;rse&raquo;.</p>
<p><a href="http://adw0rd.ru/wp-content/uploads/2009/05/install1.jpg" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/install1-300x208.jpg" alt="Install RSE" title="Install RSE" width="300" height="208" class="alignnone size-medium wp-image-2446" /></a></p>
<p>После чего отмечаем пункты:</p>
<ul>
<li>RSE User Actions</li>
<li>RSE FTP Services</li>
<li>RSE SSH Services</li>
</ul>
<p>Далее &laquo;Install&raquo; и соглашаемся с лицензионными соглашениями. Перегружаемся и все, установка завершена!</p>
<h3>Использование</h3>
<p>Выбираем перспективу &laquo;Remote System Explorer perspective&raquo; и создаем новое подключение (New Connection), вбиваем параметры для подключения и пользуемся с удовольствием!</p>
<p><a href="http://adw0rd.ru/wp-content/uploads/2009/05/perspective.jpg" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/perspective-274x300.jpg" alt="perspective" title="perspective" width="274" height="300" class="alignnone size-medium wp-image-2454" /></a></p>
<blockquote class="info">
<p>
Более подробно:</p>
<p>Выбираете перспективу &laquo;Remote System Explorer&raquo;, далее щелкаете правой клавишей мыши в окне &laquo;Remote Systems&raquo; (если такого окна у вас нет, то &laquo;Window -> Show View -> Remote Systems&raquo; и оно отобразится) и выбираете &laquo;New -> Connection...&raquo;.</p>
<p>Далее, выбираете тип подключения, для sftp&nbsp;&mdash; &laquo;SSH Only&raquo;, а для ftp&nbsp;&mdash; &laquo;FTP Only&raquo;.<br />
Нажимаете &laquo;Next&raquo;, после чего вбиваете &laquo;Host&raquo; и указываете имя и описание для вашего подключения.</p>
<p>После чего в &laquo;Remote Systems&raquo; выбираете созданное вами подключение и разворачиваете дерево подключения, или кликаете правой клавишей мыши по подключению и выбираете в контекстном меню пункт &laquo;Connect&raquo;. В этот момент, если необходимо указать логин/пароль RSE у вас его спросит.<br />
</blockquote >
<p>Если у вас не стандартный порт, например для ssh не 22, а 2244, то вы можете сменить порт в &laquo;Show in table&raquo; (Правой клавишей мыши по подключению и выбираете &laquo;Show in table&raquo;).</p>
<p>При сохранении файла, плагин заливаете файл на сервер. И еще, если Eclipse жалуется на секурность, то скорее всего проблема в правах на файлы.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/eclipse-rse/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
