<?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>Ильдар Галиуллин</title>
	<atom:link href="http://blog.ildart.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ildart.ru</link>
	<description>Блог о компьютерах, интернете, фотографии, веб-разработке и просто о жизни</description>
	<lastBuildDate>Tue, 20 Mar 2012 03:45:52 +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>Пишем свою CMS, часть 4</title>
		<link>http://blog.ildart.ru/2012/03/20/pishem-svoyu-cms-4/</link>
		<comments>http://blog.ildart.ru/2012/03/20/pishem-svoyu-cms-4/#comments</comments>
		<pubDate>Tue, 20 Mar 2012 03:45:52 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1325</guid>
		<description><![CDATA[Панель управления или просто админка Пришло время сделать святая святых &#8211; админку сайта. Возможности ее будут такими: добавление, удаление, редактирование страниц и все. Эта версия CMS, как я уже неоднократно говорил, будет типа сайта-визитки с минимумом функционала. Начнем с авторизации. &#8230; <a href="http://blog.ildart.ru/2012/03/20/pishem-svoyu-cms-4/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Панель управления или просто админка</p>
<p>Пришло время сделать святая святых &#8211; админку сайта. Возможности ее будут такими: добавление, удаление, редактирование страниц и все. Эта версия CMS, как я уже неоднократно говорил, будет типа сайта-визитки с минимумом функционала.</p>
<p>Начнем с авторизации. При входе в админку будут запрошены логин-пароль администратора:</p>
<blockquote><p><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"><small><a href="http://s-c.me/25012/s">Copy Source</a> | <a href="http://s-c.me/25012/h">Copy HTML</a></small></span></code></p>
<ol><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"></p>
<li>&lt;div style=<span style="color: #008000;">"position:absolute;width:220px;height:150px;left:50%;top:50%;margin-left:-150px;margin-top:-100px;background:#777;color:#eee;border:solid 1px black;padding:10px;font-family:Tahoma,Arial,FreeSans,Garuda,Utkal,sans-serif;overflow:auto"</span>&gt;</li>
<li> &lt;form method=<span style="color: #008000;">"post"</span> action=<span style="color: #008000;">"index.php"</span>&gt;</li>
<li> Логин:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"text"</span> size=<span style="color: #008000;">"30"</span> name=<span style="color: #008000;">"login"</span>&gt;&lt;br&gt;&lt;br&gt;</li>
<li> Пароль:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"password"</span> name=<span style="color: #008000;">"pass"</span> size=<span style="color: #008000;">"30"</span>&gt;&lt;br&gt;&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"submit"</span> name=<span style="color: #008000;">"auth"</span> value=<span style="color: #008000;">"Войти"</span>&gt;</li>
<li> &lt;/form&gt;</li>
<li>&lt;/div&gt;</li>
<p></span></code></ol>
<p><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"> </span></code><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"> </span></code></p></blockquote>
<p>Форма входа будет выглядить вот так:<a href="http://blog.ildart.ru/wp-content/uploads/2012/03/adm-auth-form.jpg"><img class="aligncenter size-full wp-image-1439" title="adm-auth-form" src="http://blog.ildart.ru/wp-content/uploads/2012/03/adm-auth-form.jpg" alt="" width="270" height="201" /></a><br />
Обработчик формы будет работать по такому принципу: если авторизация прошла успешно попадаем в админку, если нет выводим сообщение об ошибке. Также необходимо предусмотреть выход из админки, т. е. после работы в админке нажимаем кнопку выход, авторизацию сбрасываем и вновь показываем форму ввода логин-пароля.</p>
<p>Теперь содержимое файла /admin/index.php будет таким:</p>
<blockquote><p><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"><small><a href="http://s-c.me/26111/s">Copy Source</a> | <a href="http://s-c.me/26111/h">Copy HTML</a></small> </span></code></p>
<ol><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"></p>
<li><span style="color: #cc6633;">&lt;?</span></li>
<li><span style="color: #0000ff;">include</span> <span style="color: #cc6633;">$_SERVER</span>[<span style="color: #008000;">'DOCUMENT_ROOT'</span>].<span style="color: #008000;">"/config.php"</span>; <span style="color: #696969;">//включаем файл настроек</span></li>
<li><span style="color: #0000ff;">include</span> <span style="color: #cc6633;">$_SERVER</span>[<span style="color: #008000;">'DOCUMENT_ROOT'</span>].<span style="color: #008000;">"/inc/db_connect.php"</span>; <span style="color: #696969;">//подключение к серверу MySQL и выбор БД</span></li>
<li><span style="color: #cc6633;">$user_status</span> = <span style="color: #008000;"> 0</span>; <span style="color: #696969;">//обнуляем статус пользователя, 0 - пользователь не авторизован</span></li>
<li><span style="color: #696969;">//Читаем куки и смотрим, есть ли в базе пользователь с таким паролем, и проверяем были ли нажаты кнопки вход и выход</span></li>
<li><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #cc6633;">$_COOKIE</span>[<span style="color: #008000;">'Login'</span>]) &amp; <span style="color: #0000ff;">isset</span>(<span style="color: #cc6633;">$_COOKIE</span>[<span style="color: #008000;">'Password'</span>]) &amp; !<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'auth'</span>] &amp; !<span style="color: #cc6633;">$_GET</span>[<span style="color: #008000;">'exit'</span>]){</li>
<li> <span style="color: #696969;">//запрос</span></li>
<li> <span style="color: #cc6633;">$sql</span> = <a href="http://www.php.net/manual/en/function.mysql-query.php">mysql_query</a>(<span style="color: #008000;">"SELECT * FROM "</span>.<span style="color: #cc6633;">$db_prefix</span>.<span style="color: #008000;">"_users WHERE login = '"</span>.<span style="color: #cc6633;">$_COOKIE</span>[<span style="color: #008000;">'Login'</span>].<span style="color: #008000;">"' &amp;&amp; password = '"</span>.<span style="color: #cc6633;">$_COOKIE</span>[<span style="color: #008000;">'Password'</span>].<span style="color: #008000;">"'"</span>);</li>
<li> <span style="color: #696969;">//если есть совпадение, авторизуем пользователя</span></li>
<li> <span style="color: #0000ff;">if</span> (<a href="http://www.php.net/manual/en/function.mysql-num-rows.php">mysql_num_rows</a>(<span style="color: #cc6633;">$sql</span>) &gt; <span style="color: #008000;"> 0</span>){</li>
<li> <span style="color: #696969;">//собираем все данные о пользователе в массив</span></li>
<li> <span style="color: #cc6633;">$userinfo</span> = <a href="http://www.php.net/manual/en/function.mysql-fetch-array.php">mysql_fetch_array</a>(<span style="color: #cc6633;">$sql</span>);</li>
<li> <span style="color: #696969;">//устанавливаем куки</span></li>
<li> SetCookie(<span style="color: #008000;">"Login"</span>,<span style="color: #cc6633;">$userinfo</span>[<span style="color: #008000;">'login'</span>]);</li>
<li> SetCookie(<span style="color: #008000;">"Password"</span>,<span style="color: #cc6633;">$userinfo</span>[<span style="color: #008000;">'password'</span>]);</li>
<li> <span style="color: #cc6633;">$user_status</span> = <span style="color: #008000;">1</span>; <span style="color: #696969;">//статус пользователя, 1 = админ авторизован</span></li>
<li> }</li>
<li>}</li>
<li><span style="color: #696969;">//если была нажата кнопка из формы авторизации</span></li>
<li><span style="color: #0000ff;">if</span> (<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'auth'</span>]){</li>
<li> <span style="color: #696969;">//ищем совпадение пары логин-пароль в таблице</span></li>
<li> <span style="color: #cc6633;">$auth</span> = <a href="http://www.php.net/manual/en/function.mysql-query.php">mysql_query</a> (<span style="color: #008000;">"SELECT * FROM "</span>.<span style="color: #cc6633;">$db_prefix</span>.<span style="color: #008000;">"_users WHERE login = '"</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'login'</span>].<span style="color: #008000;">"' &amp;&amp; password = '"</span>.<span style="color: #cc6633;">$_POST</span> [<span style="color: #008000;">'pass'</span>].<span style="color: #008000;">"'"</span>);</li>
<li> <span style="color: #696969;">//если есть совпадение, авторизуем пользователя</span></li>
<li> <span style="color: #0000ff;">if</span>(<a href="http://www.php.net/manual/en/function.mysql-num-rows.php">mysql_num_rows</a>(<span style="color: #cc6633;">$auth</span>) &gt; <span style="color: #008000;"> 0</span>){</li>
<li> <span style="color: #696969;">//собираем все данные о пользователе в массив</span></li>
<li> <span style="color: #cc6633;">$userinfo</span> = <a href="http://www.php.net/manual/en/function.mysql-fetch-array.php">mysql_fetch_array</a>(<span style="color: #cc6633;">$auth</span>);</li>
<li> <span style="color: #696969;">//устанавливаем куки</span></li>
<li> SetCookie(<span style="color: #008000;">"Login"</span>,<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'login'</span>]);</li>
<li> SetCookie(<span style="color: #008000;">"Password"</span>,<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'pass'</span>]);</li>
<li> <span style="color: #cc6633;">$user_status</span> = <span style="color: #008000;">1</span>; <span style="color: #696969;">//статус пользователя, 1 - авторизован админ</span></li>
<li> }</li>
<li> <span style="color: #696969;">//если если пара логин-пароль не совпала, выводим сообщение об ошибке</span></li>
<li> <span style="color: #0000ff;">else</span>{</li>
<li> <span style="color: #0000ff;">echo</span> <span style="color: #008000;">"Такой пользователь не существует или пароль не верный."</span>;</li>
<li> }</li>
<li>}</li>
<li><span style="color: #696969;">//если нажата кнопка выход</span></li>
<li><span style="color: #0000ff;">if</span> (<span style="color: #cc6633;">$_GET</span>[<span style="color: #008000;">'exit'</span>]){</li>
<li> <span style="color: #696969;">//удаляем куки</span></li>
<li> SetCookie(<span style="color: #008000;">"Login"</span>,<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'login'</span>]);</li>
<li> SetCookie(<span style="color: #008000;">"Password"</span>,<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'pass'</span>]);</li>
<li>}</li>
<li><span style="color: #696969;">//если статус пользователя не изменился, выводим форму авторизации </span></li>
<li><span style="color: #0000ff;">if</span> (<span style="color: #cc6633;">$user_status</span> == <span style="color: #008000;"> 0</span>){</li>
<li><span style="color: #cc6633;">?&gt;</span></li>
<li>&lt;!--здесь форма входа, код писал выше--&gt;</li>
<li><span style="color: #cc6633;">&lt;?</span></li>
<li>}</li>
<li><span style="color: #696969;">//если пользователь авторизовался, показываем ему админку</span></li>
<li><span style="color: #0000ff;">if</span> (<span style="color: #cc6633;">$user_status</span> == <span style="color: #008000;">1</span>){</li>
<li><span style="color: #cc6633;">?&gt;</span></li>
<li>&lt;!--здесь показываем админку--&gt;</li>
<li><span style="color: #cc6633;">&lt;?</span></li>
<li>}</li>
<li><span style="color: #cc6633;">?&gt;</span></li>
<p></span></code></ol>
<p><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"> </span></code><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"> </span></code></p></blockquote>
<p>На 52-й строчке вставляем содержимое админки, которое должно быть видно после авторизации. Тут все ограничивается вашей фантазией <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Для начала покажем имя пользователя, который авторизовался и кнопку выхода.</p>
<blockquote><p><code><span style="font-family: &amp;amp;quot; color: black; font-size: x-small;"><small><a href="http://s-c.me/26112/s">Copy Source</a> | <a href="http://s-c.me/26112/h">Copy HTML</a></small> </span></code></p>
<ol><code><span style="font-family: &amp;amp;quot; color: black; font-size: x-small;"></p>
<li>&lt;!DOCTYPE HTML PUBLIC <span style="color: #008000;">"-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"</span>&gt;</li>
<li>&lt;html&gt;</li>
<li>&lt;head&gt;</li>
<li> &lt;title&gt;Панель управления сайтом&lt;/title&gt;</li>
<li> &lt;meta http-equiv=<span style="color: #008000;">"Content-Language"</span> content=<span style="color: #008000;">"ru"</span>&gt;</li>
<li> &lt;meta http-equiv=<span style="color: #008000;">"Content-Type"</span> content=<span style="color: #008000;">"text/html;charset=utf-8"</span>&gt;</li>
<li> &lt;link rel=<span style="color: #008000;">"shortcut icon"</span> href=<span style="color: #008000;">"/favicon.ico"</span>&gt;</li>
<li> &lt;link rel=<span style="color: #008000;">"stylesheet"</span> type=<span style="color: #008000;">"text/css"</span> href=<span style="color: #008000;">"/admin/style.css"</span>&gt;</li>
<li>&lt;/head&gt;</li>
<li>&lt;body&gt;</li>
<li>&lt;div <span style="color: #0000ff;">class</span>=<span style="color: #008000;">"content-top"</span>&gt;</li>
<li> &lt;p&gt;Вы зашли как <span style="color: #cc6633;">&lt;?</span> <span style="color: #0000ff;">echo</span> <span style="color: #cc6633;">$userinfo</span>[<span style="color: #008000;">'login'</span>]; <span style="color: #cc6633;">?&gt;</span>. &lt;a href=<span style="color: #008000;">"?exit=ok"</span>&gt;Выйти&lt;/a&gt;&lt;/p&gt;</li>
<li>&lt;/div&gt;</li>
<p></span></code></ol>
<p><code><span style="font-family: &amp;amp;quot; color: black; font-size: x-small;"> </span></code></p></blockquote>
<p>Основной каркас у нас готов. Осталось прикрутить функциональную часть, а именно: добавление, изменение и удаление страниц.</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC+%D1%81%D0%B2%D0%BE%D1%8E+CMS%2C+%D1%87%D0%B0%D1%81%D1%82%D1%8C+4+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1325" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/03/20/pishem-svoyu-cms-4/&amp;t=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC+%D1%81%D0%B2%D0%BE%D1%8E+CMS%2C+%D1%87%D0%B0%D1%81%D1%82%D1%8C+4" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/03/20/pishem-svoyu-cms-4/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Решение проблем с Samba</title>
		<link>http://blog.ildart.ru/2012/03/17/reshenie-problem-s-samba/</link>
		<comments>http://blog.ildart.ru/2012/03/17/reshenie-problem-s-samba/#comments</comments>
		<pubDate>Sat, 17 Mar 2012 08:35:27 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Софт]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1426</guid>
		<description><![CDATA[После публикации статьи по установке и настройке Samba мне стали часто задавать вопросы почему у них ничего не работает. Часто встречались очень простые ошибки, например, лишние пробелы или отсутствие сети. Предлагаю вам несколько тестов работоспособности Samba, выполнив которые вы поймете, &#8230; <a href="http://blog.ildart.ru/2012/03/17/reshenie-problem-s-samba/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>После публикации статьи по <a href="http://blog.ildart.ru/2011/05/25/home-ubuntu-server-3/">установке и настройке Samba</a> мне стали часто задавать вопросы почему у них ничего не работает. Часто встречались очень простые ошибки, например, лишние пробелы или отсутствие сети.</p>
<p>Предлагаю вам несколько тестов работоспособности Samba, выполнив которые вы поймете, что делаете не так.<span id="more-1426"></span>Будем считать, что у вас есть сервер с ip-адресом 192.168.1.1 и ваш рабочий компьютер с адресом 192.168.1.2.</p>
<p>После того как вы настроите самбу как вам нужно, выполните в терминале команду <strong><em>testparm.</em></strong> Результатом будет вывод состояния smb-сервера и список расшаренных ресурсов. Если настройки сделаны не правильно, вы увидите сообщение об ошибке, из которой легко поймете, где ошиблись.</p>
<p>Далее пропингуйте сервер с рабочего компьютера: <strong><em>ping 192.168.1.1. </em></strong>Также пропингуйте рабочий компьютер с сервера: <strong><em>ping 192.168.1.2.</em></strong> Если пинги идут, значит с сетью все в порядке. Если пинги не проходят, проверьте ваш файл /etc/hosts. Также проблема может быть в DNS-сервере (если он у вас установлен), в роутере, хабе, кабелях.</p>
<p>Если пинги идут, но вы все еще не видите расшаренные папки, выполните команду <strong><em>smb</em><em>cli</em><em>en</em><em>t -L 192.168.1.1. </em></strong>Вы должны увидить список доступных расшаренных ресурсов. Если вы получите сообщение &laquo;Bad password&raquo;,<br />
проверьте, параметры hosts allow, hosts deny и valid users в файле smb.conf. Попробуйте временно закоментировать их.</p>
<p>Выполнение этих простых тестов, позволяет устранить большинство проблем, связанных с настройкой и использование Samba.</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5+%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC+%D1%81+Samba+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1426" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/03/17/reshenie-problem-s-samba/&amp;t=%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5+%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC+%D1%81+Samba" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/03/17/reshenie-problem-s-samba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пишем свою CMS, часть 3</title>
		<link>http://blog.ildart.ru/2012/03/16/pishem-svoyu-cms-3/</link>
		<comments>http://blog.ildart.ru/2012/03/16/pishem-svoyu-cms-3/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 18:06:35 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1312</guid>
		<description><![CDATA[Установка CMS Теперь напишем установщик. В моих планах (ну, когда-нибудь использование этой CMS-ки на всех своих новых проектах, поэтому с установщиком будет проще. Если вам это не нужно, можете смело пропустить этот этап, но с одним условием &#8211; все таблицы &#8230; <a href="http://blog.ildart.ru/2012/03/16/pishem-svoyu-cms-3/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Установка CMS</p>
<p>Теперь напишем установщик. В моих планах (ну, когда-нибудь <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  использование этой CMS-ки на всех своих новых проектах, поэтому с установщиком будет проще. Если вам это не нужно, можете смело пропустить этот этап, но с одним условием &#8211; все таблицы в БД и файл config.php придется создавать в ручную.<span id="more-1312"></span></p>
<p>Открываем install.php и копипастим следующий код:</p>
<blockquote><p><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"><small><a href="http://s-c.me/25009/s">Copy Source</a> | <a href="http://s-c.me/25009/h">Copy HTML</a></small></p>
<ol>
<li>&lt;!DOCTYPE HTML PUBLIC <span style="color: #008000;">"-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"</span>&gt;</li>
<li>&lt;html&gt;</li>
<li>&lt;head&gt;</li>
<li> &lt;title&gt;Установка системы управления сайтом Cafe CMS&lt;/title&gt;</li>
<li> &lt;meta http-equiv=<span style="color: #008000;">"Content-Language"</span> content=<span style="color: #008000;">"ru"</span>&gt;</li>
<li> &lt;meta http-equiv=<span style="color: #008000;">"Content-Type"</span> content=<span style="color: #008000;">"text/html;charset=utf-8"</span>&gt;</li>
<li> &lt;style type=<span style="color: #008000;">"text/css"</span>&gt;</li>
<li> html{background-color:<span style="color: #696969;">#ccc}</span></li>
<li> body{width:800px;height:600px;margin:0px auto 0px auto;padding:30px;background-color:<span style="color: #696969;">#fff;border:#bbb solid 2px}</span></li>
<li> div{height:250px;margin:30px 0px 20px 0px}</li>
<li> .title{font-size:36px}</li>
<li> .footer-text{text-align:right}</li>
<li> &lt;/style&gt;</li>
<li>&lt;/head&gt;</li>
<li>&lt;body&gt;</li>
<li> &lt;p <span style="color: #0000ff;">class</span>=<span style="color: #008000;">"title"</span>&gt;Установка Cafe CMS &lt;/p&gt;</li>
<li> &lt;p&gt;Заполните все поля и нажмите кнокпу &amp;laquo;установить&amp;raquo;.&lt;/p&gt;</li>
<li> &lt;form action=<span style="color: #008000;">"/install.php"</span> name=<span style="color: #008000;">"install_form"</span> method=<span style="color: #008000;">"post"</span>&gt;</li>
<li> &lt;div style=<span style="color: #008000;">"width:50%;float:left"</span>&gt;</li>
<li> Название сайта:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"text"</span> name=<span style="color: #008000;">"site_name"</span> size=<span style="color: #008000;">"40"</span>&gt;&lt;br&gt;&lt;br&gt;</li>
<li> Логин администратора сайта:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"text"</span> name=<span style="color: #008000;">"adm_login"</span> size=<span style="color: #008000;">"40"</span>&gt;&lt;br&gt;</li>
<li> Пароль администратора сайта:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"text"</span> name=<span style="color: #008000;">"adm_password"</span> size=<span style="color: #008000;">"40"</span>&gt;&lt;br&gt;&lt;br&gt;</li>
<li> &lt;/div&gt;</li>
<li> &lt;div style=<span style="color: #008000;">"width:50%;float:left"</span>&gt;База данных:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"text"</span> name=<span style="color: #008000;">"db_name"</span> size=<span style="color: #008000;">"40"</span>&gt;&lt;br&gt;</li>
<li> Префикс для таблиц:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"text"</span> name=<span style="color: #008000;">"db_prefix"</span> size=<span style="color: #008000;">"40"</span>&gt;&lt;br&gt;&lt;br&gt;</li>
<li> Логин для доступа к БД:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"text"</span> name=<span style="color: #008000;">"db_login"</span> size=<span style="color: #008000;">"40"</span>&gt;&lt;br&gt;</li>
<li> Пароль для доступа к БД:&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"text"</span> name=<span style="color: #008000;">"db_password"</span> size=<span style="color: #008000;">"40"</span>&gt;&lt;br&gt;&lt;br&gt;</li>
<li> &lt;input type=<span style="color: #008000;">"submit"</span> name=<span style="color: #008000;">"install"</span> value=<span style="color: #008000;">"установить"</span>&gt;</li>
<li> &lt;/div&gt;</li>
<li> &lt;/form&gt;</li>
<li> &lt;hr&gt;</li>
<li> &lt;p <span style="color: #0000ff;">class</span>=<span style="color: #008000;">"footer-text"</span>&gt;Система управления сайтом Cafe CMS. Разработчик &lt;a href=<span style="color: #008000;">"http://rad-li.ru"</span>&gt;rad-li&lt;/a&gt;.&lt;/p&gt;</li>
<li> &lt;p&gt;&lt;a href=<span style="color: #008000;">"http://validator.w3.org/check?uri=referer"</span>&gt;&lt;img src=<span style="color: #008000;">"http://www.w3.org/Icons/valid-html401"</span> alt=<span style="color: #008000;">"Valid HTML 4.01 Strict"</span> height=<span style="color: #008000;">"31"</span> width=<span style="color: #008000;">"88"</span>&gt;&lt;/a&gt;&lt;/p&gt;</li>
<li>&lt;/body&gt;</li>
<li>&lt;/html&gt;</li>
</ol>
<p></span></code></p></blockquote>
<p>Это будет форма установки CMS. Естественно вы можете слепить свой дизайн установщика. В CMS  будем писать только валидный html-код (по возможности) и использовать стандарт HTML 4.01 Strict с utf-8 кодировкой.</p>
<p>Если верстка получилась валидная как у меня, можно добавить иконку валидности для красоты. Проверить на валидность можно на сайте <a href="http://validator.w3.org/">http://validator.w3.org</a>.</p>
<p>Скриншот того, что получилось (кликабельно):</p>
<p><a href="http://blog.ildart.ru/wp-content/uploads/2012/02/Снимок.png"><img class="aligncenter size-medium wp-image-1295" title="CMS install" src="http://blog.ildart.ru/wp-content/uploads/2012/02/Снимок-300x228.png" alt="" width="300" height="228" /></a></p>
<p>Теперь пэхэпэшная часть. Здесь ничего сложного не будет. Проверяем была ли нажата кнопка &laquo;установить&raquo;, если да &#8211; начинаем установку: создаем две таблицы и регистрируем администратора. Если же кнопка не была нажата, выводим форму установки для ввода нужных данных.</p>
<p>Добавьте этот код в то, что уже есть после строчки<br />
&lt;p <span style="color: #0000ff;">class</span>=<span style="color: #008000;">&laquo;title&raquo;</span>&gt;Установка Cafe CMS &lt;/p&gt;</p>
<blockquote><p><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"><small><a href="http://s-c.me/25010/s">Copy Source</a> | <a href="http://s-c.me/25010/h">Copy HTML</a></small></p>
<ol>
<li><span style="color: #cc6633;">&lt;?</span></li>
<li><span style="color: #696969;">//если передан параметр install, т. е. кнопка "установить" была нажата, начинаем установку</span></li>
<li><span style="color: #0000ff;">if</span> (<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'install'</span>]) {</li>
<li> <span style="color: #696969;">//соединяемся с БД</span></li>
<li> <span style="color: #696969;">//сервер БД установлен на этом же сервере, т. е. localhost</span></li>
<li> <span style="color: #696969;">//логин и пароль для соединения передаются из форму установки</span></li>
<li> <span style="color: #cc6633;">$connect_db</span> = <a href="http://www.php.net/manual/en/function.mysql-connect.php">mysql_connect</a> (<span style="color: #008000;">'localhost'</span>, <span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_login'</span>], <span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_password'</span>]);</li>
<li> <span style="color: #696969;">//дамп таблицы pages, кодировка utf-8; в этой таблице будут храниться статичные страницы</span></li>
<li> <span style="color: #696969;">//в таблице будет 5 полей</span></li>
<li> <span style="color: #696969;">//id - порядковый номер записи, автоинкремент и примари</span></li>
<li> <span style="color: #696969;">//date - дата сохранения записи</span></li>
<li> <span style="color: #696969;">//url - для каждой записи можно будет присвоить свой url</span></li>
<li> <span style="color: #696969;">//title - заголовок записи</span></li>
<li> <span style="color: #696969;">//text - текст записи</span></li>
<li> <span style="color: #cc6633;">$creat_table_pages</span> = <span style="color: #008000;">"CREATE TABLE `"</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_name'</span>].<span style="color: #008000;">"`.`"</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_prefix'</span>].<span style="color: #008000;">"_pages` (</span><br />
<span style="color: #008000;"> `id` INT(5) AUTO_INCREMENT PRIMARY KEY, </span><br />
<span style="color: #008000;"> `date` INT(10), </span><br />
<span style="color: #008000;"> `url` VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_general_ci, </span><br />
<span style="color: #008000;"> `title` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_general_ci, </span><br />
<span style="color: #008000;"> `text` VARCHAR(40000) CHARACTER SET utf8 COLLATE utf8_general_ci, </span><br />
<span style="color: #008000;"> ) ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;"</span>;</li>
<li> <span style="color: #696969;">//дамп таблицы users, кодировка utf-8; в этой таблице будут храниться зарегистрированные пользователи</span></li>
<li> <span style="color: #696969;">//id - порядковый номер записи</span></li>
<li> <span style="color: #696969;">//login - логин пользователя</span></li>
<li> <span style="color: #696969;">//password - пароль пользователя</span></li>
<li> <span style="color: #696969;">//reg_date - дата регистрации</span></li>
<li> <span style="color: #696969;">//status - статус пользователя: 0 - не активен, 1 - админ, 2 - модератор, 3- пользователь</span></li>
<li> <span style="color: #cc6633;">$creat_table_users</span> = <span style="color: #008000;">"CREATE TABLE `"</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_name'</span>].<span style="color: #008000;">"`.`"</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_prefix'</span>].<span style="color: #008000;">"_users` (</span><br />
<span style="color: #008000;"> `id` INT(5) NOT NULL AUTO_INCREMENT PRIMARY KEY, </span><br />
<span style="color: #008000;"> `login` VARCHAR(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, </span><br />
<span style="color: #008000;"> `password` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, </span><br />
<span style="color: #008000;"> `reg_date` INT(10) NOT NULL, </span><br />
<span style="color: #008000;"> `status` INT(1) NOT NULL</span><br />
<span style="color: #008000;"> ) ENGINE = MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci;"</span>;</li>
<li> <span style="color: #696969;">//если таблицы pages и users созданы, добавляем первого пользователя, т. е. регистрируем админа</span></li>
<li> <span style="color: #0000ff;">if</span>(<a href="http://www.php.net/manual/en/function.mysql-query.php">mysql_query</a>(<span style="color: #cc6633;">$creat_table_pages</span>) &amp;&amp; <a href="http://www.php.net/manual/en/function.mysql-query.php">mysql_query</a>(<span style="color: #cc6633;">$creat_table_users</span>)){</li>
<li> <span style="color: #696969;">//определяем переменные переданные из формы</span></li>
<li> <span style="color: #cc6633;">$now_date</span> = <a href="http://www.php.net/manual/en/function.mktime.php">mktime</a> (); <span style="color: #696969;">//текущая дата в таймстампе</span></li>
<li> <span style="color: #cc6633;">$adm_login</span> = <span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'adm_login'</span>]; <span style="color: #696969;">//логин админа</span></li>
<li> <span style="color: #cc6633;">$adm_password</span> = <span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'adm_password'</span>]; <span style="color: #696969;">//пароль админа</span></li>
<li> <span style="color: #cc6633;">$ip</span> = <span style="color: #cc6633;">$_SERVER</span>[<span style="color: #008000;">'REMOTE_ADDR'</span>];</li>
<li> <span style="color: #696969;">//добавляем запись в таблицу users </span></li>
<li> <span style="color: #cc6633;">$add_admin</span> = <span style="color: #008000;">"INSERT "</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_name'</span>].<span style="color: #008000;">"."</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_prefix'</span>].<span style="color: #008000;">"_users (</span><br />
<span style="color: #008000;"> login, </span><br />
<span style="color: #008000;"> password, </span><br />
<span style="color: #008000;"> reg_date, </span><br />
<span style="color: #008000;"> status</span><br />
<span style="color: #008000;"> ) </span><br />
<span style="color: #008000;"> VALUES (</span><br />
<span style="color: #008000;"> '$adm_login', </span><br />
<span style="color: #008000;"> '$adm_password', </span><br />
<span style="color: #008000;"> '$now_date', </span><br />
<span style="color: #008000;"> '1')"</span>;</li>
<li> <span style="color: #696969;">//если админ добавлен</span></li>
<li> <span style="color: #0000ff;">if</span> (<a href="http://www.php.net/manual/en/function.mysql-query.php">mysql_query</a>(<span style="color: #cc6633;">$add_admin</span>)){</li>
<li> <span style="color: #696969;">//записываем настройки в файл config.php</span></li>
<li> <span style="color: #cc6633;">$w_string</span> = <span style="color: #008000;">"&lt;?</span><br />
<span style="color: #008000;">\$db_name = \""</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_name'</span>].<span style="color: #008000;">"\";        //База данных</span><br />
<span style="color: #008000;">\$db_prefix = \""</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_prefix'</span>].<span style="color: #008000;">"\";    //Префикс для таблиц</span><br />
<span style="color: #008000;">\$db_login = \""</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_login'</span>].<span style="color: #008000;">"\";    //Логин для доступа к БД</span><br />
<span style="color: #008000;">\$db_password = \""</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'db_password'</span>].<span style="color: #008000;">"\";    //Пароль для доступа к БД</span><br />
<span style="color: #008000;">\$site_name = \""</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'site_name'</span>].<span style="color: #008000;">"\";    //Название сайта</span><br />
<span style="color: #008000;">?&gt;"</span>;</li>
<li> <span style="color: #cc6633;">$fp</span> = <a href="http://www.php.net/manual/en/function.fopen.php">fopen</a>(<span style="color: #cc6633;">$_SERVER</span>[<span style="color: #008000;">"DOCUMENT_ROOT"</span>].<span style="color: #008000;">"/config.php"</span>, <span style="color: #008000;">"w"</span>);</li>
<li> <a href="http://www.php.net/manual/en/function.fwrite.php">fwrite</a>(<span style="color: #cc6633;">$fp</span>, <span style="color: #cc6633;">$w_string</span>);</li>
<li> <a href="http://www.php.net/manual/en/function.fclose.php">fclose</a>(<span style="color: #cc6633;">$fp</span>);</li>
<li> <span style="color: #696969;">//выводим сообщение об успешной установке</span></li>
<li> <span style="color: #0000ff;">echo</span> <span style="color: #008000;">"&lt;div&gt;</span><br />
<span style="color: #008000;"> &lt;p&gt;Установка завершена!&lt;/p&gt;</span><br />
<span style="color: #008000;"> </span><br />
<span style="color: #008000;"> &lt;p&gt;Запонмните ваш логин "</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'adm_login'</span>].<span style="color: #008000;">" и пароль "</span>.<span style="color: #cc6633;">$_POST</span>[<span style="color: #008000;">'adm_password'</span>].<span style="color: #008000;">".&lt;/p&gt;</span><br />
<span style="color: #008000;"> </span><br />
<span style="color: #008000;"> &lt;p&gt;Теперь ваш сайт доступен по адресу &lt;a href=\"http://"</span>.<span style="color: #cc6633;">$_SERVER</span>[<span style="color: #008000;">'SERVER_NAME'</span>].<span style="color: #008000;">"\"&gt;"</span>.<span style="color: #cc6633;">$_SERVER</span>[<span style="color: #008000;">'SERVER_NAME'</span>].<span style="color: #008000;">"&lt;/a&gt;&lt;/p&gt;</span><br />
<span style="color: #008000;"> &lt;p&gt;&lt;a href=\"/admin/\"&gt;Перейти в панель управления сайтом&lt;/a&gt;.&lt;/p&gt;</span><br />
<span style="color: #008000;"> &lt;p&gt;Не забудьте удалить файл install.php.&lt;/p&gt;</span><br />
<span style="color: #008000;">&lt;/div&gt;"</span>;</li>
<li> }</li>
<li> <span style="color: #696969;">//если сохранить настройки не получилось, выводим сообщение об ошибке</span></li>
<li> <span style="color: #0000ff;">else</span>{</li>
<li> <span style="color: #0000ff;">echo</span> <span style="color: #008000;">"&lt;div&gt;</span><br />
<span style="color: #008000;"> &lt;p&gt;Ошибка при сохранении настроек.&lt;/p&gt;</span><br />
<span style="color: #008000;">&lt;/div&gt;"</span>;</li>
<li> }</li>
<li> }</li>
<li> <span style="color: #696969;">//если таблицы pages и users не получилось создать, выводим сообщение об ошибке</span></li>
<li> <span style="color: #0000ff;">else</span> {</li>
<li> <span style="color: #0000ff;">echo</span> <span style="color: #008000;">"div&gt;</span><br />
<span style="color: #008000;"> &lt;p&gt;Во время установки возникла ошибка: не удалось создать таблицы.&lt;/p&gt;</span><br />
<span style="color: #008000;">&lt;/div&gt;"</span>;</li>
<li> }</li>
<li>}</li>
<li><span style="color: #696969;">//если параметр install не передан, т. е. кнопка "установить" не была нажата, выводим форму установки</span></li>
<li><span style="color: #0000ff;">else</span> {</li>
<li><span style="color: #cc6633;">?&gt;</span></li>
</ol>
<p></span></code></p></blockquote>
<p>И еще три строчки нужно добавить в конец файла перед закрывающим тегом body:</p>
<blockquote><p><code><span style="font-family: &amp;amp;amp; color: black; font-size: x-small;"><small><a href="http://s-c.me/25011/s">Copy Source</a> | <a href="http://s-c.me/25011/h">Copy HTML</a></small></p>
<ol>
<li><span style="color: #cc6633;">&lt;?</span></li>
<li>}</li>
<li><span style="color: #cc6633;">?&gt;</span></li>
</ol>
<p></span></code></p></blockquote>
<p>Код хорошо прокомментировал, надеюсь вопросов не возникнет. Если что-то непонятно пишите в каментах.</p>
<p>Установщик написали, но он не идеален. Как минимум нужно встроить проверку на вводимые символы. Сейчас основная цель сделать работающий движок с минимальным функционалом, а потом будем навешивать все остальное.</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC+%D1%81%D0%B2%D0%BE%D1%8E+CMS%2C+%D1%87%D0%B0%D1%81%D1%82%D1%8C+3+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1312" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/03/16/pishem-svoyu-cms-3/&amp;t=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC+%D1%81%D0%B2%D0%BE%D1%8E+CMS%2C+%D1%87%D0%B0%D1%81%D1%82%D1%8C+3" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/03/16/pishem-svoyu-cms-3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>USB-устройства в VirtualBox-е</title>
		<link>http://blog.ildart.ru/2012/03/08/usb-ustrojjstva-v-virtualbox-e/</link>
		<comments>http://blog.ildart.ru/2012/03/08/usb-ustrojjstva-v-virtualbox-e/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 08:48:34 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Софт]]></category>
		<category><![CDATA[virtualbox]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1424</guid>
		<description><![CDATA[Маленький совет для линуксоидов на случай если usb устройства не видно в VitualBox-е. Во-первых, надо установить VirtualBox Extension Pack для поддержки юсб устройств. Скачать можно с сайта разработчика https://www.virtualbox.org/wiki/Downloads. Во-вторых, необходимо добавить себя в группу vboxusers. Делается это командой: sudo &#8230; <a href="http://blog.ildart.ru/2012/03/08/usb-ustrojjstva-v-virtualbox-e/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Маленький совет для линуксоидов на случай если usb устройства не видно в VitualBox-е.</p>
<p>Во-первых, надо установить VirtualBox Extension Pack для поддержки юсб устройств. Скачать можно с сайта разработчика https://www.virtualbox.org/wiki/Downloads.</p>
<p>Во-вторых, необходимо добавить себя в группу vboxusers. Делается это командой:<br />
<code>sudo usermod -a -G username vboxusers</code><br />
где username &#8211; ваше имя пользователя в системе.</p>
<p>И в-третьих, перезагружаемся. После чего все подключенные юсб устройства будут доступны в VirtualBox-е.</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=USB-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0+%D0%B2+VirtualBox-%D0%B5+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1424" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/03/08/usb-ustrojjstva-v-virtualbox-e/&amp;t=USB-%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%B0+%D0%B2+VirtualBox-%D0%B5" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/03/08/usb-ustrojjstva-v-virtualbox-e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Фото на документы в пару кликов</title>
		<link>http://blog.ildart.ru/2012/03/07/foto-na-dokumenty-v-paru-klikov/</link>
		<comments>http://blog.ildart.ru/2012/03/07/foto-na-dokumenty-v-paru-klikov/#comments</comments>
		<pubDate>Wed, 07 Mar 2012 08:55:46 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Софт]]></category>
		<category><![CDATA[Фотография]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1419</guid>
		<description><![CDATA[В этой статье речь пойдет о плагине для Gimp-а &#171;Фото на документы&#187;. У каждого человек есть как минимум один документ &#8211; это паспорт. У многих есть еще парочка документов &#8211; студенческий, пропуск, водительское удостоверение, загранпаспотр и т. д. И в &#8230; <a href="http://blog.ildart.ru/2012/03/07/foto-na-dokumenty-v-paru-klikov/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>В этой статье речь пойдет о плагине для Gimp-а &laquo;Фото на документы&raquo;.</p>
<p>У каждого человек есть как минимум один документ &#8211; это паспорт. У многих есть еще парочка документов &#8211; студенческий, пропуск, водительское удостоверение, загранпаспотр и т. д. И в каждом документы есть фотография. Каждый раз при получениее или обмене документов нам приходится идти в фотосалон и заказывать фотографии.</p>
<p>Фотографию можно  сделать самому, достаточно всего лишь сфотографироваться и распечатать, подумают многие. Отчасти это правда, но есть свои нюансы. Для каждого документа свои требования к фотографии (размеры, количество). Это все можно сделать в любом графическом редакторе, только нужно знать все требования.</p>
<p>Александр Карабанов сделал замечательный плагин для редактора изображений Gimp, который позволяет в пару кликов создать и распечатать себе фотографии на любые документы. Сайт разработчика <a href="http://gimp-id-photo.ru">http://gimp-id-photo.ru</a></p>
<div id="attachment_1420" class="wp-caption aligncenter" style="width: 463px"><a href="http://blog.ildart.ru/wp-content/uploads/2012/03/foto_1.png"><img class="size-full wp-image-1420" title="foto_1" src="http://blog.ildart.ru/wp-content/uploads/2012/03/foto_1.png" alt="" width="453" height="441" /></a><p class="wp-caption-text">Фото с сайта http://gimp-id-photo.ru</p></div>
<p>Автор подробно описал на своем сайте все этапе работы с плагином, начиная от установки и заканчивая уроком по созданию фотографий. Я использую этот плагин для у себя в фотосалоне и очень доволен работой. На изготовление одного комплекта  фотографий уходит не более двух минут плюс печать на принтере.</p>
<p>Скачать можно с сайта автора <a href="http://gimp-id-photo.ru/download.html">http://gimp-id-photo.ru/download.html</a>. Плагин постоянно обновляется и совершенствуется, поэтому вовремя его обновляйте.</p>
<p>Если плагин вам понравится, не зубудьте <a href="http://gimp-id-photo.ru/donate.html">поблагодарить автора</a>.</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%A4%D0%BE%D1%82%D0%BE+%D0%BD%D0%B0+%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B+%D0%B2+%D0%BF%D0%B0%D1%80%D1%83+%D0%BA%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1419" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/03/07/foto-na-dokumenty-v-paru-klikov/&amp;t=%D0%A4%D0%BE%D1%82%D0%BE+%D0%BD%D0%B0+%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B+%D0%B2+%D0%BF%D0%B0%D1%80%D1%83+%D0%BA%D0%BB%D0%B8%D0%BA%D0%BE%D0%B2" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/03/07/foto-na-dokumenty-v-paru-klikov/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Домашний сервер на Ubuntu (часть 6). Домашняя система видеонаблюдения</title>
		<link>http://blog.ildart.ru/2012/03/04/home-server-ubuntu-6/</link>
		<comments>http://blog.ildart.ru/2012/03/04/home-server-ubuntu-6/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 06:56:49 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Домашний сервер]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1329</guid>
		<description><![CDATA[Пришло время настроить большого брата. Опишу два очень простых способа как организовать у себя дома систему видеонаблюдения. Способов на самом деле больше, к тому же есть готовые решения, но мне эти способы нравятся больше. В качестве камеры наблюдения я выбрал &#8230; <a href="http://blog.ildart.ru/2012/03/04/home-server-ubuntu-6/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-1407" title="ffmppeg" src="http://blog.ildart.ru/wp-content/uploads/2012/03/ffmppeg.png" alt="" width="128" height="128" /><img class="alignright size-full wp-image-1408" title="motion" src="http://blog.ildart.ru/wp-content/uploads/2012/03/motion.gif" alt="" width="125" height="50" />Пришло время настроить большого брата. Опишу два очень простых способа как организовать у себя дома систему видеонаблюдения. Способов на самом деле больше, к тому же есть готовые решения, но мне эти способы нравятся больше.</p>
<p>В качестве камеры наблюдения я выбрал простенькую веб-камеру LifeCam VX-1000 от Microsoft-а с разрешением 640*480 точек. Дополнительных драйверов на него не понадобилось, все заработало сразу после подключения.<span id="more-1329"></span></p>
<p>Узнать подключена ли ваша камера в данный момент можно командой:</p>
<p><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">ls /dev/video*</code></p>
<p>В ответ вы увидите строку /dev/video0. Если вы подключили несколько камер, соответственно каждая следующая будет идти по порядку video1, video2 и т. д. Напомню, что в убунту нумерация устройств начинается с нуля.</p>
<p>Если вместо этого вы увидите строку</p>
<p><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">ls: невозможно получить доступ к /dev/video*: Нет такого файла или каталога</code></p>
<p>значит ваша камера не подключена или не найден подходящий драйвер. Придется ставить его отдельно. Этот вопрос я рассматривать не буду, практически для всех веб-камер можно найти драйверы в интернете.</p>
<p>Если же вы уверены, что драйвер должен быть в системе, выполните такую команду:</p>
<p><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">lsusb</code></p>
<p>В ответ вы увидите все подключенные usb устройства. У меня выходит следующее:</p>
<p><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub<br />
Bus 001 Device 023: ID 045e:00f7 Microsoft Corp. LifeCam VX-1000<br />
Bus 001 Device 005: ID 058f:6362 Alcor Micro Corp. Flash Card Reader/Writer<br />
Bus 001 Device 004: ID 07d1:3c07 D-Link System Wireless G DWA-110 Adapter<br />
Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB<br />
Bus 001 Device 002: ID 04b8:0007 Seiko Epson Corp. Printer<br />
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub</code></p>
<p>Во второй строчке моя камера. Если ничего не помогает, проверьте работоспособность вашей камеры на другом компьютере.</p>
<p>Звук. Если вы хотите не только смотреть, но еще и слышать, вам понадобится отдельный микрофон, если ваша камера без встроенного микрофона. Cейчас большинство камер идут с микрофоном. Давайте проверим это. Наберите в терминале команду <em>arecord -l</em>. В ответ вы получите список устройств с микрофоном. У меня камера с микрофоном и еще есть микрофонный вход на материнке:<br />
<code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">**** Список CAPTURE устройств ****<br />
карта 0: ICH [Intel ICH], устройство 0: Intel ICH [Intel ICH]<br />
Подустройства: 0/1<br />
Подустройство №0: subdevice #0<br />
карта 0: ICH [Intel ICH], устройство 1: Intel ICH - MIC ADC [Intel ICH - MIC ADC]<br />
Подустройства: 1/1<br />
Подустройство №0: subdevice #0<br />
карта 1: camera [USB camera], устройство 0: USB Audio [USB Audio]<br />
Подустройства: 1/1<br />
Подустройство №0: subdevice #0</code></p>
<p>Если с камерой все гуд, перейдем к делу.</p>
<h2>Способ первый: ffmpeg</h2>
<p>Наверно многие знают, а быть может и применяют этот замечательный набор библиотек для работы с аудио и видео данными &#8211; ffmpeg. Официальный сайт разработчиков <a href="http://ffmpeg.org">http://ffmpeg.org</a></p>
<p>Ffmpeg умеет записывать, конвертировать и передавать цифровое аудио и видео в различных форматах. А также захватывать изображение с камер. То, что нам нужно!</p>
<p>Установка<br />
<code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">sudo apt-get install ffmpeg</code></p>
<p>В составе ffmpeg присутствует ffserver &#8211; медиа-сервер, который может раздавать по сети аудио-видео данные полученные от ffmpeg.</p>
<p>Настроечный файл ffserver-а лежит в /etc/ffserver.conf</p>
<div><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;"># Порт сервера. Можно поменять на любой другой свободный порт<br />
Port 8090</p>
<p># Если у вас на сервере несколько ip-адресов, выберите тот, на котором будет вещать ffserver.<br />
# 0.0.0.0 означает любой адрес<br />
BindAddress 0.0.0.0</p>
<p># Количество одновременных http подключений к серверу<br />
MaxHTTPConnections 10</p>
<p># Количество одновременных запросов, которые могут быть обработаны<br />
MaxClients 10</p>
<p># Ширина канала на передачу ваших трансляций в кбит/сек<br />
MaxBandwidth 1000</p>
<p># Путь к лог-файлу доступа (используется формат файла журналов Apache)<br />
# '-' означает стандартный вывод.<br />
CustomLog -<br />
# Закомментируйте эту строку если хотите запускать сервер в режиме демона.<br />
# Советую на время подбора настроек использовать NoDaemon-режим<br />
NoDaemon</p>
<p>##################################################<br />
# Далее идут настройки фидов<br />
# Каждый фид содержит один видео и (или) звуковой поток, получаемый<br />
# от ffmpeg или другого ffserver-а<br />
# Название фида. В данном примере feed1.ffm<br />
&lt;Feed feed1.ffm&gt;</p>
<p># Путь, где будут храниться фиды<br />
File /tmp/feed1.ffm<br />
# Максимальный размер фида (здесь 5 МБ)<br />
FileMaxSize 5M</p>
<p># Автозапуск ffmpeg при запуске ffserver-а.<br />
# После того как подберете оптимальные настройки,<br />
# можно здесь указать параметры запуска ffmpeg,<br />
# чтобы не запускать вручную<br />
#Launch ffmpeg [параметры]</p>
<p># Разрешить соединения только с локалхоста.<br />
# Закомментируйте, если хотите смотреть с других компьютеров<br />
ACL allow 127.0.0.1</p>
<p>&lt;/Feed&gt;</p>
<p># Настройки фида на этом заканчиваются.</p>
<p>##################################################################<br />
# Дальше идут настройки потоков.<br />
# Их может быть несколько, зависит от ваших потребностей</p>
<p># Первый фид test1.mpg<br />
&lt;Stream test1.mpg&gt;</p>
<p># источник потока feed1, который настроили чуть выше<br />
Feed feed1.ffm</p>
<p># Выберите формат потока:<br />
# mpeg       : MPEG-1 звук и видео<br />
# mpegvideo  : только MPEG-1 видео<br />
# mp2        : MPEG-2 только звук<br />
# ogg        : Ogg (Vorbis)<br />
# rm         : RealNetworks-совместимый поток. Звук и видео<br />
# ra         : RealNetworks-совместимый поток. Только звук.<br />
# mpjpeg     : Multipart JPEG (works with Netscape without any plugin)<br />
# jpeg       : Одиночные JPEG изображения.<br />
# asf        : ASF (формат Windows Media Player).<br />
# swf        : Macromedia Flash<br />
# avi        : AVI (видео MPEG-4, звук MPEG)<br />
# Выбираем желаемый формат из списка выше. В данном примере mpeg<br />
Format mpeg</p>
<p># Битрейт звука<br />
AudioBitRate 32</p>
<p># 1 = моно, 2 = стерео<br />
AudioChannels 1</p>
<p># Частота дискретизации звука<br />
AudioSampleRate 44100</p>
<p># Битрейт видео<br />
VideoBitRate 64</p>
<p># Размер буффера<br />
VideoBufferSize 40</p>
<p># Количество кадров в секунду<br />
VideoFrameRate 3</p>
<p># Разрешение видео: ширина*высота (по умолчанию: 160x128)<br />
# Можно писать сокращенно: sqcif, qcif, cif, 4cif, qqvga,<br />
# qvga, vga, svga, xga, uxga, qxga, sxga, qsxga, hsxga, wvga, wxga, wsxga,<br />
# wuxga, woxga, wqsxga, wquxga, whsxga, whuxga, cga, ega, hd480, hd720,<br />
# hd1080. Это разрешение должно совпадать с тем, которое вы будете<br />
# передавать в параметрах ffmpeg<br />
VideoSize 160x128</p>
<p># Передавать только внутренние (intra) кадры<br />
# (используется низкий битрейт, чтобы уменьшить количество кадров).<br />
#VideoIntraOnly<br />
# Не разобрался, что это за параметр. Кажется означает расстояние<br />
# между соседними кадрами. Зависит от вкл/выкл предыдущего параметра<br />
VideoGopSize 12</p>
<p># Дополнительные настройки MPEG-4<br />
# VideoHighQuality<br />
# Video4MotionVector</p>
<p># Выберите кодеки:<br />
#AudioCodec mp2<br />
#VideoCodec mpeg1video</p>
<p># Раскомментируйте, если не хотите передавать звук<br />
#NoAudio</p>
<p># Раскомментируйте если не хотите передавать видео<br />
#NoVideo</p>
<p># Минимальное и максимальное качество видео (1 - самое лучшее)<br />
VideoQMin 1<br />
VideoQMax 31</p>
<p># Задержка для буферизации в проигрывателях<br />
#Preroll 15</p>
<p># Управление доступом:<br />
# Здесь можно задать список разрешенных для подключения ip-адресов<br />
#ACL ALLOW &lt;first address&gt; &lt;last address&gt;</p>
<p># Список запрещенных адресов<br />
#ACL DENY &lt;first address&gt; &lt;last address&gt;</p>
<p># Конец настроек перовго потока<br />
&lt;/Stream&gt;</p>
<p># Дальше в оригинальном конфиге идут примеры потоков.<br />
# Я не буду их здесь переписывать, посмотрите сами, там все понятно.</p>
<p># В конце конфига есть еще парочка интересных строчек</p>
<p># Спец. потоки<br />
# Статус сервера<br />
# Страница будет доступна по адресу http://ip_сервера:порт/stat.html<br />
&lt;Stream stat.html&gt;<br />
Format status</p>
<p># Кому разрешаем смотреть статус сервера<br />
ACL allow localhost<br />
ACL allow 192.168.0.0 192.168.255.255</p>
<p># Также можно задать иконку страницы<br />
FaviconURL /home/username/favicon.ico<br />
&lt;/Stream&gt;</p>
<p># Перенаправлять index.html на сайт разработчиков ffmpeg<br />
#&lt;Redirect index.html&gt;<br />
URL http://www.ffmpeg.org/<br />
&lt;/Redirect&gt;</code></div>
<p>Мой конфиг выглядит так:</p>
<div><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">Port 8093<br />
BindAddress 192.168.1.200<br />
MaxHTTPConnections 10<br />
MaxClients 10<br />
MaxBandwidth 20000<br />
#NoDaemon</p>
<p>&lt;File /tmp/feed.ffm&gt;<br />
FileMaxSize 3M<br />
&lt;/Feed&gt;</p>
<p>&lt;Stream video.swf&gt;<br />
Feed feed.ffm<br />
# Будет запускаться в Adobe Flash Player<br />
Format swf<br />
VideoCodec flv<br />
VideoFrameRate 15<br />
VideoBufferSize 50000<br />
VideoBitRate 200<br />
VideoSize 640x480<br />
&lt;/Stream&gt;</p>
<p>&lt;Stream status.html&gt;<br />
Format status<br />
&lt;/Stream&gt;</code></div>
<p>Все настроили, запускаем. Сервер запускается командой ffserver. Если вы что-то неправильно написали в настройках, ffserver при запуске выдаст ошибки, с указанием того, что надо подправить. Для ffmpeg нужно задать параметры запуска:</p>
<p><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">ffmpeg -s 640x480 -r 15 -f mjpeg -i /dev/video0 http://ip:port/feed</code></p>
<p><strong>-s</strong> &#8211; разрешение, должно быть таким в конфиге ffserver. Не выставляйте разрешение большее, чем может передать ваша веб-камера.</p>
<p><strong>-r</strong> &#8211; количество кадров/секунду. Здесь также ориентируйтесь на возможности камеры. Моя, например, выдает 30 кадров в секунду при разрешении 320*240, и всего 15 кадров при разрешении 640*480.</p>
<p><strong>-f</strong> &#8211; формат видео получаемый с камеры. В большинстве случаев подойдет формат video4linux2. В зависимости от камиеры можете попробовать video4linux (video4linux1). Моя камера заработала только с форматом mjpeg.</p>
<p><strong>-i</strong> &#8211; путь к камере. Если у вас одна камера, то путь всегда будет /dev/video0. Про это я писал в начале статьи.</p>
<p><strong>http://ip:port/feed</strong> &#8211; это адрес нашего фида. ip &#8211; это ip-адрес вашего сервера, feed &#8211; адрес вашего фида, который указан в настройках выше. У меня эта строка выглядит так http://192.168.1.200:8093/myfeed.ffm.</p>
<p>Теперь открывайте в браузере http://192.168.1.200:8093/video.swf (или вы могли дать потоку другой адрес) и вы увидите трансляцию с вашей камеры.</p>
<p>По адресу http://192.168.1.200:8093/status.html можно посмотреть статус сервера и доступные для просмотра трансляции. </p>
<p>Приведу еще два примера использования ffmpeg. Вот так можно транслировать из файла вместо камеры:<br />
<code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">ffmpeg -i /home/username/testvideo.avi -s qcif -r 15 -ac 1 -ar 8000 -b 30 -ab 12 http://localhost:8090/feed.ffm</code></p>
<p>Вот так можно передавать свой рабочий стол:<br />
<code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">ffmpeg -f x11grab -r 30 -s 640x480 -i :0.0 http://localhost:8090/feed.ffm</code></p>
<p>Из минусов ffmpeg-а могу отметить только то, что если ваш сервер многоядерный, ffmpeg будет использовать только одно ядро. Макисмальное количество одновременных соединений, которое сможет выдержать ffserver &#8211; 5000. Для домашнего использования этого больше, чем достаточно. Даже если вы будете транслировать видео на своем сайте, вряд ли его одновременно будут смотреть более 5000 человек. Если конечно у вас не видео-хостинг типа ютуба.</p>
<h2>Способ второй: motion</h2>
<p>Motion не менее замечательная вещь для организации видео наблюдения с помощью веб-камеры. Плюсом motion-а является встроенный датчик движения. Т. е. нам не обязательно вести запись с камеры постоянно. Пока движения нет, запись не будет вестись, как только в зоне наблюдения появится движение motion начнет запись.</p>
<p>Официальный сайт разработчиков <a href="http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome">http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome</a>.</p>
<p>Установка<br />
<code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">sudo apt-get install motion</code></p>
<p>Конфиг очень большой, но многое там можно оставить как есть. Достаточно указать путь к вашей камере и запустить motion. Но мы ведь легких путей не ищем и будем тонко подстраивать все под себя. Файлик тут /etc/motion/motion.conf. Рассмотрим его подробно, чтобы понять как все устроено, а потом выкинем из него все лишнее.</p>
<div><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;"><br />
############################################################<br />
# Демон<br />
############################################################<br />
# Запуск в режиме демона (по умолчанию: off)<br />
daemon off</p>
<p># Файл для хранения идентификатора процесса (ID)<br />
process_id_file /var/run/motion/motion.pid </p>
<p>############################################################<br />
# Основной режим установки<br />
############################################################<br />
# Запсутить в режиме установки, демон отключается<br />
setup_mode off</p>
<p>###########################################################<br />
# Параметры устройства захвата<br />
############################################################</p>
<p># Адрес вашей камеры в системе. Как определить писал в начале статьи.<br />
videodevice /dev/video0</p>
<p># Выберите палитру поддерживаемую вашей камерой.<br />
# По умолчанию: 8 (подходит для большинства)<br />
# V4L2_PIX_FMT_SN9C10X : 0  'S910'<br />
# V4L2_PIX_FMT_SBGGR8  : 1  'BA81'<br />
# V4L2_PIX_FMT_MJPEG   : 2  'MJPEG'<br />
# V4L2_PIX_FMT_JPEG    : 3  'JPEG'<br />
# V4L2_PIX_FMT_RGB24   : 4  'RGB3'<br />
# V4L2_PIX_FMT_UYVY    : 5  'UYVY'<br />
# V4L2_PIX_FMT_YUYV    : 6  'YUYV'<br />
# V4L2_PIX_FMT_YUV422P : 7  '422P'<br />
# V4L2_PIX_FMT_YUV420  : 8  'YU12'<br />
v4l2_palette 8</p>
<p># Настройки тв-тюнера. Нам они не нужны<br />
; tunerdevice /dev/tuner0</p>
<p># Здесь тоже ничего не меняем. 8 - юсб-камера, 0-1 для тв-тюнера<br />
input 8</p>
<p># Эта настройка тоже касается тв-тюнера и нам не нужна<br />
# Values: 0 (PAL), 1 (NTSC), 2 (SECAM), 3 (PAL NC no colour). Default: 0 (PAL)<br />
norm 0</p>
<p># Частота канала тв-тюнера<br />
frequency 0</p>
<p># Поворот изображения. По умолчанию 0 (не поварачивать),<br />
# можно выбрать поворот на 90, 180 и 270 градусов.<br />
rotate 0</p>
<p># Ширина картинки в пикселях. По умолчанию: 352<br />
width 640</p>
<p>#  Высота картинки. По умолчанию: 288<br />
height 480</p>
<p># Количество кадров в секунду.<br />
# От 2 до 100 в зависимости от камеры.<br />
# Чем большее количсевто кадров выбрать, тем больше будет нагрузка на компьютер<br />
framerate 15</p>
<p># Минимальное время между захватом двух кадров. По умолчанию отключено (0).<br />
# Если, например, выбрать 3, то кадры будут захватываться каждые 3 секунды<br />
minimum_frame_time 5</p>
<p># Адрес сетевой камеры или потока<br />
; netcam_url value</p>
<p># Логин-пароль для предыдущего параметра<br />
# Синтаксис имя_пользователя:пароль<br />
; netcam_userpass value</p>
<p># Опять пропускаем<br />
# The setting for keep-alive of network socket, should improve performance on compatible net cameras.<br />
# 1.0:         The historical implementation using HTTP/1.0, closing the socket after each http request.<br />
# keep_alive:  Use HTTP/1.0 requests with keep alive header to reuse the same connection.<br />
# 1.1:         Use HTTP/1.1 requests that support keep alive as default.<br />
# Default: 1.0<br />
; netcam_http 1.0</p>
<p># URL to use for a netcam proxy server, if required, e.g. "http://myproxy".<br />
# If a port number other than 80 is needed, use "http://myproxy:1234".<br />
# Default: not defined<br />
; netcam_proxy value </p>
<p># Set less strict jpeg checks for network cameras with a poor/buggy firmware.<br />
# Default: off<br />
netcam_tolerant_check off</p>
<p># Автоматическая регулировка яркости изображения. По умолчанию отключено.<br />
# Практически все камеры умеют это делать сами<br />
auto_brightness off</p>
<p># Дальше идут настройки яркости, контраста, насыщенности и оттенка.<br />
# Диапазон допустимых значений от 0 до 255. 0 - отключено<br />
brightness 0<br />
contrast 0<br />
saturation 0<br />
hue 0</p>
<p>############################################################<br />
# Round Robin (multiple inputs on same video device name)<br />
############################################################<br />
 # Number of frames to capture in each roundrobin step (default: 1)<br />
roundrobin_frames 1<br />
 # Number of frames to skip before each roundrobin step (default: 1)<br />
roundrobin_skip 1<br />
# Try to filter out noise generated by roundrobin (default: off)<br />
switchfilter off</p>
<p>############################################################<br />
# Настройки датчика движения:<br />
############################################################</p>
<p># Количество измененных пикселей после чего срабатывает<br />
# датчик движения, т. е. это чувствутиельность датчика.<br />
# Чем меньше это число, тем чувствительней датчик .По умолчанию: 1500<br />
threshold 1500</p>
<p># Автоматическая регулировка нижнего порога чувствительности<br />
threshold_tune off</p>
<p># Уровень шума. Позволяет исключить помехи самой камеры.<br />
# По умолчанию: 32<br />
noise_level 32</p>
<p># Автоматическая регулировка уровня шума<br />
noise_tune on</p>
<p># Фильтр шумов. Подбирайте оптимальный для вас набор букв EedDl<br />
# Подробней читайте на сайте http://emit.demon.co.uk/motion/<br />
despeckle EedDl</p>
<p># Этот параметр позволяет выбрать области слежения<br />
# 1 - левый верхний угол<br />
# 2 - верх середина<br />
# 3 - правый верхний угол<br />
# 4 - левая середина<br />
# 5 - центр<br />
# 6 - права середина<br />
# 7 - нижний левый угол<br />
# 8 - низ середина<br />
# 9 - правый нижний угол<br />
; area_detect value</p>
<p># Путь к PGM-маске движения.<br />
# Что это такое можно почитать тут http://netpbm.sourceforge.net/doc/pgm.html<br />
; mask_file value</p>
<p># Dynamically create a mask file during operation (default: 0)<br />
# Adjust speed of mask changes from 0 (off) to 10 (fast)<br />
smart_mask_speed 0</p>
<p># Выравнивание светлых участков<br />
# Диапазон: 0 - 100 , по умолчанию: 0 = отключено<br />
lightswitch 0</p>
<p># Минимальное количесвто кадров, в которых должно быть<br />
# зафиксировано движение для срабатывания датчика<br />
minimum_motion_frames 1</p>
<p># Определяет количество предварительно захваченных (буфер) фотографий<br />
# до обнаружения движения. Рекомендуемый диапазон: от 0 до 5 (по умолчанию: 0)<br />
pre_capture 0</p>
<p># То же, но после отсутствия движения<br />
post_capture 0</p>
<p># Сколько секунд ждать с момента отсутствия движения<br />
gap 60</p>
<p># Длина видео файла в секундах. 0 - бесконечно<br />
max_mpeg_time 0</p>
<p># Сохранять изображения даже если движения не было<br />
# По умолчанию: off<br />
output_all off</p>
<p>############################################################<br />
# Файл изображения<br />
############################################################</p>
<p># Какие кадры будем сохранять:<br />
# on - все кадры, когда есть движение<br />
# off - выключено<br />
# first - первый кадр с движением<br />
# best - лучший кадр (наибольшим движением)<br />
# center - кадры с движением по центру кадра<br />
output_normal off</p>
<p># Сохранять только изменившуюся часть изображени (?)<br />
output_motion off</p>
<p># Качество сжатия изображения, в процентах<br />
quality 50</p>
<p># Сохранять ppm изображение вместо jpeg (по умолчанию: off)<br />
ppm off</p>
<p>############################################################<br />
# Параметры FFMPEG<br />
############################################################</p>
<p># Записывать видео<br />
ffmpeg_cap_new off</p>
<p># Записывать только изменившуюся часть изображени<br />
ffmpeg_cap_motion off</p>
<p># Use ffmpeg to encode a timelapse movie<br />
# Default value 0 = off - else save frame every Nth second<br />
ffmpeg_timelapse 0</p>
<p># Сколько вести запись в один файл. После превышения предела создаётся новый файл.<br />
# hourly - ежечасно<br />
# daily - ежедневно, по умолчанию<br />
# weekly-sunday - еженедельно, начало недели в воскресенье<br />
# weekly-monday - аналогично с началом в понедельник<br />
# monthly - ежемесячно<br />
# manual - вручную<br />
ffmpeg_timelapse_mode daily</p>
<p># Битрейт видео (по умолчанию: 400000)<br />
# Этот параметр игнорируется если параметр ffmpeg_variable_bitrate не равен 0 (отключен)<br />
ffmpeg_bps 500000</p>
<p># Переменный битрейт видео<br />
# Можно установить 0 = фиксированный битрейт заданный выше в параметре ffmpeg_bps,<br />
# или от 2 до 31. 2 лучшее качество, 31 - худшее.<br />
ffmpeg_variable_bitrate 0</p>
<p># Кодек для сжатия видео<br />
# mpeg1 - файл с расширением .mpg<br />
# mpeg4 или msmpeg4 - файл с расширением .avi<br />
# swf - флешка .swf<br />
# flv - флешка .flv<br />
# ffv1 - кодек FF для сжатия без потерь (эксперементально)<br />
# mov - QuickTime<br />
ffmpeg_video_codec mpeg1</p>
<p># Деинтерлизация видео<br />
ffmpeg_deinterlace off</p>
<p>############################################################<br />
# Снимки с камеры<br />
############################################################</p>
<p># Автоматически создавать снимки каждый N секунд. 0 - отключено<br />
snapshot_interval 1</p>
<p>############################################################<br />
# Накладываемый текст<br />
# %Y = год, %m = месяц, %d = день,<br />
# %H = часы, %M = минуты, %S = секунды, %T = HH:MM:SS,<br />
# %v = event, %q = номер кадра, %t = номер камеры,<br />
# %D = измененные пиксели, %N = noise level, \n = new line,<br />
# %i и %J = ширина и высота области движения,<br />
# %K и %L = X и Y координаты центра движения<br />
############################################################</p>
<p># Рисовать рамку вокруг области с движением<br />
locate off</p>
<p># Накложение текста в правом нижнем углу<br />
text_right %Y-%m-%d\n%T-%q</p>
<p># Наложение текста в левом углу<br />
text_left CAMERA %t</p>
<p># Наложение текстом количества измененных пикселей<br />
text_changes off</p>
<p># This option defines the value of the special event conversion specifier %C<br />
# You can use any conversion specifier in this option except %C. Date and time<br />
# values are from the timestamp of the first image in the current event.<br />
# Default: %Y%m%d%H%M%S<br />
# The idea is that %C can be used filenames and text_left/right for creating<br />
# a unique identifier for each event.<br />
text_event %Y%m%d%H%M%S</p>
<p># Увеличить размер шрифта в два раза<br />
text_double on</p>
<p>############################################################<br />
# Папки для сохранения файлов<br />
############################################################</p>
<p># Папка для сохранения изображений и видео.<br />
# Используйте абсолютные пути.<br />
# По умолчанию - текущая рабочая папка<br />
target_dir /home/username/motion</p>
<p># Имя файлов для снимка и видео<br />
# Расширение файла добавляется автоматически<br />
snapshot_filename %m%d%v-%Y-%m-%d-%H-%M-%S<br />
jpeg_filename %v-%Y%m%d%H%M%S-%q<br />
movie_filename %v-%Y%m%d%H%M%S<br />
timelapse_filename %Y%m%d-timelapse</p>
<p>############################################################<br />
# Сервер для трансляций<br />
############################################################</p>
<p># Порт сервера (0 - отключено)<br />
webcam_port 8090</p>
<p># Качество передаваемой картинки<br />
webcam_quality 20</p>
<p># Если движения нет битрейт снижается до 1 кадра в секунду<br />
webcam_motion off</p>
<p># Сколько кадров в секунду передавать (по умолчанию: 1)<br />
webcam_maxrate 1</p>
<p># Разрешить соединения только с локалхоста<br />
webcam_localhost off</p>
<p># Лимит подключений<br />
webcam_limit 0</p>
<p>############################################################<br />
# Удаленное управление<br />
############################################################</p>
<p># Порт. Должен отличаться от webcam_port (0 - отключено)<br />
control_port 8091</p>
<p># Разрешить соединения только с локалхоста<br />
control_localhost on</p>
<p># Output for http server, select off to choose raw text plain (default: on)<br />
control_html_output on</p>
<p># Аутентификация. Синтаксис имя_пользователя:пароль<br />
# По умолчанию отключено<br />
; control_authentication username:password</p>
<p>############################################################<br />
# Внешние команды, варнинги и логирование<br />
# %Y = год, %m = месяц, %d = день,<br />
# %H = часы, %M = минуты, %S = секунды,<br />
# %v = событие, %q = номер кадра, %t = номер камеры,<br />
# %D = изменившиеся пиксели, %N = уровень шума,<br />
# %i и %J =ширина и высота области движения,<br />
# %K и %L = X и Y координаты центра движения<br />
# %C = value defined by text_event<br />
# %f = полный путь к файлу<br />
# %n = тип файла<br />
############################################################</p>
<p># Звуковой сигнал при обнаружении движения<br />
# Не работает в режиме демона<br />
quiet off</p>
<p># Далее можно задать свои команды при определенных событиях<br />
# Например, запустить скрипт или отправить вам смску, письмо</p>
<p># Запуск события при первом движении<br />
; on_event_start value</p>
<p># Конец события если нет движения в течение нескольких секунд<br />
; on_event_end value</p>
<p># Сохранение файла изображения<br />
; on_picture_save value</p>
<p># При обнаружении движения<br />
; on_motion_detected value</p>
<p># При обнаружении движения в определнной зоне<br />
; on_area_detected value</p>
<p># При создании видео файла (начало записи в этот файл)<br />
; on_movie_start value</p>
<p># То же только конец записи в файл<br />
; on_movie_end value</p>
<p># Если камера перестала работать<br />
; on_camera_lost value</p>
<p>##############################################################<br />
# Важные строчки если вы будете подключать несколько камер<br />
##############################################################</p>
<p># Если у вас только одна камера, то на этом настройки заканчиваются<br />
# Если у вас более одной камеры, для каждой из них необходимо создать<br />
# отдельный файл с настройками. Содержимое файлов можно скопировать<br />
# с этого файла (/etc/motion/motion.conf) заменив адрес камеры<br />
# и при необходимости пути папок, куда будут сохраняться записи<br />
; thread /usr/local/etc/thread1.conf<br />
; thread /usr/local/etc/thread2.conf<br />
; thread /usr/local/etc/thread3.conf<br />
; thread /usr/local/etc/thread4.conf<br />
</code></div>
<p>Фу-у-х! Кажется всё <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Вы еще тут? Тогда продолжаем!</p>
<p>Приведу для примера свой конфиг:</p>
<div><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;"><br />
daemon off<br />
process_id_file /var/run/motion/motion.pid<br />
setup_mode off<br />
videodevice /dev/video0</p>
<p>v4l2_palette 8<br />
input 8<br />
norm 0</p>
<p>rotate 0<br />
width 640<br />
height 480</p>
<p>framerate 30<br />
minimum_frame_time 0</p>
<p>netcam_tolerant_check off</p>
<p>auto_brightness off<br />
brightness 0<br />
contrast 0<br />
saturation 0<br />
hue 0</p>
<p>threshold 1500<br />
threshold_tune off</p>
<p>noise_level 10<br />
noise_tune on</p>
<p>despeckle EedDl<br />
minimum_motion_frames 3</p>
<p>pre_capture 1<br />
post_capture 1<br />
gap 0</p>
<p>max_mpeg_time 300<br />
output_all off<br />
output_normal first<br />
output_motion off</p>
<p>quality 70</p>
<p>ppm off</p>
<p>ffmpeg_cap_new on<br />
ffmpeg_cap_motion off<br />
ffmpeg_timelapse 0<br />
ffmpeg_timelapse_mode hourly<br />
ffmpeg_bps 400000<br />
ffmpeg_variable_bitrate 5<br />
ffmpeg_video_codec mpeg4<br />
ffmpeg_deinterlace off</p>
<p>snapshot_interval 0<br />
locate off</p>
<p>text_right %Y-%m-%d\n%T-%q<br />
text_left CAMERA %t<br />
text_changes off<br />
text_event %Y%m%d%H%M%S<br />
text_double on</p>
<p>target_dir /home/username/motion<br />
snapshot_filename %m/%d/%Y-%m-%d-%H-%M-%S<br />
jpeg_filename %m/%d/%Y-%m-%d-%H-%M-%S<br />
movie_filename %m/%d/%Y-%m-%d-%H-%M-%S<br />
timelapse_filename %m/%d/%Y-%m-%d-%H-%M-%S-timelapse</p>
<p>webcam_port 8090<br />
webcam_quality 15</p>
<p>webcam_motion on<br />
webcam_maxrate 15</p>
<p>webcam_localhost off<br />
webcam_limit 0</p>
<p>control_port 8091<br />
control_localhost on</p>
<p>control_html_output on<br />
control_authentication username:password</p>
<p>quiet off</p>
<p>; on_event_start value<br />
; on_event_end value<br />
; on_picture_save value<br />
; on_motion_detected value<br />
; on_area_detected value<br />
; on_movie_start value<br />
; on_movie_end value<br />
; on_camera_lost value<br />
</code></div>
<p>Запускаем:</p>
<div><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;">motion - c /etc/motion/motion.conf</code></div>
<p>параметр -с позволяет указать путь к файлу с настройками.</p>
<p>Раньше я пользовался ffmpeg-ом, но сейчас перешел на motion. Запись видео только при повялении движения существенно экономит дисковое пространство. Одна минута записи занимает около 9 МБ. За сутки накапливается 13 ГБ. Естественно это при наличии постоянного движения. А так за сутки в среднем накапливается всего около 3-4 ГБ.</p>
<p>В планах есть пару идей по модернизации видеонаблюдения. Если получится реализовать их, потом обязательно отпишусь в отдельной статье.</p>
<p>Сейчас одна камера стоит на работе (работаю в фотосалоне). Камера подключена через 5 метровый юсб-удлинитель в юсб-хаб. Из-за них качество картинки немного упало, появились помехи, скорость передачи снизилась. По возможности подключайте свои камеры напряму в юсб-разъем на материнке. Вот картинка с него:<br />
<a href="http://blog.ildart.ru/wp-content/uploads/2012/03/09-48-42_2012-03-04.jpg"><img src="http://blog.ildart.ru/wp-content/uploads/2012/03/09-48-42_2012-03-04.jpg" alt="" title="видеонаблюдение" width="640" height="480" class="aligncenter size-full wp-image-1415" /></a></p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%94%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9+%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80+%D0%BD%D0%B0+Ubuntu+%28%D1%87%D0%B0%D1%81%D1%82%D1%8C+6%29.+%D0%94%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D1%8F%D1%8F+%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0+%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D0%BD%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F......+...+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1329" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/03/04/home-server-ubuntu-6/&amp;t=%D0%94%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9+%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80+%D0%BD%D0%B0+Ubuntu+%28%D1%87%D0%B0%D1%81%D1%82%D1%8C+6%29.+%D0%94%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D1%8F%D1%8F+%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0+%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D0%BD%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/03/04/home-server-ubuntu-6/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Домашний сервер на Ubuntu Server (часть 5). Веб-сервер</title>
		<link>http://blog.ildart.ru/2012/02/22/home-server-ubuntu-5/</link>
		<comments>http://blog.ildart.ru/2012/02/22/home-server-ubuntu-5/#comments</comments>
		<pubDate>Wed, 22 Feb 2012 05:20:39 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Домашний сервер]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1176</guid>
		<description><![CDATA[Наконец-то после длительного перерыва я продолжаю серию статей про домашний сервер. Перечислю, что из задуманного уже сделано и некоторые планы на будущее: Введение Установка и настройка SSH Установка и настройка Transmission-daemon Установка Samba FTP-сервер Веб-сервер (эта статья) Домашняя система видеонаблюдения &#8230; <a href="http://blog.ildart.ru/2012/02/22/home-server-ubuntu-5/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Наконец-то после длительного перерыва я продолжаю серию статей про домашний сервер. Перечислю, что из задуманного уже сделано и некоторые планы на будущее:</p>
<p><a href="http://blog.ildart.ru/2011/05/23/home-ubuntu-server/">Введение</a><br />
<a href="http://blog.ildart.ru/2011/05/23/home-ubuntu-server-1/">Установка и настройка SSH</a><br />
<a href="http://blog.ildart.ru/2011/05/24/home-ubuntu-server-2/">Установка и настройка Transmission-daemon</a><br />
<a href="http://blog.ildart.ru/2011/05/25/home-ubuntu-server-3/">Установка Samba</a><br />
<a href="http://blog.ildart.ru/2011/06/04/home-server-ubuntu-4/">FTP-сервер</a></p>
<p>Веб-сервер (эта статья)<br />
Домашняя система видеонаблюдения<br />
Бекапы</p>
<p>Про установку веб-сервера (Apache, php и MySQL) написано в статье <a href="http://blog.ildart.ru/2011/01/31/veb-server-na-ubuntu-za-pyat-minut/">Веб-сервер на Убунту за пять минут</a>, поэтому не буду повторно затрагивать процесс установки. Сейчас пройдемся по настройкам апача и созданию виртуальных хостов.  Будем считать, что апач, пхп и мускул уже установлены, если нет, самое время это сделать.  Управление апачем осуществляется следующими командами: <span id="more-1176"></span><strong>apache2ctl start</strong> &#8211; запуск</p>
<p><strong>apache2ctl stop</strong> &#8211; остановка</p>
<p><strong>apache2ctl restart</strong> &#8211; перезапуск. Если демон не запущен, он запускается. Эта команда автоматически проверяет файлы конфигурации, как в configtest перед началом перезагрузки.</p>
<p><strong>apache2ctl status</strong> &#8211; показывает статус сервера.</p>
<p><strong>apache2ctl fullstatus</strong> &#8211; отображает полный отчет о состоянии с mod_status (должен быть включен mod_status). В директиве STATUSURL нужно задать адрес страницы, где будет выводится отчет.</p>
<p><strong>apache2ctl graceful</strong> &#8211; мягкий перезапуск. Если демон не запущен, он запускается. Открытые соединения не прерываются.</p>
<p><strong>apache2ctl configtest</strong> &#8211; выполнить проверку синтаксиса файла конфигурации. Если есть ошибки выводится подробная информация о конкретной ошибке.</p>
<h2 style="text-align: left;">apache2.conf</h2>
<p>Главный конфигурационный файл апача лежит в <strong>/etc/apache2.conf</strong>. Разберем его по пунктам. Строки, начинающиеся знаком #, являются комментариями и на работу сервера никак не влияют. Важное замечание: при указании путей &#8211; не добавляйте слэш в конце пути к каталогу.</p>
<p>Директивы конфигурации сгруппированы в три основных раздела:</p>
<ol>
<li>Директивы, управляющие работой сервера Apache как процесса в целом.</li>
<li>Директивы, определяющие параметры главного сервера или сервера по умолчанию (default),</li>
<li>Настройки виртуальных хостов.</li>
</ol>
<p><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;"># Корень сервера, изменять не рекомендуется<br />
ServerRoot "/ etc/apache2"<br />
#<br />
# Файл блокировки, чтобы апач не запустился два или больше раз<br />
LockFile /var/lock/apache2/accept.lock<br />
#<br />
# Путь к файлу, в котором будет записан id процесса апача. Переменная ${APACHE_PID_FILE} указана в файле /etc/apache2/envvars<br />
PidFile ${APACHE_PID_FILE}<br />
#<br />
# Таймаут на прием и передачу, в секундах<br />
Timeout 300<br />
#<br />
# Разрешить постоянные соединения<br />
KeepAlive On<br />
#<br />
# Максимальное количество запросов. Чтобы убрать ограничение выставите 0.<br />
MaxKeepAliveRequests 100<br />
#<br />
# Время ожидания следующего запроса от одного клиента в том же соединении<br />
# в секундах<br />
KeepAliveTimeout 15<br />
##<br />
## Далее идут настройки модуля MPM (ниже я напишу, что это такое)<br />
##<br />
# prefork MPM<br />
# StartServers: количество процессов сервера при запуске<br />
# MinSpareServers: минимальное количество процессов<br />
# MaxSpareServers: максимальное количество процессов<br />
# MaxClients: максимальное количество процессов при старте<br />
# MaxRequestsPerChild: максимальное число запросов на процесс<br />
&lt;IfModule mpm_prefork_module&gt;<br />
StartServers          5<br />
MinSpareServers       5<br />
MaxSpareServers      10<br />
MaxClients          150<br />
MaxRequestsPerChild   0<br />
&lt;/IfModule&gt;<br />
#<br />
# worker MPM<br />
# StartServers: начальное количество серверных процессов при старте<br />
# MaxClients: максимальное количество одновременных клиентских подключений<br />
# MinSpareThreads: минимальное количество рабочих потоков<br />
# MaxSpareThreads: максимальное количество рабочих потоков<br />
# ThreadsPerChild: постоянное количество рабочих потоков в каждый серверный процесс<br />
# MaxRequestsPerChild: максимальное количество запросов, обслуживающихся одним процессом<br />
&lt;IfModule mpm_worker_module&gt;<br />
StartServers          2<br />
MinSpareThreads      25<br />
MaxSpareThreads      75<br />
ThreadLimit          64<br />
ThreadsPerChild      25<br />
MaxClients          150<br />
MaxRequestsPerChild   0<br />
&lt;/IfModule&gt;<br />
#<br />
# event MPM<br />
# StartServers: начальное количество серверных процессов<br />
# MaxClients: максимальное количество одновременных клиентских подключений<br />
# MinSpareThreads: минимальное количество рабочих потоков<br />
# MaxSpareThreads: максимальное количество рабочих потоков<br />
# ThreadsPerChild: постоянное количество рабочих потоков в каждом процессе<br />
# MaxRequestsPerChild: максимальное количество запросов обслуживающихся одним процессом<br />
&lt;IfModule mpm_event_module&gt;<br />
StartServers          2<br />
MaxClients          150<br />
MinSpareThreads      25<br />
MaxSpareThreads      75<br />
ThreadLimit          64<br />
ThreadsPerChild      25<br />
MaxRequestsPerChild   0<br />
&lt;/IfModule&gt;<br />
#<br />
#<br />
# От имени какого пользователя и группы запускается апач. Переменные можно установить в файле /etc/apache2/envvars<br />
User ${APACHE_RUN_USER}<br />
Group ${APACHE_RUN_GROUP}<br />
#<br />
# Стандартный файл .htaccess. Можно назвать его по-другому<br />
AccessFileName .htaccess<br />
#<br />
#<br />
# Запретить показ содержимого файлов .htaccess и .htpasswd в браузере<br />
&lt;Files ~ "^\.ht"&gt;<br />
Order allow,deny<br />
Deny from all<br />
Satisfy all<br />
&lt;/Files&gt;<br />
#<br />
#<br />
# MIME тип файлов по умолчанию. Применяется, когда тип файла не указан явно<br />
DefaultType text/plain<br />
#<br />
#<br />
# Распознавать хосты по именам или по айпи адресам. Лучше отключить если не критично, чтобы не нагружать сервер лишний раз.<br />
# on - по айпи адресам<br />
# off - по именам<br />
HostnameLookups Off<br />
#<br />
# Расположение файла журнала ошибок<br />
ErrorLog /var/log/apache2/error.log<br />
#<br />
# Уровень детализации ошибок. По умолчанию уровень - warn<br />
# Возможные варианты:<br />
# debug - отладочная информация,<br />
# info - просто информация (?),<br />
# notice - уведомления,<br />
# warn - предупреждения,<br />
# error - ошибки,<br />
# crit - критические ошибки,<br />
# alert<br />
# emerg<br />
LogLevel warn<br />
#<br />
# Подключаемые модули:<br />
Include /etc/apache2/mods-enabled/*.load<br />
Include /etc/apache2/mods-enabled/*.conf<br />
#<br />
# Подключение пользовательских конфигураций:<br />
Include /etc/apache2/httpd.conf<br />
#<br />
# Подключить файл со списком портов<br />
Include /etc/apache2/ports.conf<br />
#<br />
# Форматы журнала доступа<br />
LogFormat "%v:%p %h %l %u %t \"%r\" %&gt;s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined<br />
LogFormat "%h %l %u %t \"%r\" %&gt;s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined<br />
LogFormat "%h %l %u %t \"%r\" %&gt;s %O" common<br />
LogFormat "%{Referer}i -&gt; %U" referer<br />
LogFormat "%{User-agent}i" agent<br />
#<br />
# Журнал доступа для виртуальных хостов, если эти параметры для них отдельно не определены<br />
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined<br />
#<br />
# Подключение доп. конфигов<br />
Include /etc/apache2/conf.d/<br />
#<br />
# Подключение виртуальных хостов<br />
Include /etc/apache2/sites-enabled/ </code></p>
<p>Выше я упомянул об MPM &#8211; мультипроцессорной модели. Вкратце, это вот что (из Википедии):</p>
<blockquote><p>[...] архитектура многопроцессорных компьютеров, в которой два или более одинаковых процессоров подключаются к общей памяти. [...] SMP системы позволяют любому процессору работать над любой задачей независимо от того, где в памяти хранятся данные для этой задачи; при должной поддержке операционной системой SMP-системы могут легко перемещать задачи между процессорами, эффективно распределяя нагрузку.</p></blockquote>
<p>В общем, штука нужная. Но для домашнего тестирования сайтов практической пользы от этого я не вижу. Просто оставьте настройки как есть и все будет работать как надо. Если вы собираетесь применять апач в высоконагруженных или требующих высокой степени безопасности проектах, то в этом случае можете углубиться в эти настройки.</p>
<p>В файле /etc/apache2/envvars прописаны глобальные переменные упомянутые в настройках выше &#8211; APACHE_RUN_USER, APACHE_RUN_GROUP и APACHE_PID_FILE. Повторю, что это пользователь и группа, от имени которого запускается апач, а третья переменная это id процесса запущенного апача. Его лучше не изменять. А вот с пользователем и группой нужно немного разобраться.</p>
<p>По умолчанию апач запускается от имени пользователя www-data. Файлы и папки сайта вы скорее всего будете создавать от своего имени. Поэтому апач не сможет ими воспользоваться. В процессе работы сайта кроме чтения файлов понадобиться создавать, изменять и удалять файлы. А для этого потребуются необходимые права.</p>
<p>Допустим вы работаете под пользователем vasya, ваша группа по умолчанию тоже будет называться vasya. Если вы не знаете свои имя, наберите в терминале: <em>whoami</em> и нажмите энтер, в ответ вы увидите свое имя. Чтобы узнать свою группу, наберите команду: <em>groups vasya</em> (вместо vasya подставьте свое имя пользователя). В ответ получите список групп, в которых вы состоите. Если там будет группа с таким же названием как ваше имя пользователя, значит все гуд. Идем дальше.</p>
<p>Как я уже сказал, апач запускается от имени пользователя www-data. Теперь нам нужно добавить этого пользователя в ту же группу, в которой состоите вы. Делается это очень просто. Наберите в терминале следующую команду: <em>sudo usermod -a -G vasya www-data</em> (вместо vasya подставьте свою группу). Если все прошло успешно,остается только раздать права для доступа к папкам и файлам, где лежит наш сайт или сайты. Делается это следующей командой в терминале: <em>sudo chmod -R 770 /home/username/www/</em>. В данном случае сайты лежат в домашней папке пользователя в папке www. Измените этот путь на свой. Права для владельца и для группы (первые две цифры 77) на чтение, выполнение и запись, т. е.  полные права. Для всех остальных прав не назначили (третья цифра 0). Параметр -R означает рекурсивное назначение прав. Права естественно вы можете назначить по своему усмотрению и по своим меркам безопасности, я только привел пример. Но обязательно нужно дать права для выполнения, если вы хотите, чтобы ваши скрипты работали.</p>
<p>Продолжаем настройки. В папке conf.d есть файл charset. В нем можно прописать, какая кодировка будет использоваться по умолчанию. Также в этой папке вы найдете файл security. Как понятно из названия, он отвечает за безопасность сервера. Рассмотрим его подробней.</p>
<p><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;"># ServerTokens<br />
# Настройте, какие данные должен передавать сервер в своих ответах<br />
# Доступные варианты: Full | OS | Minimal | Minor | Major | Prod<br />
#ServerTokens Minimal<br />
ServerTokens OS<br />
#ServerTokens Full<br />
#<br />
# Подпись сервера на выдаваемых страницах (внутренние страницы ошибок,<br />
просмотр фтп-папок, mod_status и mod_info).<br />
# Также можно включить в подпись эл. почту администратора сервера<br />
# Доступные варианты On | Off | EMail<br />
ServerSignature On<br />
#<br />
# Трассировка<br />
# Вкл | Выкл | расширенная:  On | Off | extended<br />
#<br />
TraceEnable Off<br />
#TraceEnable On </code></p>
<p>С настройками закончили. Теперь вы можете настроить апач под свои конкретные нужды.</p>
<p>Очень кратко о том, как подключать модули: <em>a2enmod rewrite</em>. Как видите синтаксис очень простой. Команда a2enmod активирует указанный модуль, в данном случае это модуль rewrite.</p>
<p>Перейдем к хостам. В апаче есть три способа настройки хостов.</p>
<p>Способ первый, самый простой: создаем подкаталог с названием сайта в корне веб-сервера. Например, /var/www/mywebsite. Он будет доступен по адресу http://localhost/mywebsite.</p>
<p>Способ второй, чуть сложнее: создаем в домашней папке каталог www (или любой другой на ваше усмотрение). Активируем модуль UserDir. Для этого в файле apache2.conf нужно добавить строку <em>UserDir www</em>. Здесь www это каталог, который мы создали в своей домашней папке. В ней будет размещаться наш сайт. Активируем модуль UserDir командой <em>sudo a2enmod userdir</em>. Теперь добавим в файл apache2.conf такие строки:</p>
<p><code style="background-color: #ddd; border-left: 3px solid grey; display: block; padding: 3px;"><br />
LoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so<br />
&lt;UserDir www&gt;<br />
UserDir disabled root<br />
&lt;Directory /home/*/www&gt;<br />
AllowOverride FileInfo AuthConfig Limit<br />
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec<br />
&lt;/Directory&gt;<br />
&lt;/IfModule&gt;</code></p>
<p>Сайт будет доступен по адресу http://localhost/~username.</p>
<p>Третий способ, самый сложный. Сложный в плане начального понимания как оно устроено. Но зато очень удобный в плане настроек. Этот способ применяется чаще первых двух. Намного чаще. В статье <a href="http://blog.ildart.ru/2011/01/31/veb-server-na-ubuntu-za-pyat-minut/">Веб-сервер на Убунту за пять минут</a> (советую прочитать его еще раз) я подробно описал, как их создавать, поэтому повторяться не буду.</p>
<p>Использование виртуальных хостов предпочтительней. В этом случае все настройки хостов у вас будут лежать в одном каталоге. И в любой момент всего одной командой вы сможете включать и отключать нужные хосты.</p>
<p>После того, как сделаете все необходимые настройки, не забудьте перезагрузить апач. Команды для управления апачем я написал в самом начале этой статьи.</p>
<p>Хорошего вам аптайма! <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%94%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9+%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80+%D0%BD%D0%B0+Ubuntu+Server+%28%D1%87%D0%B0%D1%81%D1%82%D1%8C+5%29.+%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1176" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/02/22/home-server-ubuntu-5/&amp;t=%D0%94%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%B8%D0%B9+%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80+%D0%BD%D0%B0+Ubuntu+Server+%28%D1%87%D0%B0%D1%81%D1%82%D1%8C+5%29.+%D0%92%D0%B5%D0%B1-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/02/22/home-server-ubuntu-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пишем свою CMS, часть 2</title>
		<link>http://blog.ildart.ru/2012/02/07/pishem-svoyu-cms-2/</link>
		<comments>http://blog.ildart.ru/2012/02/07/pishem-svoyu-cms-2/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 06:20:32 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1287</guid>
		<description><![CDATA[Главная страница Итак, продолжим написание CMS. Или правильней будет сказать начнем. Называться будет Cafe CMS, версия 0.0.1. Кстати, если есть желающие придумать хорошее название и нарисовать логотип, буду очень признателен и включу вас в список разработчиков Для начала создадим все &#8230; <a href="http://blog.ildart.ru/2012/02/07/pishem-svoyu-cms-2/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h2>Главная страница</h2>
<p>Итак, продолжим написание CMS. Или правильней будет сказать начнем. Называться будет Cafe CMS, версия 0.0.1. Кстати, если есть желающие придумать хорошее название и нарисовать логотип, буду очень признателен и включу вас в список разработчиков <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Для начала создадим все необходимые папки и файлы. Будем считать, что мы уже находимся в корневой папке сайта и все пути будут от него.</p>
<p>Создаем три папки: admin, inc и template. В папке admin создаем пустой файл index.php. Это будет &laquo;движок&raquo; админки. В папке inc будем складывать включаемые файлы. Создаем в ней пустой файл db_connect.php. В папке template создаем папку default &#8211; папка для стандарной темы. Другие темы добавляются сюда же. В папке с темой (default) должно быть  4 файла: style.css, header.php, content.php и footer.php. Думаю, их назначение понятно по названиям. Теперь в корне сайта создаем еще два файла: index.php (основной &laquo;движок&raquo; сайта) и install.php &#8211; сразу сделаем установщик, чтобы можно было легко разворачивать новые сайты.</p>
<p>Должна получиться вот такая структура:<br />
|admin<br />
|___index.php<br />
|inc<br />
|___db_connect.php<br />
|template<br />
|___default<br />
|___style.css<br />
|___header.php<br />
|___content.php<br />
|___footer.php<br />
index.php<br />
install.php</p>
<p>Теперь будем наполнять файлы смыслом, т. е. содержимым.</p>
<p>Начнем с главной страницы. Открываем index.php и напишем в него такой код:</p>
<blockquote><p><code><span style="font-family: &amp;amp;quot; color: black; font-size: x-small;"><small><a href="http://s-c.me/24852/s">Copy Source</a> | <a href="http://s-c.me/24852/h">Copy HTML</a></small> </span></code></p>
<ol><code><span style="font-family: &amp;amp;quot; color: black; font-size: x-small;"></p>
<li><span style="color: #cc6633;">&lt;?</span></li>
<li><span style="color: #696969;">//Проверяем наличие файла настроек</span></li>
<li><span style="color: #0000ff;">if</span>(!<a href="http://www.php.net/manual/en/function.file-exists.php">file_exists</a>(<span style="color: #cc6633;">$_SERVER</span>[DOCUMENT_ROOT].<span style="color: #008000;">"/config.php"</span>)){</li>
<li> <span style="color: #696969;">//если файла нет, предлагаем установку CMS и завершаем работу скрипта</span></li>
<li> <span style="color: #0000ff;">echo</span> <span style="color: #008000;">"&lt;p style=\"width:300px;border:1px #ff0000 solid;background-color:#fdcaca;color:#ff0000;padding:20px;margin:20px auto 20px auto;font-family:Tahoma,Arial,FreeSans,Garuda,Utkal,sans-serif;\"&gt;</span><br />
<span style="color: #008000;">Файл настроек не&amp;nbsp;найден или к&amp;nbsp;нему нет доступа. Возможно CMS не&amp;nbsp;установлена. Проверьте права на&amp;nbsp;файл config.php.&lt;/p&gt;</span><br />
<span style="color: #008000;">&lt;p style=\"width:300px;border:1px #00ff00 solid;background-color:#eaffdd;color:#00a000;padding:20px;margin:0px auto 0px auto;font-family:Tahoma,Arial,FreeSans,Garuda,Utkal,sans-serif;\"&gt;Для установки системы перейдите по&amp;nbsp;ссылке &lt;a href=\"/install.php\"&gt;http://"</span>.<span style="color: #cc6633;">$_SERVER</span>[SERVER_NAME].<span style="color: #008000;">"/install.php&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Связаться с разработчиком можно по адресу &lt;a href=\"mailto:rad-li@ya.ru\"&gt;rad-li@ya.ru&lt;/a&gt;&lt;/p&gt;"</span>;</li>
<li><span style="color: #0000ff;">exit</span>();</li>
<li>}</li>
<li><span style="color: #696969;">//если файл настроек на месте, включаем его и продолжаем вывод страницы</span></li>
<li><span style="color: #0000ff;">else</span>{</li>
<li> <span style="color: #0000ff;">include</span> <span style="color: #cc6633;">$_SERVER</span>[DOCUMENT_ROOT].<span style="color: #008000;">"/config.php"</span>;</li>
<li> <span style="color: #696969;">//включаем шапку; файл header.php находится в папке /template в папке с темой оформления</span></li>
<li> <span style="color: #0000ff;">include</span> <span style="color: #cc6633;">$_SERVER</span>[DOCUMENT_ROOT].<span style="color: #008000;">"/template/"</span>.<span style="color: #cc6633;">$template</span>.<span style="color: #008000;">"/header.php"</span>;</li>
<li> <span style="color: #696969;">//здесь выводим содержимое страницы; файл content.php находится в папке /template в папке с темой оформления</span></li>
<li> <span style="color: #0000ff;">include</span> <span style="color: #cc6633;">$_SERVER</span>[DOCUMENT_ROOT].<span style="color: #008000;">"/template/"</span>.<span style="color: #cc6633;">$template</span>.<span style="color: #008000;">"/content.php"</span>;</li>
<li> <span style="color: #696969;">//включаем подвал; файл footer.php находится в папке /template в папке с темой оформления</span></li>
<li> <span style="color: #0000ff;">include</span> <span style="color: #cc6633;">$_SERVER</span>[DOCUMENT_ROOT].<span style="color: #008000;">"/template/"</span>.<span style="color: #cc6633;">$template</span>.<span style="color: #008000;">"/footer.php"</span>;</li>
<li>}</li>
<li><span style="color: #cc6633;">?&gt;</span></li>
<p></span></code></ol>
<p><code><span style="font-family: &amp;amp;quot; color: black; font-size: x-small;"> </span></code></p></blockquote>
<h3>Принцип работы</h3>
<p>В самом начале проверяется наличие файла config.php в корне сайта. В этом файле будут записаны основные настройки сайта (данные для подключения к БД, выбранная тема и т. д .). Если этого файла нет, значит CMS еще не установлена. Выводм об этом сообщение и предлагаем перейти к установщику.</p>
<p>У функции file_exists() есть одна особенность.  Если вы вызовите file_exists() на несуществующем файле, она будет возвращать FALSE до тех пор, пока вы не создадите этот файл. Если же вы создадите файл, она будет возвращать TRUE даже если затем вы его удалите. Поэтому, если вы не хотите, чтобы информация о файле или каталоге, с которым вы работаете, кешировалась, на время тестирования скриптов используйте функцию clearstatcache().</p>
<p>Если же файл есть, т. е. CMS установлена, продолжаем вывод контента. Сначала включаем файл с настройками config.php, далее подключаем три файла header.php, content.php и footer.php. Все они находятся в папке template/default/. Вместо папки default может быть другая в завсисмости от выбранной темы оформления, поэтому обозначаем ее переменной $template. Ее значение будет записано в файле config.php, который создается при установке CMS. Сохраняем, закрываем.</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC+%D1%81%D0%B2%D0%BE%D1%8E+CMS%2C+%D1%87%D0%B0%D1%81%D1%82%D1%8C+2+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1287" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/02/07/pishem-svoyu-cms-2/&amp;t=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC+%D1%81%D0%B2%D0%BE%D1%8E+CMS%2C+%D1%87%D0%B0%D1%81%D1%82%D1%8C+2" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/02/07/pishem-svoyu-cms-2/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Пишем свою CMS, часть 1</title>
		<link>http://blog.ildart.ru/2012/02/03/pishem-svoyu-cms-1/</link>
		<comments>http://blog.ildart.ru/2012/02/03/pishem-svoyu-cms-1/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 06:29:52 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1281</guid>
		<description><![CDATA[Создаем свою CMS Несколько лет назад я выучил php, потом MySQL и начал писать всякие мелкие скрипты для своих сайтов, которые раньше были статичными, на голом html-е. Некоторые скрипты были очень простыми, выводили курс доллара или погоду, некоторые были посложнее, &#8230; <a href="http://blog.ildart.ru/2012/02/03/pishem-svoyu-cms-1/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.ildart.ru/wp-content/uploads/2012/02/cms.jpg"><img class="alignright size-full wp-image-1283" title="cms" src="http://blog.ildart.ru/wp-content/uploads/2012/02/cms.jpg" alt="" width="320" height="240" /></a>Создаем свою CMS</p>
<p>Несколько лет назад я выучил php, потом MySQL и начал писать всякие мелкие скрипты для своих сайтов, которые раньше были статичными, на голом html-е. Некоторые скрипты были очень простыми, выводили курс доллара или погоду, некоторые были посложнее, иногда это были доработки функционала каких-то мелких CMS. В итоге накопилось много скриптов и они не были как-то упорядочены, все писалось на скорую руку. Когда требовалось, например, сделать вывод курса доллара, приходилось искать, где же я его применял, бывало что и вовсе писал заново. После очередного такого поиска зародилась мысль собрать все это в одну библиотеку скриптов. Но в скоре, обнаружив большое количество таких сайтов в интернете (сборников скриптов), я передумал делать еще один подобный, а замахнулся выше &#8211; сделать свою CMS &#8211; систему управления сайтом. До этого я уже писал нечто похожее на CMS, то есть делал сайты с админкой, но они были настолько простыми, что CMS-ом их никак не назовешь.</p>
<p>Обдумываем за и против</p>
<p>Многие скажут зачем изобретать еще один велосипед, ведь создано достаточное количество CMS на любой вкус, для любых типов сайтов, платные и бесплатные. Да, это так. Я работал с разными системами, но всегда оставалось ощущение, что чего-то в них не хватает. К тому же для добавления в них своего функционала необходимо понять как все устроено. Многие функциональные системы занимают объем намного больший, чем сам сайт. Например, около года назад я админил сайт одной фирмы сделанный на Битриксе (версию не помню, но немного старая). Сам Битрикс занимал в 3 раза больше места, чем сам сайт. Это проблема скорее больших функциональных CMS а-ля все в одном расчитанных на разные тпы сайтов (визитка, блог, портал). В своей CMS я попытаюсь избежать этого.</p>
<p>Еще одно &laquo;за&raquo; &#8211; это получение опыта в написании чего-то большого, законченного, работающего. Больше не надо будет для новых сайтов думать как реализовать тот или иной функционал, все будет в одном месте.</p>
<p>Не скажу, что владею php на уровне профи, но для написания CMS знаний хватит. Местами будет встречаться быдлокод, уж простите, как умею.. Конструктивная критика привествуется.</p>
<p>Лично для себя я вижу кучу &laquo;за&raquo; и одно &laquo;против&raquo; &#8211; свободного времени станет меньше. CMS-ке быть! Приглашаю всех желающих поэксперемнтировать со мной. Пусть у каждого будет своя система управления сайтом <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Наверно у многих, кто решил написать свою CMS аргументы за будут примерно такими же, но это все мое имхо))</p>
<p>План действий</p>
<p>Разработку буду вести на своем домашнем сервере. Создадим новый хост на сервере. Как это сделать описано тут. Как поднять веб-сервер, создать хосты я описывал <a href="http://blog.ildart.ru/2011/05/23/home-ubuntu-server/">в соотвествующих записях блога</a> .</p>
<p>CMS не будет сразу супер-пупер функциональной. Начнем с версии &laquo;сайт визитка&raquo; и постепенно версия за версией будем доводить функционал до ума. Релизы буду выкладывать на демо сайте (добавлю его позже, как появится более менее работающая версия).</p>
<p>Интересное название я так и не смог придумать, поэтому сейчас назову его Cafe CMS, а потом посмотрим. Если у вас есть что предложить, напишите в каментах <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Выбор лицензии остановился на этапе прочтения разных версий СС, но CMS будет полностью бесплатная. Вы можете его копировать, распространять, изменять и т. д. сохранив при этом лицензию и ссылку на разработчика. О лицензии напишу отдельно.</p>
<p>Структура CMS</p>
<p>/admin/<br />
/inc/<br />
/template/<br />
config.php<br />
index.php<br />
install.php<br />
.htaccess</p>
<p>Панель управления будет находится в папке admin. Включаемые файлы в папке inc, тема оформления в temlpate. Сам движок в index.php. Настройки будем писать в config.php. install.php нужен будет для установки и начальной настройки системы. После уставноки файл удаляется. Вся информация будет храниться в базе данных.</p>
<p>Возможно с наращиванием функционала структура постепенно будет меняться. Сейчас этого вполне достаточно.</p>
<p>На этом пока все. Вопросы, предложения в каментах.</p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC+%D1%81%D0%B2%D0%BE%D1%8E+CMS%2C+%D1%87%D0%B0%D1%81%D1%82%D1%8C+1+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1281" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/02/03/pishem-svoyu-cms-1/&amp;t=%D0%9F%D0%B8%D1%88%D0%B5%D0%BC+%D1%81%D0%B2%D0%BE%D1%8E+CMS%2C+%D1%87%D0%B0%D1%81%D1%82%D1%8C+1" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/02/03/pishem-svoyu-cms-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Анонс</title>
		<link>http://blog.ildart.ru/2012/01/22/anons/</link>
		<comments>http://blog.ildart.ru/2012/01/22/anons/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 07:54:21 +0000</pubDate>
		<dc:creator>Ильдар Галиуллин</dc:creator>
				<category><![CDATA[Разное]]></category>

		<guid isPermaLink="false">http://blog.ildart.ru/?p=1278</guid>
		<description><![CDATA[Пишу в блог редко из-за нехватки времени. Занят переездом и ремонтом квартиры. Еще между делом открыл свое дело &#8211; фотосалон. Предприниматель типа Все время забирает он. Статьи про домашний сервер на Убунту и про Damn Small Linux продолжатся. Плюс начну &#8230; <a href="http://blog.ildart.ru/2012/01/22/anons/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.ildart.ru/wp-content/uploads/2012/01/1248513875_pic_id236775.jpeg"><img class="alignright size-full wp-image-1279" title="afisha" src="http://blog.ildart.ru/wp-content/uploads/2012/01/1248513875_pic_id236775.jpeg" alt="" width="353" height="500" /></a>Пишу в блог редко из-за нехватки времени. Занят переездом и ремонтом квартиры. Еще между делом открыл свое дело &#8211; фотосалон. Предприниматель типа <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Все время забирает он.</p>
<p>Статьи про домашний сервер на Убунту и про Damn Small Linux продолжатся. Плюс начну новый цикл на тему как написать свою CMS (систему управления сайтом). Накопилось много мелких скриптов, хочется все их объединить в одно целое, чтобы каждый раз не думать где же я это применял. Хочется применить весь опыт в программировании и сделать что-нибудь большое <img src='http://blog.ildart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="tweetthis" style="text-align:left;"><p> <a class="tt" href="http://twitter.com/intent/tweet?text=%D0%90%D0%BD%D0%BE%D0%BD%D1%81+http%3A%2F%2Fblog.ildart.ru%2F%3Fp%3D1278" title="Post to Twitter"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/twitter/tt-twitter-big1.png" alt="Post to Twitter" /></a>     <a class="tt" href="http://www.facebook.com/share.php?u=http://blog.ildart.ru/2012/01/22/anons/&amp;t=%D0%90%D0%BD%D0%BE%D0%BD%D1%81" title="Post to Facebook"><img class="nothumb" src="http://blog.ildart.ru/wp-content/plugins/tweet-this/icons/en/facebook/tt-facebook-big1.png" alt="Post to Facebook" /></a>    </p></div>]]></content:encoded>
			<wfw:commentRss>http://blog.ildart.ru/2012/01/22/anons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

