<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>Заметки разработчика</title>
	
	<link>http://dev.ezoterik.info</link>
	<description>Шпаргалки по найденным решениям и всякая всячина на компьютерную тему…</description>
	<lastBuildDate>Fri, 15 Jul 2011 16:06:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/devezoterik" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="devezoterik" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">devezoterik</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fdevezoterik" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevezoterik" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
		<title>Google+ круги == Facebook списки друзей</title>
		<link>http://dev.ezoterik.info/facebook-circles/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=facebook-circles</link>
		<comments>http://dev.ezoterik.info/facebook-circles/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 16:06:25 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[ЛикБез]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=146</guid>
		<description>&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_logo.png" alt="Google+ круги == Facebook списки друзей" title="Google+ круги == Facebook списки друзей" width="180" height="135" class="alignright size-full wp-image-165" /&gt;В последнее время много шума вокруг кругов Google+. И тут и там слышны фразы вроде &amp;#171;наконец-то я смогу одни фотки показывать только близким друзьям, а другие только сотрудникам&amp;#187; (говорится подобное в противовес Facebook). Судя по всему, многие не знают, что такая же возможность есть и была с давних времен на Facebook. Да, она не так очевидна и визуально красива (в Google+ процесс разбрасывания знакомых по кругам прямо таки затягивает &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; ), но она есть и достаточно неплохо работает.&lt;/p&gt;
&lt;p&gt;Итак, если вам нужна возможность разделять информацию для разных типов друзей на фейсбуке, и вы не в курсе этой возможности, надеюсь, мое мини руководство по созданию &amp;#171;кругов на Facebook&amp;#187; будет полезным.&lt;br /&gt;
&lt;br /&gt;
В Facebook есть понятие &amp;#171;списки друзей&amp;#187; (группы контактов). Находятся эти списки здесь (&amp;#171;Аккаунт&amp;#187; -&gt; &amp;#171;Редактирование списка друзей&amp;#187;) [1, 2]:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_1.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_1-300x91.png" alt="Редактирование списка друзей" title="Редактирование списка друзей" width="300" height="91" class="aligncenter size-medium wp-image-152" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Для начала нужно создать разные по смыслу группы/списки [3, 4] с расчетом на то, что в последствии персонально для каждой из них мы сможем в разной степени &amp;#171;перекрывать кислород&amp;#187; &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br /&gt;
После нажатия на кнопку №4 появится диалог (в нем же сразу можно отметить людей, которые будут находиться в создаваемом списке):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_3.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_3-300x296.png" alt="Диалог создания нового списка" title="Диалог создания нового списка" width="300" height="296" class="aligncenter size-medium wp-image-154" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Я создал для примера следующие группы (для того, чтоб создать еще один список, нужно возвращаться в пункт меню &amp;#171;Друзья&amp;#187; в меню слева): &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Семья&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Друзья&lt;/strong&gt;&lt;br /&gt;достаточно близкие друзья, те, с которыми можно общаться совсем неформально.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Знакомые&lt;/strong&gt;&lt;br /&gt;люди, с которыми хотя бы раз встречался в жизни.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Конференции&lt;/strong&gt;&lt;br /&gt;знакомства с разного рода конференций профессиональной направленности.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Не знакомые&lt;/strong&gt;&lt;br /&gt;те кого в жизни не встречал, но по каким-либо причинам друг друга читаем.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Сотрудники&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Бывшие сотрудники&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_2.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_2.png" alt="Пример готового списка друзей" title="Пример готового списка друзей" width="206" height="365" class="aligncenter size-full wp-image-153" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;По умолчанию все ваши друзья не находятся в какой-либо из групп, поэтому нужно каждому назначить группу, подходящую контакту по смыслу. Перейдите в один из созданных вами списков [1] и увидите поле, где можно добавлять людей, набирая их имена [2]:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_4.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_4-300x143.png" alt="Заполнение списка" title="Заполнение списка" width="300" height="143" class="aligncenter size-medium wp-image-155" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Так, переходя в каждый из списков, можно все их заполнить.&lt;/p&gt;
&lt;p&gt;Когда контакт уже добавлен в какой-то из списков, если на него навести мышкой, напротив его имени появляется кнопка &amp;#171;Редактировать списки&amp;#187; [1], нажав на которую можно выбрать дополнительные группы для него, или же убрать из списков [2]:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_5.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_5-300x153.png" alt="Редактирование списка" title="Редактирование списка" width="300" height="153" class="aligncenter size-medium wp-image-156" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Я предпочитаю по возможности не увлекаться и назначать контакту максимум две группы (иначе в итоге все контакты рискуют превратиться в однородную массу, и все манипуляции по разделению потеряют смысл).&lt;/p&gt;
&lt;p&gt;Так же, когда вы будете принимать запрос на дружбу с новым человеком, вы сможете сразу же указать, к какой группе он принадлежит (или это можно будет сделать позже, через раздел управления списками друзей).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_6.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_6-300x194.png" alt="Пример диалога на добавление нового человека в друзья" title="Пример диалога на добавление нового человека в друзья" width="300" height="194" class="aligncenter size-medium wp-image-157" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Разделяй и властвуй&lt;/h3&gt;
&lt;p&gt;Основная работа сделана. Когда все разделены, остается &lt;del datetime="2011-07-15T15:34:23+00:00"&gt;властвовать&lt;/del&gt; разобраться с тем, как публиковать материал исключительно для какой-то из групп.&lt;br /&gt;
К примеру, если вы публикуете свой статус, вы набираете текст [1], а потом нажимаете на кнопку с замочком [2]:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_7.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_7-300x88.png" alt="Публикация статуса" title="Публикация статуса" width="300" height="88" class="aligncenter size-medium wp-image-158" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Выбираете пункт &amp;#171;Мои настройки&amp;#187;, появится диалоговое окно, в котором можно указать человека [1, 2] (или нескольких) и только он будет видеть запись, так же можно указать, кто конкретно не должен видеть записи [3].&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_8.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_8-300x189.png" alt="Диалог &amp;quot;Мои настройки конфиденциальности&amp;quot;" title="Диалог &amp;quot;Мои настройки конфиденциальности&amp;quot;" width="300" height="189" class="aligncenter size-medium wp-image-159" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Основной момент заключается в том, что можно указывать не только персонально людей, но и названия групп контактов (я, если честно, до этого момента совсем не сразу додумался в свое время&amp;#8230;). После того, как указаны нужные настройки, жмем кнопку &amp;#171;Сохранить настройки&amp;#187; [4] и публикуем свой статус, нажав &amp;#171;Поделиться&amp;#187;.&lt;br /&gt;
И этот принцип работает при публикации любого типа материалов (в том числе и фотоальбомов), везде, где есть замочек.&lt;/p&gt;
&lt;p&gt;В результате мы увидим свою заметку, в которой будет присутствовать замочек, означающий, что запись опубликована не для всех (если на него навести мышку, то можно подробнее увидеть, для кого будет доступна эта запись):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_9.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_9-300x72.png" alt="Опубликованный статус (только для близких друзей)" title="Опубликованный статус (только для близких друзей)" width="300" height="72" class="aligncenter size-medium wp-image-160" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Конфиденциальность&lt;/h3&gt;
&lt;p&gt;Только не забывайте, что все эти &amp;#171;круги&amp;#187; &amp;#8212; это не средство для сохранения конфиденциальности данных (это касается и Google+ и Facebook). Никто не мешает вашим знакомым поделиться вашей записью со своими знакомыми, а те со своими&amp;#8230; и так в итоге информация может дойти и до тех, от кого вы ее, возможно, скрывали. Круги (или группы контактов) — это, скорее, средство как-то распределять информацию по нескольким каналам, вместо того, чтоб всем и вся сообщать обо всех аспектах своей жизни (далеко не во всех случаях это будет уместным).&lt;/p&gt;
&lt;h3&gt;Стандартные настройки видимости&lt;/h3&gt;
&lt;p&gt;Есть еще одно место, где можно удобно использовать созданные списки друзей (в принципе, это даже рекомендовано, так как настройки по умолчанию отчасти делают вас слишком открытым для всех). Переходим в &amp;#171;Аккаунт&amp;#187; -&gt; &amp;#171;Настройки конфиденциальности&amp;#187;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_10.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_10-300x84.png" alt="Переход к &amp;quot;Настройки конфиденциальности&amp;quot;" title="Переход к &amp;quot;Настройки конфиденциальности&amp;quot;" width="300" height="84" class="aligncenter size-medium wp-image-161" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;И видим две полезные ссылки, &amp;#171;Настройки просмотра&amp;#187; [1] и &amp;#171;Изменить настройки&amp;#187; [2]:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_11.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_11-300x282.png" alt="Настройки конфиденциальности" title="Настройки конфиденциальности" width="300" height="282" class="aligncenter size-medium wp-image-162" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Пройдясь по каждому из пунктов в этих настройках, можно оградить себя от лишних зрителей какой-то информации. Я к примеру, в разделе &amp;#171;Настройки просмотра&amp;#187; дал права смотреть список моих контактов только группе &amp;#171;Семья&amp;#187; и &amp;#171;Друзья&amp;#187;, остальные не будут видеть, с кем я знаком (так как были прецеденты, когда те, кого я не знал лично, и при этом находились в моих контактах, смотрели, с кем я дружу, и рассылали им спам).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_12.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_12-300x65.png" alt="Настройки просмотра" title="Настройки просмотра" width="300" height="65" class="aligncenter size-medium wp-image-163" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Так же, в разделе &amp;#171;Изменить настройки&amp;#187;, может быть полезным пункт &amp;#171;Друзья могут оставлять публикации на моей стене&amp;#187;, можно запретить писать что-то на стене. Избегая таким образом постоянного спама в виде &amp;#171;Нажми сюда и узнаешь, что друг думает о тебе&amp;#187; и другую подобную ересь (а еще бывает, даже знакомые люди пытаются на твоей стене рекламировать что-то свое, тоже &amp;#171;интересный&amp;#187; финт&amp;#8230;).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_13.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2011/07/facebook_circles_13-300x63.png" alt="Подробное редактирование настроек конфиденциальности" title="Подробное редактирование настроек конфиденциальности" width="300" height="63" class="aligncenter size-medium wp-image-164" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Если есть вопросы касательно списков друзей в Facebook, не стесняйтесь задавать их в комментариях.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS. Интерфейс Google+ действительно пока производит приятные впечатления по сравнению с Facebook, но в Facebook гораздо больше возможностей. Интересно, не запутают ли они его и не усложнят к тому времени, когда воплотят в жизнь все то, что есть у Facebook (а от активной конкуренции, нам, пользователям и разработчикам, по идее, будет только лучше &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; ).&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=gKE63ZYWxJc:JPZbGjmbbdQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=gKE63ZYWxJc:JPZbGjmbbdQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=gKE63ZYWxJc:JPZbGjmbbdQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=gKE63ZYWxJc:JPZbGjmbbdQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/gKE63ZYWxJc" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/facebook-circles/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CakePHP без базы данных</title>
		<link>http://dev.ezoterik.info/cakephp-bez-bazy-dannyx/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cakephp-bez-bazy-dannyx</link>
		<comments>http://dev.ezoterik.info/cakephp-bez-bazy-dannyx/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 14:10:04 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Сниппеты]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=136</guid>
		<description>&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2010/04/cake-logo-no-db.png" alt="CakePHP без базы данных" title="CakePHP без базы данных" width="172" height="171" class="alignnone size-full wp-image-121" align="right" /&gt;Часто видел в интернете упреки в сторону CakePHP в том смысле, что ему для работы обязательно нужна база данных, и это, мол, великое зло. Как-то не обращал внимания на данные утверждения (и правильно делал), так как всегда использовал базу данных. Но вот случилась необходимость сделать сайт на CakePHP без БД (временный сайт, со статикой, в будущем подразумевающий развитие до использования базы). В русскоязычной части интернета не удалось найти решения этой задачи (ясно примерно как это сделать, но хочется готового &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt;  ), к счастью, на англоязычном блоге был найден ответ.&lt;/p&gt;
&lt;p&gt;Итак, приступим.&lt;br /&gt;
&lt;br /&gt;
Сначала нужно создать для кейка новый источник данных (который будет заглушкой, по сути, и с данными никак работать не будет).&lt;/p&gt;
&lt;p&gt;Создаем папку:&lt;br /&gt;
&lt;em&gt;app/models/datasources/dbo&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;В которой нужно создать файл с именем:&lt;br /&gt;
&lt;em&gt;dbo_dummy_source.php&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;В этом файле мы и опишем свой &amp;#171;источник данных&amp;#187;. Вот содержимое файла:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
&amp;lt;?php
class DboDummySource extends DataSource {
	 var $description = &amp;quot;This is a dummy data source&amp;quot;;
	 function connect() {
		  $this-&amp;gt;connected = true;
		  return $this-&amp;gt;connected;
	 }
	 function disconnect() {
		  $this-&amp;gt;connected = false;
		  return !$this-&amp;gt;connected;
	 }
	 function value($string) {
		  return &amp;quot;\0&amp;quot;.$string.&amp;quot;\0&amp;quot;;
	 }
}
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Вот и все. Теперь осталось только указать в файле конфигурации базы данных (&amp;#171;&lt;em&gt;app/config/database.php&lt;/em&gt;&amp;#171;) наш фиктивный драйвер, вместо реального драйвера подключения к базе данных, обычно это &amp;#171;mysql&amp;#187;. Файл конфигурации в итоге должен выглядеть примерно так:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
&amp;lt;?php
class DATABASE_CONFIG {
	 var $default = array( 'driver' =&amp;gt; 'dummy_source');
}
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;И не забываем во всех моделях указать, что база данных для них не используется:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
var $useTable = false;
&lt;/pre&gt;
&lt;p&gt;В &lt;a href="http://www.insecure.ws/2009/06/09/cakephp-without-a-database"&gt;источнике решения&lt;/a&gt; автор пишет, что проверял данный код в версии кейка &lt;strong&gt;1.2.x&lt;/strong&gt;. Я проверял на &lt;strong&gt;1.3 RC4&lt;/strong&gt; – работает.&lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=yINka6-39Bg:htCG_6AK4hM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=yINka6-39Bg:htCG_6AK4hM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=yINka6-39Bg:htCG_6AK4hM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=yINka6-39Bg:htCG_6AK4hM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/yINka6-39Bg" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/cakephp-bez-bazy-dannyx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flv и субтитры</title>
		<link>http://dev.ezoterik.info/flv-i-subtitry/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=flv-i-subtitry</link>
		<comments>http://dev.ezoterik.info/flv-i-subtitry/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 19:22:08 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[flv]]></category>
		<category><![CDATA[Macromedia Flash Player]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=98</guid>
		<description>&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/12/subtitles_ico.png" alt="Flv и субтитры" width="200" height="200" class="alignnone size-full wp-image-121" align="right" /&gt;Предположим, вам понравился какой-то видео файл на youtube (или в любой подобной системе, суть в том, что этот файл хранится в интернете в формате flv), и вы хотите его показать другим людям, разместив это видео на своем сайте или блоге, но, к сожалению, фильм не на русском языке. В этом случае может появиться потребность в его русификации, самый простой способ сделать это &amp;#8212; создание субтитров для фильма.&lt;/p&gt;
&lt;p&gt;Конечно, можно сделать такие субтитры почти в любом видео-редакторе, создав в итоге свой уникальный видео-файл. Но в этом методе есть ряд неудобств:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;нужно уметь пользоваться подобными видео-редакторами,&lt;/li&gt;
&lt;li&gt;нельзя будет легко откорректировать титры при необходимости (ведь они уже будут намертво замурованы в видео),&lt;/li&gt;
&lt;li&gt;так как на выходе вы получите свой модифицированный видео-файл, вам нужно будет дополнительно заботиться о том, где его хранить в интернете, чтоб иметь возможность показывать его на своем сайте, а если же хранить прямо на своем сайте, то это может угрожать нежелательным расходом трафика,&lt;/li&gt;
&lt;li&gt;при сохранении отредактированного видео его качество будет хуже оригинала.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Мне этот способ не подошел из-за последних трех минусов, поэтому пришлось искать другое решение, более гибкое и простое, которым я и хочу поделиться.&lt;br /&gt;
&lt;br /&gt;
В общих словах, все выполнение этой задачи выглядит так: находим ссылку на нужный нам файл в flv формате, в специальном редакторе создаем субтитры (в виде отдельного текстового файла), размещаем у себя на сайте специальный плеер (в котором далее будем проигрывать  видео с чужого сервера) и файл субтитров. Обо всем этом ниже, подробнее.&lt;/p&gt;
&lt;h3&gt;Ссылка на видео файл&lt;/h3&gt;
&lt;p&gt;На данном этапе предполагается, что вы сами в состоянии узнать ссылку на нужный вам фал (обычно верный знак нужной ссылки &amp;#8212; это расширение .flv в конце адреса).&lt;br /&gt;
Я для примера взял видео файл с таким адресом:&lt;br /&gt;
&lt;em&gt;http://content.longtailvideo.com/videos/flvplayer.flv&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Создаем субтитры&lt;/h3&gt;
&lt;p&gt;Я нашел только один онлайновый сервис, подходящий в данной ситуации (хотя, возможно, и существуют какие-то другие подобные инструменты) &amp;#8212; &lt;a href="http://subtitle-horse.org/"&gt;Subtitle Horse&lt;/a&gt;.&lt;br /&gt;
После того, как заходишь на сайт, сразу же предлагается ввести адрес ролика, для которого мы хотим создать субтитры. Вставляем нашу ссылку (1) и переходим непосредственно к делу (2):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2009/12/1.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/12/1-300x151.png" alt="Рисунок 1" title="Рисунок 1" width="300" height="151" class="aligncenter size-medium wp-image-102" align="center" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;После чего появится следующее окно:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2009/12/2.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/12/2-300x209.png" alt="Рисунок 2" title="Рисунок 2" width="300" height="209" class="aligncenter size-medium wp-image-103" align="center" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Принцип прост. Слева вы можете просматривать ролик (можно так же прокручивать ролик к нужным местам) (1), останавливая его в нужные моменты (там, где нужно будет вставлять текстовую фразу). После того, как поставите паузу, ниже пишите текст (перевод, или, допустим, все это можно использовать для вставки своих комментариев в видео). Как можно увидеть, там есть примитивные средства форматирования текста (жирность, выравнивание), которыми можно воспользоваться при необходимости (2). Когда все готово, жмем кнопку &amp;#171;Create&amp;#187; (3).&lt;/p&gt;
&lt;p&gt;В правой части (4) вы увидите созданную запись субтитров (как и в области просмотра видео). Теперь можно отмотать видео немного назад и в режиме просмотра посмотреть, как будет выглядеть текст на практике. Также всегда в правой части можно кликнуть на нужном фрагменте текста (тогда ролик автоматически промотается к соответствующему фрагменту) и отредактировать его, откорректировав текст, сместив его по времени или указав более продолжительное время, в течение которого текст должен оставаться на экране.&lt;/p&gt;
&lt;p&gt;В итоге у меня получилась следующая картина:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2009/12/3.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/12/3-300x209.png" alt="Рисунок 3" title="Рисунок 3" width="300" height="209" class="aligncenter size-medium wp-image-104" align="center" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;После того, как все готово, нам нужно будет сохранить результат работы у себя на компьютере. Для этого идем в меню &lt;strong&gt;File &amp;#8212; Export&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2009/12/4.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/12/4-300x212.png" alt="Рисунок 4" title="Рисунок 4" width="300" height="212" class="aligncenter size-medium wp-image-105" align="center" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2009/12/5.png"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/12/5-300x209.png" alt="Рисунок 5" title="Рисунок 5" width="300" height="209" class="aligncenter size-medium wp-image-106" align="center" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;В закладке &amp;#171;Timed Text&amp;#187; (1) будет находиться текст, который нам нужен (2). Его нужно скопировать и сохранить в текстовом файле (в кодировке utf8) с расширением *.xml. Так как этот файл будет размещаться в интернете, назван он должен быть соответствующе, с использованием латинских символов и без пробелов. Я, к примеру, назвал файл именем &amp;#8212; &amp;#171;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2009/12/source_subtitles_test/my_subtitle.xml"&gt;my_subtitle.xml&lt;/a&gt;&amp;#171;.&lt;/p&gt;
&lt;p&gt;Теперь мы готовы перейти к следующему этапу.&lt;/p&gt;
&lt;p&gt;Вообще говоря, в этом редакторе больше возможностей, например, я подразумевал, что всю работу нужно делать в один присест (так как это не обычная программа на компьютере, где можно сохранять результат, а потом открывать его и продолжить работу). Тем временем в этом редакторе есть возможность импорта, то есть можно будет вставить в него содержимое не окоченной работы, которую ранее сохраняли в текстовый файл, и продолжить (а так же, наверняка, есть другие возможности, в которые я не вникал)&amp;#8230; Просто моей целю не было описывать всю ее подноготную. Если же вам часто придется с ней работать, тогда, думаю, вам будет только интереснее, исследуя ее, открывать новые возможности &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;h3&gt;Размещаем на сайте и &amp;#171;скрещиваем&amp;#187;&amp;#8230;&lt;/h3&gt;
&lt;p&gt;Итак, мы имеем ссылку на видео (&lt;em&gt;http://content.longtailvideo.com/videos/flvplayer.flv&lt;/em&gt;) и файл с субтитрами к нему (&amp;#171;&lt;em&gt;my_subtitle.xml&lt;/em&gt;&amp;#171;).&lt;/p&gt;
&lt;p&gt;Онлайн плеер, который умеет проигрывать видео с такими субтитрами, называется &amp;#171;&lt;a href="http://www.longtailvideo.com/players/jw-flv-player/"&gt;JW FLV Media Player&lt;/a&gt;&amp;#171;. Предполагается, что вы уже имели опыт работы с ним или с чем-то подобным. Если нет, то можно почитать &lt;a href="http://webi.ru/webi_articles/10_17_f.html"&gt;здесь&lt;/a&gt;, как его устанавливать на свой сайт и указывать ему, что он должен проигрывать.&lt;/p&gt;
&lt;p&gt;Если вы закачали необходимые файлы для проигрывателя на свой сайт и так же закачали файл субтитров, на странице, где будет размещен видеоролик, нужно будет прописать код, аналогичный следующему (сам видео-файл подгружаем с другого сайта, остальные сопутствующие файлы в данном случае лежат в той же директории, где и html файл, содержимое которого показано ниже):&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;en&amp;quot; xml:lang=&amp;quot;en&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Тэст субтитров&amp;lt;/title&amp;gt;
&amp;lt;meta http-equiv=&amp;quot;Content-Type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot; /&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script type='text/javascript' src='swfobject.js'&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;div id='mediaspace'&amp;gt;Этот текст будет заменен роликом&amp;lt;/div&amp;gt;

&amp;lt;script type='text/javascript'&amp;gt;
  //Указываем расположение плеера и его ширину и высоту
  var so = new SWFObject('player.swf','mpl','400','319','9');
  so.addParam('allowfullscreen','true');
  so.addParam('allowscriptaccess','always');
  so.addParam('wmode','opaque');
  //Указание месторасположения файла с субтитрами
  so.addVariable('captions','my_subtitle.xml');
  //Путь к видео-файлу
  so.addVariable('file','http://content.longtailvideo.com/videos/flvplayer.flv');
  //Отмечаем, что хотим использовать плагин субтитров
  so.addVariable('plugins','captions-1');
  //Вписываем окно плеера в div с id &amp;quot;mediaspace&amp;quot;
  so.write('mediaspace');
&amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://dev.ezoterik.info/wp-content/uploads/2009/12/source_subtitles_test/" target="_blank"&gt;Вот пример&lt;/a&gt; того, как это работает.&lt;/p&gt;
&lt;p&gt;После всех этих операций видео должно проигрываться с субтитрами!&lt;/p&gt;
&lt;p&gt;Если есть такая необходимость, то файл субтитров всегда можно подредактировать вручную, в обычном текстовом редакторе (согласитесь, это гораздо удобнее, в отличие от метода с использованием профессиональных видео-редакторов и пересоздания всего ролика заново).&lt;/p&gt;
&lt;h3&gt;Подводные камни&lt;/h3&gt;
&lt;p&gt;Собственно, пока я спотыкался только об один&amp;#8230; &lt;/p&gt;
&lt;p&gt;Вся эта конструкция не работает в локальных условиях. То есть, если обычным образом запустить html фай из моего примера (который я разместил ниже в виде архива для скачивания) прямо на компьютере, то видео будет проигрываться, но без субтитров. Я часа два &amp;#171;бодался&amp;#187; с этой проблемой, пока не прочел внимательно на официальном сайте плеера, что, при использовании субтитров, в плеер каждый раз на ходу из интернета подкачивается маленький плагин с их сайта, и этот механизм подкачивания работает, только если плеер запускается с какого-то реального сайта. В общем, мой пример нужно размещать у себя на сайте в какую-то директорию (и открыть страницу, уже находящуюся в интернете), чтоб заставить его работать. На локальном веб-сервере субтитры тоже успешно работают.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[ &lt;a href="http://dev.ezoterik.info/wp-content/uploads/2009/12/source_subtitles_test.zip" target="_blank"&gt;Скачать архив с примером&lt;/a&gt; ] (55 КБ)&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=EgnsYO34kzI:Ivzc39f96Yc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=EgnsYO34kzI:Ivzc39f96Yc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=EgnsYO34kzI:Ivzc39f96Yc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=EgnsYO34kzI:Ivzc39f96Yc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/EgnsYO34kzI" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/flv-i-subtitry/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Делаем свой RSS-канал</title>
		<link>http://dev.ezoterik.info/delaem-svoj-rss-kanal/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=delaem-svoj-rss-kanal</link>
		<comments>http://dev.ezoterik.info/delaem-svoj-rss-kanal/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 13:03:10 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[ЛикБез]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=82</guid>
		<description>&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/06/rss_sign.png" alt="Делаем свой RSS-канал" width="200" height="200" class="alignnone size-full wp-image-91"  align="right" /&gt;&lt;/p&gt;
&lt;p&gt;После &lt;a href="http://dev.ezoterik.info/tag/rss/"&gt;серии статей&lt;/a&gt; о том, что такое RSS, у многих владельцев сайтов, у которых нет RSS (а таких не так уж и мало, как могут думать некоторые), может возникнуть желание заполучить его себе:-) В этой статье я хочу перечислить способы организации RSS-канала для своего сайта. Начиная с самых простых способов и заканчивая сложными.&lt;/p&gt;
&lt;p&gt;Изначально нужно быть уверенным, что вы знаете о том, что RSS-документ – это, по сути своей, обычный файл, в котором специальным образом в виде текста описаны те или иные новости (или статьи). В итоге понятие &amp;#171;у меня (у моего сайта) есть RSS-канал&amp;#187; будет выражаться на практике в виде интернет адреса к этому самому документу (у меня на блоге это, к примеру, адрес: &lt;strong&gt;http://feeds.feedburner.com/devezoterik&lt;/strong&gt;). Ваши же читатели, имея этот адрес, в дальнейшем смогут следить за изменениями в этом файле с помощью &lt;a href="http://dev.ezoterik.info/rss_readers/"&gt;специальных программ&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Использование сторонних сервисов (блогов)&lt;/h3&gt;
&lt;p&gt;Способ, пожалуй, один из самых простых (не требует специальных знаний в области программирования, денежных затрат и т.д.), но при этом, как не парадоксально, он не плох. Можно использовать бесплатные сервисы, предоставляющие возможность вести свои блоги. Блоги или по-русски говоря &amp;#171;дневники&amp;#187;, это чаще всего что-то вроде специфических домашних страниц (&lt;a href="http://ru.wikipedia.org/wiki/Блог"&gt;здесь&lt;/a&gt; можно более подробно об этом прочесть) &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; . Во-первых, на всех таких серверах вам выдают ссылку на RSS-документ (RSS-канал) вашего блога. Во-вторых, блоги имеют именно новостную структуру, т.к. все ваши записи в блоге идут последовательно, и каждая из них привязана к какой-либо дате, а это как раз то, что нам нужно.&lt;/p&gt;
&lt;p&gt;То есть идея в том, что где бы вы не содержали свой сайт, вы можете параллельно поддерживать на другом сайте (сервисе, о них чуть позже) актуальную новостную ленту. На своем же сайте вы можете указать ссылку на RSS-документ, которой смогут воспользоваться посетители, желающие следить за вашими новостями.&lt;/p&gt;
&lt;p&gt;Подобных сервисов для ведения своих блогов предостаточное количество в интернете. Одни из самых популярных и надежных это: &lt;a href="http://www.blogger.com"&gt;www.blogger.com&lt;/a&gt;, &lt;a href="http://my.ya.ru"&gt;my.ya.ru&lt;/a&gt; и &lt;a href="http://livejournal.com"&gt;livejournal.com&lt;/a&gt; (но вообще их просто несметное количество, отличающихся обычно немногим). На каждом из указанных мной сервисов есть русская версия с подробной помощью, описывающей, как &amp;#171;завести&amp;#187; свой блог.&lt;/p&gt;
&lt;h3&gt;Использование сервисов генерации RSS из обычных страниц&lt;/h3&gt;
&lt;p&gt;Этот способ так же не требует навыков программирования и подходит в первую очередь людям, которые имеют свой сайт и имеют на нем некую страницу новостей, которые они могут обновлять тем или иным способом, но, тем не менее, не имеют на этом сайте RSS-канала.&lt;/p&gt;
&lt;p&gt;Конечно, можно воспользоваться первым способом: создать где-нибудь блог и дублировать в него новости со своего сайта (обычно это те новости, которые выводят на первой странице сайта). Но тогда ведь постоянно придется дублировать новости с сайта на блог&amp;#8230; Предлагаемый же способ дает альтернативу для более прогрессивных/ленивых (иногда грань между этими понятиями бывает мала &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; ) владельцев сайта.&lt;/p&gt;
&lt;p&gt;Смысл заключается в том, чтобы использовать сервисы, которые будут сами следить за вашей страницей новостей и создавать каждый раз (при обновлении вами страницы) актуальный RSS-документ. О подробностях этого процесса я &lt;a href="http://dev.ezoterik.info/webpage-to-rss/"&gt;уже писал&lt;/a&gt;. Писал в первую очередь для тех, кто хочет следить за чужими сайтами, но никто нам не мешает посмотреть с другой точки зрения и следить за своим &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt;  В итоге мы будет иметь ссылку на автоматически обновляемый RSS-документ, отражающий все новости на вашем сайте (правда, с задержкой около одного часа). Вам лишь нужно будет добавлять новости на свою страницу, не изменяя внутреннего форматирования html документа, чтобы сервисы &amp;#171;слежения&amp;#187; не потерялись на странице в поисках искомых новостей (чтоб узнать более подробную информацию, читайте статью по выше приведенной ссылке).&lt;/p&gt;
&lt;h3&gt;Создание RSS-документа вручную&lt;/h3&gt;
&lt;p&gt;Если по каким-либо причинам вы не хотите, чтоб RSS-документ обитал вне вашего сайта, и при этом вы не программист, остается еще один способ: создавать и обновлять этот документ у себя на сайте вручную (здесь уже понадобится опыт работы с html). В случае использования хостинга без поддержки скриптов и при не слишком частом появлении новостей (иначе вся эта затея будет очень утомительной), это вполне востребованный вариант.&lt;/p&gt;
&lt;p&gt;Для создания и редактирования такого файла лучше всего использовать редактор &lt;a href="http://notepad-plus.sourceforge.net/ru/site.htm"&gt;Notepad++&lt;/a&gt; или любой другой редактор, поддерживающий работу с кодировкой UTF-8 (без BOM). Документ должен быть в кодировке UTF-8 (без BOM). Вот пример того, как может выглядеть RSS-документ внутри (пример снабжен комментариями):&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf&amp;quot; ?&amp;gt;
&amp;lt;rss version=&amp;quot;2.0&amp;quot; xmlns:dc=&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&amp;gt;
&amp;lt;channel&amp;gt;
	&amp;lt;!-- Заголовок RSS-ленты, обычно это название сайта --&amp;gt;
	&amp;lt;title&amp;gt;Мой сайт&amp;lt;/title&amp;gt;
	&amp;lt;!-- Адрес сайта, которому принадлежит RSS-лента --&amp;gt;
	&amp;lt;link&amp;gt;http://www.moi_sait.ru&amp;lt;/link&amp;gt;
	&amp;lt;!-- Описание RSS-ленты --&amp;gt;
	&amp;lt;description&amp;gt;Здесь вы сможете прочесть все последние новости сайта&amp;lt;/description&amp;gt;
	&amp;lt;language&amp;gt;ru-ru&amp;lt;/language&amp;gt;
	&amp;lt;!-- Эта секция (image) не обязательна --&amp;gt;
	&amp;lt;image&amp;gt;
		&amp;lt;!-- Ссылка на логотип для RSS-ленты --&amp;gt;
		&amp;lt;url&amp;gt;http://www.moi_sait.ru/logo.jpg&amp;lt;/url&amp;gt;
		&amp;lt;!-- Заголовок логотипа --&amp;gt;
		&amp;lt;title&amp;gt;Логотип моего сайта&amp;lt;/title&amp;gt;
		&amp;lt;!-- Адрес страницы, на которую должен будет попасть пользователь, кликнувший на логотип --&amp;gt;
		&amp;lt;link&amp;gt; http://www.moi_sait.ru&amp;lt;/link&amp;gt;
	&amp;lt;/image&amp;gt;
	&amp;lt;!--Дата последнего обновления документа. Дата должна быть именно в этом формате --&amp;gt;
	&amp;lt;lastBuildDate&amp;gt;Sun, 07 Jun 2009 04:00:11 +0300&amp;lt;/lastBuildDate&amp;gt;
	&amp;lt;!-- Тэг item описывает один элемент (например, одну новость, или одну статью) --&amp;gt;
	&amp;lt;item&amp;gt;
		&amp;lt;!-- Краткий заголовок новости (или название статьи) --&amp;gt;
		&amp;lt;title&amp;gt;На сайте реализована поддержка RSS&amp;lt;/title&amp;gt;
		&amp;lt;!-- Ссылка на страницу, посвященную этой новости (где может быть, к примеру, более широкое описание, а может, и такое же, как в RSS) --&amp;gt;
		&amp;lt;link&amp;gt;http://www. moi_sait.ru/news/1.htm&amp;lt;/link&amp;gt;
		&amp;lt;!-- Более многословное описание новости (или содержимое статьи). Нужно заметить, что внутри можно использовать html тэги для более красивого форматирования, но в экранированном виде. В примере ниже используется тэг br (перенос строки) в экранированном виде &amp;quot;&amp;amp;lt;br /&amp;amp;gt;&amp;quot;--&amp;gt;
		&amp;lt;description&amp;gt;Ура, наконец-то теперь есть поддержка RSS!&amp;amp;lt;br /&amp;amp;gt;Долой e-mail рассылку!&amp;lt;/description&amp;gt;
		&amp;lt;!-- Дата, к которой привязана новость (или дата публикации новости). Формат ее должен быть такой же, как и дата в тэге lastBuildDate --&amp;gt;
		&amp;lt;pubDate&amp;gt;Fri, 05 Jun 2009 10:39:18 +0300&amp;lt;/pubDate&amp;gt;
		&amp;lt;!-- Необязательный тэг. Который может в себе содержать имя автора статьи или новости --&amp;gt;
		&amp;lt;author&amp;gt;Станислав &amp;amp;lt;stanislav@mail.com&amp;amp;gt;&amp;lt;/author&amp;gt;
		&amp;lt;!-- Та же ссылка на страницу новости, что и в тэге link --&amp;gt;
		&amp;lt;guid isPermaLink=&amp;quot;true&amp;quot;&amp;gt;http://www. moi_sait.ru/news/1.htm&amp;lt;/guid&amp;gt;
	&amp;lt;/item&amp;gt;

	&amp;lt;!-- ...Здесь вы можете повторять секцию item для каждой из своих новостей по аналогии с элементом выше. Стоит лишь отметить, что не желательно, чтоб документ был слишком большим, обычно размещается от 10 до 20 элементов item... --&amp;gt;

&amp;lt;/channel&amp;gt;
&amp;lt;/rss&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Сохранять такой файл в большинстве случаев лучше под именем &amp;#171;rss.xml&amp;#187;. Имя rss уже как традиция, но можно использовать и любое другое имя, а расширение xml просто желательно (в этой статье я не способен оговорить и объяснить всех деталей, так как тогда она была бы явно слишком большой &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; ).&lt;/p&gt;
&lt;h3&gt;Автоматическая генерация RSS-документа на своем сервере&lt;/h3&gt;
&lt;p&gt;Этот способ подходит уже только для более искушенных веб-программированием людей. Если информация на сайте хранится в базе данных, а сами страницы являются серверными скриптами (а ля PHP), тогда становится возможным использовать самый автономный и не обременяющий в дальнейшем способ – создавать в автоматическом режиме RSS-документ при запросе оного пользователями. Описывать, как создать подобный скрипт, не имеет смысла, так как уже есть достаточно статей на эту тему с готовыми примерами и разъяснениям к ним. Вот одни из них (для языка PHP): &lt;a href="http://www.webmagazine.biz/articles/rss-2-0-lenta-na-php-5.html"&gt;ссылка 1&lt;/a&gt;, &lt;a href="http://www.caseclub.ru/articles/webrss.html"&gt;ссылка 2&lt;/a&gt;, &lt;a href="http://www.oqbo.ru/read.php?block=11"&gt;ссылка 3&lt;/a&gt;, &lt;a href="http://www.interface.ru/home.asp?artId=3384"&gt;ссылка 4&lt;/a&gt;, &lt;a href="http://www.ibm.com/developerworks/ru/library/x-phprss/"&gt;ссылка 5&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Скромный посредник &amp;#8212; Feedburner&lt;/h3&gt;
&lt;p&gt;И вот у вас, наконец, есть желанный адрес своей RSS-ленты. Казалось бы, чего еще можно желать? Конечно же, подробной статистики. Именно для этого и был создан сервис &lt;a href="http://feedburner.google.com"&gt;feedburner&lt;/a&gt;. Он позволит вам получать максимально возможную статистику, такую, например, как: количество подписчиков, распределение подписчиков по странам, степень интереса подписчиков к тем или иным новостям, возможность получать ваши RSS-новости по e-mail &lt;a href="http://ru.wikipedia.org/wiki/Feedburner"&gt;и т.д.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Основной принцип работы feedburner`а заключается в том, что он является посредником между вашим RSS-документом и читателями. Вы указываете feedburner`у адрес своей RSS-ленты, после чего feedburner сможет отдавать эту ленту уже из другого адреса (адрес будет таким: &lt;strong&gt;http://feeds.feedburner.com/ + имя вашей RSS-ленты&lt;/strong&gt;). И если пользователи будут подписываться именно на адрес от feedburner`а, вы сможете в полной мере использовать все функции данного сервиса. При этом нужно помнить, что если кто-то подпишется на настоящий адрес вашего канала, вы не сможете получить прелести использования feedburner`а.&lt;/p&gt;
&lt;p&gt;Эта схема поможет придать больше наглядности вышеописанному:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/06/feedburner_scheme.gif" alt="Как работает Feedburner" width="459" height="362" class="aligncenter size-full wp-image-95" align="center" /&gt;&lt;/p&gt;
&lt;p&gt;О настройках feedburner можно прочесть &lt;a href="http://mol4oon.blogspot.com/search/label/FeedBurner"&gt;здесь&lt;/a&gt;. А так же &lt;a href="http://skyden.ru/2009/03/04/registraciya-i-nastrojka-feedburner/"&gt;здесь&lt;/a&gt;, &lt;a href="http://seoforyou.ru/2008/10/rss-i-feedburner-rukovodstvo-po-nastroyke-rss/"&gt;здесь&lt;/a&gt; и &lt;a href="http://www.kavelin.net/2007/10/03/wordpress-feedburner/"&gt;здесь&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;На самом деле, помимо всего прочего, этот сервис несет в себе еще один плюс. Так как все подписчики будут подписываться на RSS-ленту, находящуюся на feedburner, то вы можете, когда захотите, поменять адрес оригинального источника RSS-ленты (например, пробуя со временем разные способы создания RSS, описанные в этой статье, или, может, вы смените адрес сайта), не потеряв при этом всех своих подписчиков (они всегда будут видеть адрес ленты на feedburner, не подозревая о изменении ваших настроек). Если же люди подписывались бы на оригинальный адрес RSS-документа (без посредника в виде feedburner), то при его смене (вами) они перестанут получать новости, так как документа по старому адресу не будет существовать.&lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=GEfQBn6nhGk:CRdqgvYiubY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=GEfQBn6nhGk:CRdqgvYiubY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=GEfQBn6nhGk:CRdqgvYiubY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=GEfQBn6nhGk:CRdqgvYiubY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/GEfQBn6nhGk" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/delaem-svoj-rss-kanal/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>PHP и BBCode</title>
		<link>http://dev.ezoterik.info/php-i-bbcode/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-i-bbcode</link>
		<comments>http://dev.ezoterik.info/php-i-bbcode/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 22:14:31 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[bbcode]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=75</guid>
		<description>&lt;p&gt;У меня периодически появляется потребность в использовании &amp;#171;интерпретатора&amp;#187; &lt;a href="http://ru.wikipedia.org/wiki/Bbcode"&gt;BBCode&lt;/a&gt; в своих проектах (написанного на PHP), и постоянно нет времени искать какое-то более-менее удобоваримое решение, что в итоге выливается в использование или создание &amp;#171;костылей&amp;#187; для каждого конкретного случая.&lt;br /&gt;
Но вот, похоже, получилось найти то, что хотелось.&lt;/p&gt;
&lt;p&gt;Моя претензия к подобным готовым решениям обычно в первую очередь заключается в неспособности этих библиотек правильно обрабатывать абзацы. Фактически они обычно вообще не используют абзацы (тэг &lt;strong&gt;P&lt;/strong&gt;), вместо этого в результате своей работы они просто вставляют тег &lt;strong&gt;&amp;lt;br /&amp;gt;&lt;/strong&gt; , заменяя обычные символы переноса строки. Я считаю такой метод эмулирования абзацев в 98 процентах, мягко говоря, не уместным. Но так как перенос строк по средствам &lt;strong&gt;&amp;lt;br /&amp;gt;&lt;/strong&gt; намного легче реализовать вместо &amp;#171;человеческих&amp;#187; &lt;strong&gt;&amp;lt;p&amp;gt;&lt;/strong&gt;, так большинство и делает &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /&gt;  Некоторые даже придумывают оправдания, что мол с br даже правильнее, отчасти, из-за подобной лени разработчиков различных готовых библиотек, другая часть людей думает, что тэг &lt;strong&gt;P&lt;/strong&gt; является устаревшим (ведь даже во многих готовых продуктах и сайтах абзацы формируются путем использования &lt;strong&gt;&amp;lt;br /&amp;gt;&lt;/strong&gt;) &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Приступим&lt;/h3&gt;
&lt;p&gt;Но, кажется, есть свет в конце туннеля. Это готовый &lt;a href="http://christian-seiler.de/projekte/php/bbcode/index_en.html"&gt;класс для работы с BBCode&lt;/a&gt;, который, судя по всему, отлично справляется со своей задачей (ничего лучше пока не видел). Единственный минус в том, что &lt;a href="http://christian-seiler.de/projekte/php/bbcode/doc/en/chapter1.php"&gt;документация, представленная на сайте&lt;/a&gt;, не на русском языке. Этот минус я и хочу побороть в этой статье, приведя пример использования класса с русскими комментариями.&lt;/p&gt;
&lt;p&gt;Для начала нужно &lt;a href="http://christian-seiler.de/projekte/php/bbcode/download_en.html"&gt;скачать библиотеку&lt;/a&gt; (на момент написания статьи версия библиотеки была 0.3.3). В скачанном архиве в папке src вы обнаружите два нужных нам файла: stringparser.class.php и stringparser_bbcode.class.php.&lt;/p&gt;
&lt;p&gt;Для примера предположим, что у нас есть пустой файл &amp;#171;index.php&amp;#187; и рядом с ним мы создадим папку &amp;#171;/bbcode/&amp;#187;,  содержащую в себе два упомянутых выше файла.&lt;br /&gt;
Для примера минимальное содержимое файла &amp;#171;index.php&amp;#187; должно быть таким (запустив этот пример можно будет сразу увидеть, работает ли библиотека):&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
&amp;lt; ?php
//Вставляем файл библиотеки
require_once 'bbcode/stringparser_bbcode.class.php';

//Создаем объект класса StringParser_BBCode
$bbcode = new StringParser_BBCode ();

//Добавляем объекту класса понятие о тэге [b]
//(в итоге только этот тэг и будет
//обрабатываться этим классом)
$bbcode-&amp;gt;addCode ('b', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;b&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/b&amp;gt;'),
                  'inline', array ('block', 'inline'), array ());

//Обрабатываем тестовую строку и выводим ее в браузер
echo $bbcode-&amp;gt;parse ('Тестовый текст, это слово должно быть [b]жирным[/b]');
?&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;Функция addCode&lt;/h3&gt;
&lt;p&gt;Наибольший интерес в этом коде может вызвать, пожалуй, функция addCode у объекта класса StringParser_BBCode, вот ее прототип и список описание параметров:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
void addCode (string $code, string $type, string $callback, string $params, string $content_type,
              array $allowed_in, array $not_allowed_in);
&lt;/pre&gt;
&lt;p&gt;Эта функция добавляет понятие о тех или иных кодах (bb-кодах) для объекта класса, чтоб он мог потом обнаружить эти коды в тексте и соответствующим образом обработать их. Т.е. можно сказать, что изначально объект класса StringParser_BBCode вообще ничего не знает о стандартных bb-кодах и не способен обработать как-либо их. Поэтому этот объект нужно будет после каждой инициализации &amp;#171;обучать&amp;#187; всем разновидностям bb-кодов.&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;$code (в примере имеет значение &amp;#8216;b&amp;#8217;)&lt;/dt&gt;
&lt;dd&gt;Код, который нужно искать в тексте для обработки. Т.е. если указать код test , то потом в обрабатываемом тексте будет искаться тэг [test] и обрабатываться в соответствии с указаниями в других параметрах рассматриваемой функции.&lt;/dd&gt;
&lt;dt&gt;$type (в примере имеет значение &amp;#8216;simple_replace&amp;#8217;)&lt;/dt&gt;
&lt;dd&gt;Указание того, как тэг должен обрабатываться (какого он типа). Есть различные предопределенные типы тэгов, которые будут описаны ниже. В нашем же примере указан тип &amp;#8216;simple_replace&amp;#8217; который указывает на то, что тэг будет парным (открывающийся тэг [b] и закрывающийся [/b]) и что эти тэги будут заменены на указанные ниже html тэги.&lt;/dd&gt;
&lt;dt&gt;$callback (в примере имеет значение null)&lt;/dt&gt;
&lt;dd&gt;Позволяет указать имя функции, которая должна будет вызваться при обработке найденного тэга в тексте. В случае с типом тэга &amp;#8216;simple_replace&amp;#8217; такая функция не вызывается, и, соответственно, в этом параметре можно указать null.&lt;/dd&gt;
&lt;dt&gt;$params (в примере имеет значение array(&amp;#8216;start_tag&amp;#8217; =&gt; &amp;#8216;&lt;b&gt;&amp;#8216;, &amp;#8216;end_tag&amp;#8217; =&gt; &amp;#8216;&lt;/b&gt;&amp;#8216;))&lt;/dt&gt;
&lt;dd&gt;В этом параметре в основном указывается, какой нужно вставлять html тэг взамен bb тэга. Наименование параметров напрямую зависит от того, какой тип тэга мы указали в параметре $type.&lt;/dd&gt;
&lt;dt&gt;$content_type (в примере имеет значение &amp;#8216;inline&amp;#8217;)&lt;/dt&gt;
&lt;dd&gt;Тип внутреннего содержимого тега. Может принимать значения: &amp;#8216;inline&amp;#8217;, &amp;#8216;block&amp;#8217;, &amp;#8216;link&amp;#8217;, &amp;#8216;image&amp;#8217;. Если я не ошибаюсь, можно прописывать и свои типы чтобы потом можно было указывать для этого содержимого свои индивидуальные фильтры (пример использования фильтров смотрите ниже).&lt;/dd&gt;
&lt;dt&gt;$allowed_in (в примере имеет значение array (&amp;#8216;block&amp;#8217;, &amp;#8216;inline&amp;#8217;))&lt;/dt&gt;
&lt;dd&gt;В этом параметре можно указать, внутри каких типов объектов может находиться создаваемый bb-код (его обработка будет просто игнорироваться в ином случае). В нашем примере мы указали, что элемент может находиться как внутри блочных элементов, так и внутри линейных.&lt;/dd&gt;
&lt;dt&gt;$not_allowed_in (в примере имеет значение array ())&lt;/dt&gt;
&lt;dd&gt;Имеет назначение, противоположное по смыслу предыдущему параметру.&lt;/dd&gt;
&lt;/dl&gt;
&lt;h3&gt;Виды обработки тэгов&lt;/h3&gt;
&lt;p&gt;Описание вариантов значения параметра $type в функции addCode.&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&amp;#8216;simple_replace&amp;#8217;&lt;/dt&gt;
&lt;dd&gt;Описывает простой парный тэг. При использовании этого типа обработки тэга в параметре функции &amp;#8216;params&amp;#8217; должны обязательно присутствовать две ячейки: $params['start_tag'] и $params['end_tag']. &amp;#8216;start_tag&amp;#8217; должен в себе содержать аналог открывающегося тэга в хтмл, а &amp;#8216;end_tag&amp;#8217; – закрывающегося тэга соответственно.&lt;/dd&gt;
&lt;dt&gt;&amp;#8216;simple_replace_single&amp;#8217;&lt;/dt&gt;
&lt;dd&gt;То же самое, что &amp;#8216;simple_replace&amp;#8217;, но используется только лишь для одинарных тэгов, которые, собственно говоря, не имеют содержимого (типа br, hr и т.п.). Требует наличия только параметра $params['start_tag'].&lt;/dd&gt;
&lt;dt&gt;&amp;#8216;callback_replace&amp;#8217;&lt;/dt&gt;
&lt;dd&gt;При этом типе вы перекладываете на себя обработку по найденным совпадениям (с помощью своей callback функции) для парного тэга.&lt;/dd&gt;
&lt;dt&gt;&amp;#8216;callback_replace_single&amp;#8217;&lt;/dt&gt;
&lt;dd&gt;То же самое, что и &amp;#8216;callback_replace&amp;#8217;, но только для одинарных тэгов.&lt;/dd&gt;
&lt;dt&gt;&amp;#8216;usecontent&amp;#8217;&lt;/dt&gt;
&lt;dd&gt;То же самое что и &amp;#8216;callback_replace&amp;#8217;, только в содержимом такого тэга другие тэги не будут обрабатываться, например, это удобно для тэга code.&lt;/dd&gt;
&lt;dt&gt;&amp;#8216;usecontent?&amp;#8217;&lt;/dt&gt;
&lt;dd&gt;Этот тип может себя вести как &amp;#8216;usecontent&amp;#8217; или же как &amp;#8216;callback_replace&amp;#8217; в зависимости от ситуации. Актуальность того или иного варианта определяется за счет присутствия заранее предполагаемого атрибута в bb тэге. Если атрибут найден, то будет использоваться обработка &amp;#8216;callback_replace&amp;#8217;, в другом случае тэг будет обрабатываться как &amp;#8216;usecontent&amp;#8217;. Имя атрибута для поиска указывается через параметр $params['usecontent_param']. Если указано имя default, то подразумевается значение атрибута, присвоенное непосредственно тэгу, например, [url=http://link], значением атрибута default будет текст &amp;#171;http://link&amp;#187;. Этот прием часто используется, например, для тэга [URL]. Этот тэг может использоваться в двух формах: [url]http://www.example.com/[/url] и [url=http://www.example.com/]Текст ссылки, а так же [b]жирный[/b] текст[/url]. В первом случае будет использоваться тип &amp;#8216;usecontent&amp;#8217;, т.к. текст ссылки должен выводиться без какого-либо форматирования (и, собственно, сама ссылка будет некорректна, если в ней будут посторонние символы). В другом случае должен быть использован тип &amp;#8216;callback_replace&amp;#8217;, т.к. сама ссылка передается отдельным параметром, а текст, обрамленный в ссылку, вполне может содержать в себе какое-то форматирование.&lt;br /&gt;
&lt;strong&gt;Примечание:&lt;/strong&gt; Можно указать несколько параметров для их поиска, для чего в $params['usecontent_param'] нужно передать не строку, а массив, содержащий строки. Например: $bbcode-&gt;addCode (&amp;#8230;, array(&amp;#8216;usecontent_param&amp;#8217; =&gt; array (&amp;#8216;parameter1&amp;#8242;, &amp;#8216;parameter2&amp;#8242;)), &amp;#8230;);.&lt;/dd&gt;
&lt;dt&gt;&amp;#8216;callback_replace?&amp;#8217;&lt;/dt&gt;
&lt;dd&gt;Является противоположным вариантом типа &amp;#8216;usecontent?&amp;#8217;. Если один из атрибутов, указанных в usecontent_param, встречается в тэге, он будет обработан как &amp;#8216;usecontent&amp;#8217;, в противном случае как &amp;#8216;callback_replace&amp;#8217;.&lt;/dd&gt;
&lt;/dl&gt;
&lt;h3&gt;Пример кода из &amp;#171;боевых&amp;#187; условий&lt;/h3&gt;
&lt;p&gt;Вот пример файла index.php с более расширенной конфигурацией класса для обрабатывания большего числа тэгов, в нем же и можно понять, как работают callback функции и т.п.:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
&amp;lt; ?php
//Вставляем файл библиотеки
require_once 'bbcode/stringparser_bbcode.class.php';

//Приводит разнообразные переводы строк
//разных операционных систем в единый формат (\n)
function convertlinebreaks ($text) {
	return preg_replace (&amp;quot;/\015\012|\015|\012/&amp;quot;, &amp;quot;\n&amp;quot;, $text);
}

//Удалить все символы, кроме переводов строк
function bbcode_stripcontents ($text) {
	return preg_replace (&amp;quot;/[^\n]/&amp;quot;, '', $text);
}

//Функция для обработки ссылок
function do_bbcode_url ($action, $attributes, $content, $params, $node_object) {
	if (!isset ($attributes['default'])) {
		$url = $content;
		$text = htmlspecialchars ($content);
	} else {
		$url = $attributes['default'];
		$text = $content;
	}
	//Часть функции, которая занимается
	//только валидацией данных тэга
	if ($action == 'validate') {
		if (substr ($url, 0, 5) == 'data:' || substr ($url, 0, 5) == 'file:'
		  || substr ($url, 0, 11) == 'javascript:' || substr ($url, 0, 4) == 'jar:') {
			return false;
		}
		return true;
	}
	//Непосредственное преобразование тэга в
	//html вариант с возвращением результата
	return '&amp;lt;a href=&amp;quot;'.htmlspecialchars ($url).'&amp;quot;&amp;gt;'.$text.'';
}

// Функция для вставки изображений
function do_bbcode_img ($action, $attributes, $content, $params, $node_object) {
	//Часть функции, которая занимается
	//только валидацией данных тэга
	if ($action == 'validate') {
		if (substr ($content, 0, 5) == 'data:' || substr ($content, 0, 5) == 'file:'
		  || substr ($content, 0, 11) == 'javascript:' || substr ($content, 0, 4) == 'jar:') {
			return false;
		}
		return true;
	}
	//Непосредственное преобразование тэга в
	//html вариант с возвращением результата
	return '&amp;lt;img src=&amp;quot;'.htmlspecialchars($content).'&amp;quot; alt=&amp;quot;&amp;quot;/&amp;gt;';
}

//Создаем объект класса StringParser_BBCode
$bbcode = new StringParser_BBCode();

//Добавляем фильтр (подробнее см. офф. документацию),
//задействуя нашу функцию convertlinebreaks, которая будет
//преобразовывать переводы строки в тексте к единому
$bbcode-&amp;gt;addFilter (STRINGPARSER_FILTER_PRE, 'convertlinebreaks');

//Добавляем свои парсеры для разных типов объектов
//(подробнее см. офф. документацию)
//Мы указываем, через какую функцию должно пройти
//содержимое этих тэгов, например, через функцию
//htmlspecialchars для предотвращения XSS и т.д.
$bbcode-&amp;gt;addParser (array ('block', 'inline', 'link', 'listitem'), 'htmlspecialchars');
$bbcode-&amp;gt;addParser (array ('block', 'inline', 'link', 'listitem'), 'nl2br');
$bbcode-&amp;gt;addParser ('list', 'bbcode_stripcontents');

//Добавляем bb-код [h1], используемый в виде:
//[h1]Текст заголовка первого уровня[/h1]
$bbcode-&amp;gt;addCode ('h1', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;h1&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/h1&amp;gt;'),
				  'block', array ('listitem', 'block', 'link'), array ());
//Добавляем bb-код [h2], используемый в виде:
//[h2]Текст заголовка второго уровня[/h2]
$bbcode-&amp;gt;addCode ('h2', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;h2&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/h2&amp;gt;'),
				  'block', array ('listitem', 'block', 'link'), array ());
//Добавляем bb-код [h3], используемый в виде:
//[h3]Текст заголовка третьего уровня[/h3]
$bbcode-&amp;gt;addCode ('h3', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;h3&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/h3&amp;gt;'),
				  'block', array ('listitem', 'block', 'link'), array ());
//Добавляем bb-код [h4], используемый в виде:
//[h4]Текст заголовка четвертого уровня[/h4]
$bbcode-&amp;gt;addCode ('h4', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;h4&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/h4&amp;gt;'),
				  'block', array ('listitem', 'block', 'link'), array ());
//Добавляем bb-код [h5], используемый в виде:
//[h5]Текст заголовка пятого уровня[/h5]
$bbcode-&amp;gt;addCode ('h5', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;h5&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/h5&amp;gt;'),
				  'block', array ('listitem', 'block', 'link'), array ());
//Добавляем bb-код [h6], используемый в виде:
//[h6]Текст заголовка шестого уровня[/h6]
$bbcode-&amp;gt;addCode ('h6', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;h6&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/h6&amp;gt;'),
				  'block', array ('listitem', 'block', 'link'), array ());

//Устанавливаем флаги для bb-кодов с h1 до h6,
//указывая, что они являются блочными элементами,
//что будет в дальнейшем благотворно влиять на умную
//генерацию html кода. Такой элемент, к примеру, не сможет
//находиться внутри других блочных элементов
$bbcode-&amp;gt;setCodeFlag('h1', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT);
$bbcode-&amp;gt;setCodeFlag('h2', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT);
$bbcode-&amp;gt;setCodeFlag('h3', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT);
$bbcode-&amp;gt;setCodeFlag('h4', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT);
$bbcode-&amp;gt;setCodeFlag('h5', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT);
$bbcode-&amp;gt;setCodeFlag('h6', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT);

//Добавляем bb-код [b], используемый в виде:
//[b]выделенный текст[/b]
$bbcode-&amp;gt;addCode ('b', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;b&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/b&amp;gt;'),
				  'inline', array ('listitem', 'block', 'inline', 'link'), array ());
//Добавляем bb-код [i], используемый в виде:
//[i]наклонный текст[/i]
$bbcode-&amp;gt;addCode ('i', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;i&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/i&amp;gt;'),
				  'inline', array ('listitem', 'block', 'inline', 'link'), array ());
//Добавляем bb-код [url], используемый в виде:
//[url]http://www.needsite.domain[/url] и
//[url=http://www.needsite.domain]Текст ссылки[/url]
$bbcode-&amp;gt;addCode ('url', 'usecontent?', 'do_bbcode_url', array ('usecontent_param' =&amp;gt; 'default'),
				  'link', array ('listitem', 'block', 'inline'), array ('link'));
//Добавляем bb-код [link], используемый в виде:
//[link]http://www.needsite.domain[/link]
$bbcode-&amp;gt;addCode ('link', 'callback_replace_single', 'do_bbcode_url', array (),
				  'link', array ('listitem', 'block', 'inline'), array ('link'));
//Добавляем bb-код [img], используемый в виде:
//[img]http://www.needsite.domain/img.jpg[/img]
$bbcode-&amp;gt;addCode ('img', 'usecontent', 'do_bbcode_img', array (),
				  'image', array ('listitem', 'block', 'inline', 'link'), array ());
//Добавляем bb-код [bild] (по смыслу то же самое,
//что и [img]), используемый в виде:
//[bild]http://www.needsite.domain/img.jpg[/bild]
$bbcode-&amp;gt;addCode ('bild', 'usecontent', 'do_bbcode_img', array (),
				  'image', array ('listitem', 'block', 'inline', 'link'), array ());

//Создаем группу image из bb-кодов img и bild
//для последующей возможности задания
//неких правил для этих групп
$bbcode-&amp;gt;setOccurrenceType ('img', 'image');
$bbcode-&amp;gt;setOccurrenceType ('bild', 'image');
//Указываем, что тэги из группы image
//могут встречаться (обрабатываться) в тексте не более
//двух раз. В нашем случае это нужно для того,
//чтобы пользователь не мог вставить более двух
//картинок в текст сообщения
$bbcode-&amp;gt;setMaxOccurrences ('image', 2);

//Добавляем bb-код [list]
$bbcode-&amp;gt;addCode ('list', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;ul&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/ul&amp;gt;'),
				  'list', array ('block', 'listitem'), array ());
//Добавляем bb-код [*], указывая, что этот тэг
//может использоваться только внутри тэга
//с типом list (этот тип мы присвоили выше тэгу [list])
$bbcode-&amp;gt;addCode ('*', 'simple_replace', null, array ('start_tag' =&amp;gt; '&amp;lt;li&amp;gt;', 'end_tag' =&amp;gt; '&amp;lt;/li&amp;gt;'),
				  'listitem', array ('list'), array ());

//Устанавливаем флаги для тэгов [list] и [*]
//Указываем, что для кода [*] закрывающийся тэг
//не обязателен, таким образом, возможна будет
//следующая конструкция:
//[list]
//[*] Item
//[*] Item
//[/list]
//Закрывающий тэг будет добавляться автоматически
//в процессе формирования html кода
$bbcode-&amp;gt;setCodeFlag ('*', 'closetag', BBCODE_CLOSETAG_OPTIONAL);
//Как я понял, этот флаг обозначает, что тэг [*]
//всегда может быть использован только
//в начале новой строки
$bbcode-&amp;gt;setCodeFlag ('*', 'paragraphs', true);
//[list] является блочным элементом
$bbcode-&amp;gt;setCodeFlag ('list', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT);
//Перед открывающимся тэгом [list]
//символ строки будет устранен
$bbcode-&amp;gt;setCodeFlag ('list', 'opentag.before.newline', BBCODE_NEWLINE_DROP);
//Перед закрывающимся тэгом [list]
//символ строки будет устранен
$bbcode-&amp;gt;setCodeFlag ('list', 'closetag.before.newline', BBCODE_NEWLINE_DROP);
//В итоге мы можем использовать списки в bb-коде,
//используя вместе теги list и *:
//[list]
//[*] Элемент списка
//[*] Элемент списка
//[*] и т.д.
//[/list]

//Активируем обработку параграфов
$bbcode-&amp;gt;setRootParagraphHandling (true);
//Как я понял, таким образом указывается,
//какими символами нужно заменять встреченный
//перенос строки внутри абзаца
//(по сути, как обрабатывать пустые абзацы).
$bbcode-&amp;gt;setParagraphHandlingParameters (&amp;quot;\n&amp;quot;, '&amp;lt;p&amp;gt;', '&amp;lt;/p&amp;gt;');

$res_text = &amp;quot;Тестовый текст [b]для проверки[/b] работы класса&amp;quot;;

//На всякий случай удаляем все оставшиеся
//символы переноса строки в виде &amp;quot;\r&amp;quot;,
//если такие остались в тексте
$res_text = str_replace(&amp;quot;\r&amp;quot;, '', $res_text);

//Вуаля!
echo $bbcode-&amp;gt;parse($res_text);
&lt;/pre&gt;
&lt;h3&gt;Послесловие&lt;/h3&gt;
&lt;p&gt;Я, конечно же, не сделал полный перевод документации, а только самый необходимый минимум, за более подробной документацией вы можете обратиться на &lt;a href="http://christian-seiler.de/projekte/php/bbcode/doc/en/chapter1.php"&gt;официальный сайт&lt;/a&gt; (вообще, там описано куда больше различных возможностей).&lt;/p&gt;
&lt;p&gt;Эту библиотеку также не составляет труда внедрить в какой-либо php фреймворк, я, к примеру, с успехом проделывал это для cackePHP.&lt;/p&gt;
&lt;p&gt;Если вы тоже встречали подобные библиотеки (корректно работающие с абзацам! &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt;  ) , интересно было бы узнать о них.&lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=pIEeSqDi6N8:XObgbQsHsfE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=pIEeSqDi6N8:XObgbQsHsfE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=pIEeSqDi6N8:XObgbQsHsfE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=pIEeSqDi6N8:XObgbQsHsfE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/pIEeSqDi6N8" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/php-i-bbcode/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Грамотная работа в Word. Продолжение</title>
		<link>http://dev.ezoterik.info/gramotnaya-rabota-v-word-2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=gramotnaya-rabota-v-word-2</link>
		<comments>http://dev.ezoterik.info/gramotnaya-rabota-v-word-2/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 03:33:36 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[Word]]></category>
		<category><![CDATA[ЛикБез]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=74</guid>
		<description>&lt;p&gt;Уж не знаю, на сколько эта тема интересна кому-либо (на &lt;a href="http://dev.ezoterik.info/gramotnaya-rabota-v-word/"&gt;первую часть статьи&lt;/a&gt; комментариев-то считай и нет), но для того, чтобы быть последовательным, все же допишу &amp;#171;двулогию&amp;#187; о правильном обращении с текстами в текстовых редакторах &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  Да и вдруг кому-то эта тема интересна.&lt;/p&gt;
&lt;p&gt;После того, как мы подготовили &amp;#171;чистый текст&amp;#187;, его можно, наконец, оформлять.&lt;/p&gt;
&lt;p&gt;Для начала нужно обязательно воспринимать каждый абзац (напомню, что нажимая Enter на клавиатуре, мы их порождаем все больше и больше) как некое отдельное существо &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/1.png" alt="Абзацы" width="404" height="160" class="alignnone size-full wp-image-67" align="center" /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Отступы&lt;/h3&gt;
&lt;p&gt;Основным инструментом оформления абзацев является обычно &amp;#171;линейка&amp;#187;. Линейка во всех программах выглядит примерно одинаково (если ее нет, то это может означать, что она просто отключена). Существует горизонтальная и вертикальная линейка, нам же понадобиться только горизонтальная.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://dev.ezoterik.info/wp-content/uploads/2009/01/2.gif' title="Горизонтальная линейка"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/2-200x100.gif" alt="Горизонтальная линейка" width="200" height="100" class="alignnone size-thumbnail wp-image-68" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;На линейке можно увидеть несколько отличных друг от друга &amp;#171;рычажков&amp;#187; (по краям линейки). Они нужны для того, чтобы быстро и в наглядной форме задать различного рода отступы выделенным абзацам (отступ слева, отступ справа и отступ красной строки).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/3.png" alt="Рычажки" width="133" height="66" class="alignnone size-full wp-image-67" align="center" /&gt;&lt;/p&gt;
&lt;p&gt;У каждого абзаца в отдельности есть список различных параметров. Самыми основными параметрами можно назвать &amp;#171;отступ слева&amp;#187;, &amp;#171;отступ справа&amp;#187; и &amp;#171;отступ красной строки&amp;#187;. Именно за эти параметры и отвечают выше упомянутые &amp;#171;рычажки&amp;#187;. Для того, чтобы увидеть это в действии, нужно выделить один или несколько абзацев (насколько ровно вы их выделите – не важно, изменению будут подвержены те абзацы, на которые хоть как-то попадает выделение). Далее нужно взяться за один из рычажков и сдвинуть в горизонтальной плоскости (после чего отпустить).&lt;/p&gt;
&lt;p&gt;На рисунке ниже можно увидеть, какой из рычажков за что отвечает.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/4.png" alt="Рычажки" width="133" height="37" class="alignnone size-full wp-image-67" align="center" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/4_1.png" alt="" width="9" height="8" class="alignnone size-full wp-image-67" /&gt; &amp;#8212; Отступ слева первой строки в абзаце (отступ красной строки).&lt;br /&gt;
&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/4_2.png" alt="" width="9" height="8" class="alignnone size-full wp-image-67" /&gt; &amp;#8212; Отступ слева всех строк в абзаце, кроме первой.&lt;br /&gt;
&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/4_3.png" alt="" width="9" height="7" class="alignnone size-full wp-image-67" /&gt; &amp;#8212; Отступ слева для всех строк в абзаце (по сути, двигает одновременно первые два рычкажка).&lt;br /&gt;
&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/4_4.png" alt="" width="9" height="8" class="alignnone size-full wp-image-67" /&gt; &amp;#8212; Отступ справа для всех строк в абзаце.&lt;/p&gt;
&lt;p&gt;Вот пример:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/5.png" alt="Пример влияния рычажков на абзацы" width="408" height="180" class="alignnone size-full wp-image-67" align="center" /&gt;&lt;/p&gt;
&lt;p&gt;Если вы не пользовались этой возможностью ранее, то, думаю, с энтузиазмом оцените ее, так как она позволяет гибко и легко менять все эти отступы у текстов большого объема (не в пример использованию пробелов, о чем писалось в первой части статьи).&lt;/p&gt;
&lt;h3&gt;Выравнивание&lt;/h3&gt;
&lt;p&gt;Наравне с остальными атрибутами абзаца есть такое свойство как выравнивание. По умолчанию абзацы выравниваются по левому краю. Но есть также выравнивание по центру (в основном используется для заголовков), по правому краю и по ширине (чаще всего подходит для основного текста, чтобы создать ровные края абзацев как слева, так и справа, прямо как в газетах и книгах). Для изменения выравнивания есть очень простой способ – четыре кнопки (находятся на панели инструментов над линейкой):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/6.png" alt="Кнопки выравнивания" width="93" height="22" class="alignnone size-full wp-image-67" /&gt;&lt;/p&gt;
&lt;p&gt;Эти же кнопки являются и индикатором текущего выравнивания выделенного абзаца (будет &amp;#171;вдавлен&amp;#187; тот вид выравнивания, который установлен в текущий момент у выделенного абзаца).&lt;/p&gt;
&lt;p&gt;Для выравнивания абзацев нужно использовать именно эти кнопки, а не делать это с помощью большого количества пробелов (редко, но видел такое) или с помощью каких-либо еще изощренных приемов.&lt;/p&gt;
&lt;h3&gt;Практика&lt;/h3&gt;
&lt;p&gt;Для примера можно увидеть, как правильными методами отформатировать цитату, начинающуюся обычно в начале статьи. Сначала набираем простой текст, после чего регулируем нужные нам отступы у этого абзаца (для удобства отступы я отметил пунктиром):&lt;/p&gt;
&lt;p&gt;&lt;a href='http://dev.ezoterik.info/wp-content/uploads/2009/01/7.png' title="Пример оформления текста"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/7-200x142.png" alt="Пример оформления текста" width="200" height="142" class="alignnone size-thumbnail wp-image-68" style="border:1px solid green;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Пояснения:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Заголовок отцентрирован правильным способом (с использованием кнопок, а не пробелов), и к нему применен стиль &amp;#171;Заголовок 1&amp;#8243;.&lt;/li&gt;
&lt;li&gt;Цитата уменьшена и помещена в правую часть с помощью рычажков на линейке (настроек отступов абзаца). Выравнивание по правому краю в данном случае было бы не уместно (хотя многие так делают), потому как при таком способе будет неадекватно выровнена последняя строка в абзаце и т.п. Вместо этого к этому абзацу применено выравнивание &amp;#171;по ширине&amp;#187;, чтобы все строки в абзаце были ровными по правому краю, так же, как и слева.&lt;/li&gt;
&lt;li&gt;&amp;#171;Автор цитаты&amp;#187; выровнен с помощью выравнивания &amp;#171;по правому краю&amp;#187;.&lt;/li&gt;
&lt;li&gt;Основной текст оставляем нетронутым, разве что выравнивание &amp;#171;по ширине&amp;#187; к нему применяем, чтобы красивее было &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Удобство такого способа очевидно, всегда есть возможность немного поменять ширину этой колонки без лишних усилий.&lt;/p&gt;
&lt;p&gt;Неправильный способ решения этой задачи – это разбивать абзац на несколько маленьких с помощью кнопки Enter на клавиатуре (формируя кривоватый столбец текста) и выравнивание этого столбца с помощью кнопки выравнивания &amp;#171;по правому краю&amp;#187; или же, что еще хуже &amp;#8212; массой пробелов. В примере ниже я включил отображение невидимых символов (пробелов и обозначений окончания абзацев):&lt;/p&gt;
&lt;p&gt;&lt;a href='http://dev.ezoterik.info/wp-content/uploads/2009/01/8.png' title="Пример неправильного оформления текста"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/8-200x142.png" alt="Пример неправильного оформления текста" width="200" height="142" class="alignnone size-thumbnail wp-image-68" style="border:1px solid red;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Расширенные настройки&lt;/h3&gt;
&lt;p&gt;Те виды отступов, которые можно регулировать на линейке, не являются всеми настройками абзацев. Их на самом деле больше. До полного перечня этих настроек в разных программах можно добраться по-разному (предварительно нужно выделить нужные абзацы или же поставить курсор на одном из них):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MS Word&lt;/strong&gt; (по крайней мере 2003 и 2007 версии) и &lt;strong&gt;AbiWord&lt;/strong&gt;: Нажать правой кнопкой мыши на выделенном фрагменте и в появившемся меню выбрать &amp;#171;Абзац&amp;#8230;&amp;#187;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenOffice.org Writer&lt;/strong&gt;: Нажать правой кнопкой мыши на выделенном фрагменте и в появившемся меню выбрать &amp;#171;Абзац&amp;#8230;&amp;#187; (&amp;#171;Paragraph&amp;#8230;&amp;#187;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(в &lt;strong&gt;Google Docs&lt;/strong&gt; я такой возможности не нашел)&lt;/p&gt;
&lt;p&gt;Наиболее интересные из дополнительных параметров, это возможность регулировки расстояния между абзацами и расстояния между строк внутри абзацев.&lt;/p&gt;
&lt;p&gt;Существуют и более тонкие настройки шрифта. Нужно понимать, что настройки шрифта применяются не к целому абзацу, а к конкретному фрагменту выделенного текста.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;То есть, можно говорить о том, что существуют такие понятия как просто буквы (как отдельный класс существ &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  ), а они в свою очередь являются кирпичиками, из которых состоят абзацы. Поэтому есть настройки, которые относятся просто к тексту (к буквам), и для их применения нужно выделять исключительно нужные буквы, а есть настройки, которые применяются целиком к абзацам, и главное в таком случае, чтобы на абзац хоть какое-то выделение попадало (или даже, чтоб на нем просто стоял текстовый курсор), чтоб в нем произошли изменения.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;В настройках шрифта одна из интересных настроек, помимо типичных (цвета букв, стиля начертания, имени шрифта и т.п.) &amp;#8212; возможность указать нужный интервал между буквами. Это полезно, когда, например, нужно сделать заголовок в тексте &amp;#171;разреженный&amp;#187;. Чаще всего эту операцию по незнанию делают с помощью пробелов (после каждой буквы в словах ставят один или более пробелов), что, конечно же, неправильно и выглядит намного менее гибко, чем указание отступов через настройки. Добираемся до настроек шрифта:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MS Word&lt;/strong&gt; (по крайней мере 2003 и 2007 версии): Нажать правой кнопкой мыши на выделенном фрагменте и в появившемся меню выбрать &amp;#171;Шрифт&amp;#8230;&amp;#187; (в AbiWord тоже можно так сделать, но вот только настроек интервалов между буквами я там не нашел).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenOffice.org Writer&lt;/strong&gt;: Нажать правой кнопкой мыши на выделенном фрагменте и в появившемся меню выбрать &amp;#171;Символы&amp;#8230;&amp;#187; (&amp;#171;Character&amp;#8230;&amp;#187;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(в &lt;strong&gt;Google Docs&lt;/strong&gt; этой настройки нет, но, собственно, он и не претендует на полностью полноценный и &amp;#171;громоздкий&amp;#187; редактор текстов)&lt;/p&gt;
&lt;h3&gt;Нарушение правил &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/h3&gt;
&lt;p&gt;В редких случаях бывает очень нужно сделать в тексте именно перенос текста, не создавая при этом нового абзаца, или, точнее сказать, нужно, чтобы при переносе программа продолжала воспринимать нужный нам блок текста как единый абзац. И выход есть, для этого нужно перенести нужный текст не с помощью одной лишь кнопки Enter на клавиатуре (так мы создадим обычный абзац), а с помощью сочетания клавиш Shift + Enter (держа зажатым Shift, нужно один раз нажать Enter). Нужно только не злоупотреблять этой возможностью и использовать ее в тех случаях, когда это действительно крайне необходимо (потому что такие абзацы могут не совсем корректно выглядеть, если вы захотите изменить ширину страницы документа и т.п.).&lt;/p&gt;
&lt;h3&gt;Оглавление&lt;/h3&gt;
&lt;p&gt;Бывает нужно сделать что-то вроде подобного оглавления:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/9.png" alt="Пример оглавления" width="320" height="175" class="alignnone size-full wp-image-67" style="border:1px solid gray;" /&gt;&lt;/p&gt;
&lt;p&gt;Чаще всего его делают, ставя вручную много точек между названием глав и номерами страниц. При таком способе результат всегда выглядит криво и неряшливо.&lt;/p&gt;
&lt;p&gt;На самом же деле во многих программах есть более изящный способ (работает, как минимум, в MS Word). Для его использования сначала нужно подготовить те абзацы, в которых должны быть подобные многоточия. Нужно расставить между заголовком и номером страницы один (и не более) символ табуляции, нажимая на клавиатуре кнопку Tab. Примерно вот так будет выглядеть подготовленный текст, если посмотреть на него в режиме отображения невидимых знаков (стрелочки обозначают символы табуляции).&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/10.png" alt="Начало создания оглавления" width="143" height="155" class="alignnone size-full wp-image-67" /&gt;&lt;/p&gt;
&lt;p&gt;Основная идея в том, что для символов табуляции можно указать их размер в ширину, а так же, какой символ будет заполнять пространство, занимаемое табуляциями.&lt;/p&gt;
&lt;p&gt;Вот более точное описание дальнейшего процесса для &lt;strong&gt;MS Word&lt;/strong&gt; (версии 2003 и 2007) и &lt;strong&gt;OpenOffice.org Writer&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Выделяем фрагмент, где нам нужны &amp;#171;точечки&amp;#187; и ставим по одной табуляции.&lt;/p&gt;
&lt;p&gt;Если теперь нажать мышкой на пустое место линейки, мы укажем размер первой табуляции в каждом выделенном абзаце. Так же появится соответствующий маркер на линейке.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2009/01/11.png" alt="Маркер размера табуляции" width="304" height="199" class="alignnone size-full wp-image-67" /&gt;&lt;/p&gt;
&lt;p&gt;Теперь этот маркер можно переместить, куда вам нужно (в нашем случае к правому краю документа), в дальнейшем его так же можно будет перемещать, корректируя размер табуляции (предварительно нужно не забыть выделить нужные абзацы).&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Чтобы удалить такой маркер, его нужно вместо перемещения по горизонтали с помощью мыши просто &amp;#171;вытянуть&amp;#187; в вертикальном направлении вне пределов линейки. Таких маркеров можно создать более чем в одном экземпляре, тогда они будут влиять на все последующие табуляции в выделенных абзацах (каждый маркер на одну табуляцию, в порядке очередности).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Так мы настроили размер табуляций, теперь осталось сделать так, чтобы табуляция была заполнена линией из точек (фактически же это будут не те точки, которые можно набрать с клавиатуры, а просто как бы рисунок).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В &lt;strong&gt;MS Word 2007&lt;/strong&gt; для этого нужно кликнуть правой кнопкой мыши на выделенных абзацах и перейти в пункт меню &amp;#171;Абзац&amp;#8230;&amp;#187;, в появившемся диалоговом окне нужно нажать внизу слева кнопку &amp;#171;Табуляция&amp;#8230;&amp;#187;. Далее в секции &amp;#171;Выравнивание&amp;#187; отмечаем вариант &amp;#171;По правому краю&amp;#187; (это сделает номера страниц ровными с правой стороны относительно маркера размера табуляции), и в секции &amp;#171;Заполнитель&amp;#187; отмечаем пункт &amp;#171;2 &amp;#8230;&amp;#8230;&amp;#187; (и табуляция заполнится ровной текстурой с изображениями точек). Готово! &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/li&gt;
&lt;li&gt;Для &lt;strong&gt;OpenOffice.org Writer&lt;/strong&gt; нужно кликнуть правой кнопкой мыши на выделенных абзацах и перейти в пункт меню &amp;#171;Абзац&amp;#8230;&amp;#187; (&amp;#171;Paragraph&amp;#8230;&amp;#187;), переходим на закладку &amp;#171;Табуляция&amp;#187; (&amp;#171;Tabs&amp;#187;). В секции &amp;#171;Выравнивание&amp;#187; (&amp;#171;Type&amp;#187;) выбираем вариант (&amp;#171;По правому краю&amp;#187;) &amp;#171;Right&amp;#187;, а в секции &amp;#171;Заполнитель&amp;#187; (&amp;#171;Fill character&amp;#187;) указываем второй вариант, который с точками (&amp;#171;&amp;#8230;&amp;#8230;&amp;#8230;&amp;#8230;..&amp;#187;), жмем &amp;#171;Ок&amp;#187;, и все готово.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Особенно удобно то, что применяя этот прием, потом можно изменять названия глав или же номера страниц, и ничего не будет искажаться, точечки будут всегда адекватно заполнять пространство между названиями глав и номерами страниц.&lt;/p&gt;
&lt;p&gt;Так же стоит отметить, что в &lt;strong&gt;MS Word 2007&lt;/strong&gt; (наверняка и в каких-то других программах, в &lt;strong&gt;Google Docs&lt;/strong&gt;, к примеру, тоже) имеется возможность полностью автоматизировать процесс создания оглавления. Для этого в первую очередь нужно правильно создавать заголовки в документе (как описывалось в конце предыдущей стати). После чего нужно поставить курсор в то место, где вы хотите видеть оглавление, зайти в меню &amp;#171;Ссылки&amp;#187; -&gt; &amp;#171;Оглавление&amp;#187; и выбрать понравившийся шаблон оглавления (там же есть и более тонкие настройки).&lt;/p&gt;
&lt;p&gt;В &lt;strong&gt;Google Docs&lt;/strong&gt; такое оглавление можно создать, перейдя по меню &amp;#171;Вставить -&gt; Оглавление&amp;#187;.&lt;/p&gt;
&lt;p&gt;Для &lt;strong&gt;OpenOffice.org Writer&lt;/strong&gt; нужно перейти в &amp;#171;Вставка -&gt; Оглавление и указатели -&gt; Оглавление и указатели&amp;#8230;&amp;#187; (&amp;#171;Insert –&gt; Indexes and Tables -&gt; Indexes and Tables&amp;#8230;&amp;#187;).&lt;/p&gt;
&lt;p&gt;Если в используемой вами программе есть возможность делать подобное автоматическое оглавление, то, скорее всего, это будет наилучшим вариантом. Ведь при смещении глав на другие страницы номера страниц в таком оглавлении будут обновляться почти автоматически. Для обновления номеров страниц в таких оглавлениях нужно  нажать на какую-то специальную кнопку появляющуюся рядом с оглавлением, если навести на него мышку или, в крайнем случае (в &lt;strong&gt;OpenOffice.org Writer&lt;/strong&gt; я только так смог обновить оглавление), кликнуть правой кнопкой мыши на него и выбрать соответствующий пункт в появившемся меню. Но все равно это куда продуктивнее ручного изменения номеров в оглавлении.&lt;/p&gt;
&lt;h3&gt;Стили оформления документа&lt;/h3&gt;
&lt;p&gt;Если вы правильно составили документ, указывая программе, где в документе заголовки, и какого они уровня, то обычно в программах есть возможность применять массу уже заранее существующих стилей оформления для документов. Вот способы применения различных стилей оформления в разных программах:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MS Word 2007&lt;/strong&gt;: Во вкладке &amp;#171;Главная&amp;#187; (она находится вверху) -&gt; &amp;#171;Изменить стили -&gt; Набор стилей&amp;#187;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;В OpenOffice.org Writer&lt;/strong&gt; готовых наборов стилей не нашел, но в нем есть достаточно богатый инструментарий для создания и работы со своими стилями: &amp;#171;Формат -&gt; Стили&amp;#187; (&amp;#171;Format -&gt; Styles and Formating&amp;#187;) или клавиша F11 на клавиатуре.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Также можно самому создавать свои стили, чтобы потом их применять в различных документах (допустим, если нужно во всех документах придерживаться какого-то фирменного стиля оформления). Но это уже отдельная тема, выходящая за рамки этой статьи. Также нужно знать, что можно модифицировать уже существующий в документе стиль (к документу в любом случае применен какой-либо стиль), чтобы, к примеру, изменить оформление всех заголовков первого уровня (или какого-то другого) в документе или же изменить цвет основного текста, не затрагивая цвет заголовков и других типов текста и т.п. Такие возможности есть обычно во всех программах, подобных Word`у, и они очень удобны.&lt;/p&gt;
&lt;h3&gt;Навигация по документу&lt;/h3&gt;
&lt;p&gt;Если у вас достаточно объемный документ, и главы в нем помечены правильным образом, как разного уровня заголовки, вам может это очень помочь в быстрой навигации по документу. Вот как можно воспользоваться этой возможностью в некоторых программах:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MS Word 2007&lt;/strong&gt;: В закладке  &amp;#171;Вид&amp;#187; (она находится вверху) -&gt; отметить галочку &amp;#171;Схема документа&amp;#187;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenOffice.org Writer&lt;/strong&gt;: &amp;#171;Правка -&gt; Навигатор&amp;#187; (&amp;#171;Edit -&gt; Navigation&amp;#187;) или нажать клавишу F5 на клавиатуре.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Послесловие&lt;/h3&gt;
&lt;p&gt;В каждой программе есть, конечно же, свои дополнительные упрощающие жизнь инструменты, но я хотел описать основные моменты, те, которые во многих программах схожи, и с которыми сталкиваешься в первую очередь при работе с текстами. Надеюсь, статья будет полезна интересующимся. Так же приветствуются комментарии &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=GnS3bxOrVUI:rbJU7lzlAyA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=GnS3bxOrVUI:rbJU7lzlAyA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=GnS3bxOrVUI:rbJU7lzlAyA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=GnS3bxOrVUI:rbJU7lzlAyA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/GnS3bxOrVUI" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/gramotnaya-rabota-v-word-2/feed/</wfw:commentRss>
		<slash:comments>65</slash:comments>
		</item>
		<item>
		<title>Паранойя об инклудах в php</title>
		<link>http://dev.ezoterik.info/paranojya-ob-inkludax-v-php/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=paranojya-ob-inkludax-v-php</link>
		<comments>http://dev.ezoterik.info/paranojya-ob-inkludax-v-php/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 11:05:57 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[безопасность]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=72</guid>
		<description>&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/08/include-php.gif" alt="Защита файлов предназначенных для include" width="150" height="150" class="alignnone size-full wp-image-73" align="right" /&gt;Речь пойдет о том, как сделать php файл недоступным для посетителей сайта, но при этом доступным для того, чтобы подключать его (по средствам функции include и т.п.) к другим php файлам на сервере. В первую очередь я задался вопросом о том, каким образом можно внутри  php файла (средствами php) узнать &amp;#8212; вызван/исполняется ли файл непосредственно или через какой-то другой скрипт.&lt;/p&gt;
&lt;p&gt;Подобных мыслей не возникает, когда в основные скрипты подключаются php файлы, являющиеся некими библиотеками, содержащими лишь какое-то количество реализаций функций/классов. Если посетитель сайта вызовет в браузере такой библиотечный файл, то ничего страшного не произойдет (хотя как по мне, то если уж закрывать, то все &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  ).&lt;/p&gt;
&lt;p&gt;Но если же вставляемый файл содержит в себе простой код (т.е. не заключенный в некую функцию или класс), то прямой вызов такого файла может нести в себе угрозу для безопасности всего сайта. Обычно я такие файлы использую, когда хочу разбить некий большой скрипт на несколько файлов поменьше, чтоб создать себе более комфортные условия для работы с кодом.&lt;br /&gt;
&lt;br /&gt;
Вот маленький пример подобной организации файловой структуры некоего закрытого сайта (требующего авторизации).&lt;/p&gt;
&lt;p&gt;Допустим, у нас есть один главный файл &amp;#171;index.php&amp;#187;, через который для посетителей происходит вся работа с сайтом путем передачи ему разных &lt;strong&gt;GET&lt;/strong&gt; параметров. В нем в свою очередь анализируется, к примеру, параметр &lt;strong&gt;$_GET['page']&lt;/strong&gt; и в зависимости от того, какое слово в нем указано, в &amp;#171;index.php&amp;#187; подключается соответствующий файл (передали, к примеру, слово &amp;#171;inbox&amp;#187;, тогда через функцию include подключается файл &amp;#171;p_inbox.php&amp;#187;), в котором описаны дальнейшие инструкции. Еще в файле &amp;#171;index.php&amp;#187; реализован механизм авторизации (через сессии), то есть в нем каждый раз проверяется, имеет ли зашедший пользователь права для просмотра сайта.&lt;/p&gt;
&lt;p&gt;Проблема, на мой взгляд, начинается тогда, когда понимаешь, что есть возможность того, что человек может вызвать напрямую файл &amp;#171;p_inbox.php&amp;#187;. Как минимум, такой скрипт может некорректно отработать и вывести какие-то ошибки, у него, к примеру, может не быть в распоряжении каких-то данных, которые заранее подготавливаются в файле &amp;#171;index.php&amp;#187; в расчете на то, что далее их подхватит &amp;#171;p_inbox.php&amp;#187;.&lt;/p&gt;
&lt;p&gt;Так же появляется необходимость в самом начале файла &amp;#171;p_inbox.php&amp;#187; проверять данные сессии, чтобы не дать возможность сделать что-то с помощью этого скрипта неавторизованному пользователю (по сути, если такой проверки не будет, то это может быть серьезной дырой в безопасности). И такая проверка (в каждом подобном файле) может быть не единственной. Если хочется избежать какой-либо некорректной работы скрипта при его непосредственном вызове в браузере, то приходится добавлять так же проверки на существование тех самых подготовленных заранее данных в index.php и т.п.&lt;/p&gt;
&lt;p&gt;Все это выглядит как-то печально… Происходит дублирование проверок и излишние вычисления, а в некоторых случаях даже дополнительные запросы в базу данных. Именно это сподвигло меня к тому, чтобы задуматься о том, как определять достаточно легко и универсально, вызывается ли файл &amp;#171;p_inbox.php&amp;#187; в &amp;#171;чистом&amp;#187; виде или же в контексте файла &amp;#171;index.php&amp;#187;. Ведь если найти такое решение, то можно избавиться от всего избыточного кода в каждом подключаемом файле. Так же это можно использовать чтобы &amp;#171;вставляемые&amp;#187; скрипты могли выдавать информацию по-разному (или в разных форматах), в зависимости от того, вызван файл самостоятельно или же в контексте какого-то другого файла.&lt;/p&gt;
&lt;h3&gt;Испытательный стенд&lt;/h3&gt;
&lt;p&gt;Предположим, что у нас есть два файла, лежащих в одном и том же каталоге, &amp;#171;index.php&amp;#187; и &amp;#171;addon.php&amp;#187;.&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
//Файл index.php
print '&amp;lt;p&amp;gt;This index.php&amp;lt;/p&amp;gt;';

include('addon.php');
&lt;/pre&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
//Файл addon.php
print '&amp;lt;p&amp;gt;This addon.php&amp;lt;/p&amp;gt;';
&lt;/pre&gt;
&lt;p&gt;Задача сделать так, чтобы при непосредственном вызове файла &amp;#171;addon.php&amp;#187; не выводилось надписи &amp;#171;This addon.php&amp;#187;, но при вызове файла &amp;#171;index.php&amp;#187; появлялись сразу две надписи: &amp;#171;This index.php&amp;#187; и &amp;#171;This addon.php&amp;#187; (вторая будет сигнализировать об успешной вставке файла &amp;#171;addon.php&amp;#187;).&lt;/p&gt;
&lt;h3&gt;Варианты решения проблемы&lt;/h3&gt;
&lt;p&gt;Варианты перечислены в порядке поступления мыслей, которые приходили в ходе решения задачи &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  Тот способ, к которому я в итоге пришел, описан самым последним (четвертый).&lt;/p&gt;
&lt;h4&gt;Первый&lt;/h4&gt;
&lt;p&gt;Самое первое, что мне пришло в голову, это давать какое-нибудь более сложное (секретное) имя подключаемому файлу, к примеру &amp;#171;40dfg_9n2xo_addon.php&amp;#187;. Но вариант можно сразу же браковать из-за того, что если человек имеет информацию о структуре каталогов и именах файлов сайта (что не так уж и сложно может быть в некоторых случаях), то такая &amp;#171;защита&amp;#187; сразу же с треском провалится.&lt;/p&gt;
&lt;h4&gt;Второй&lt;/h4&gt;
&lt;p&gt;В самом начале главного файла (&amp;#171;index.php&amp;#187;) можно создать переменную &amp;#8212; &amp;#171;secret&amp;#187;, которая будет равна какой-то секретной строке.&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;$secret = '85mb_*4ce56Z-e';&lt;/pre&gt;
&lt;p&gt;После чего в начале файла &amp;#171;addon.php&amp;#187; проверять, существует ли такая переменная и равна ли она секретной фразе &amp;#171;85mb_*4ce56Z-e&amp;#187;. Саму фразу можно, конечно, разместить в каком-то одном файле типа &amp;#171;config.php&amp;#187;, подключая его во всех скриптах через функцию &amp;#171;require_once&amp;#187;, чтобы в последствии можно было легко изменять эту фразу, но в примере я хочу показать саму суть без примесей лишних отвлекающих маневров &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;В этом способе так же строится предположение, что исходный код и структуру сайта никто больше не увидит, что, так или иначе, является заблуждением. Если посторонний человек каким-то образом узнает эту секретную фразу и директива register_globals в php.ini будет установлена в &amp;#171;on&amp;#187;, он имеет возможность вызвать скрипт с соответствующим параметром (&amp;#171;addon.php?secret=85mb_*4ce56Z-e&amp;#187;) и получить добро на исполнение файла.&lt;/p&gt;
&lt;p&gt;Да, чтобы избежать опасности, связанной с &amp;#171;register_globals&amp;#187;, достаточно в начале файла &amp;#171;addon.php&amp;#187; сделать проверку секретной фразы правильным способом. Не так:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;If(!isset($secret) || $secret != '85mb_*4ce56Z-e') exit();&lt;/pre&gt;
&lt;p&gt;А так:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;If(!isset($GLOBALS['secret']) || $GLOBALS['secret'] != '85mb_*4ce56Z-e') exit();&lt;/pre&gt;
&lt;p&gt;(обращаясь к переменной через &lt;strong&gt;$GLOBALS['secret']&lt;/strong&gt; php будет знать, что имеется ввиду именно переменная, определенная ранее в скрипте, а не та, что может быть передана через &lt;strong&gt;GET&lt;/strong&gt; или &lt;strong&gt;POST&lt;/strong&gt; запрос)&lt;/p&gt;
&lt;p&gt;Но мне этот способ все равно не очень нравится, какой-то он уж слишком мудреный…&lt;/p&gt;
&lt;h4&gt;Третий&lt;/h4&gt;
&lt;p&gt;Идея в том, чтобы средствами самого сервера не разрешать доступ &amp;#171;извне&amp;#187; к файлам на подобие &amp;#171;addon.php&amp;#187;, но при этом оставить доступ для их внутреннего использования (для вставки в другие файлы). Можно все вставляемые файлы положить в одну директорию и закрыть к ней внешний доступ паролем (.htpasswd). Или вообще закрыть доступ к папке с помощью файла .htaccess, добавив, к примеру, в него строку &amp;#171;Deny from all&amp;#187;. Вполне возможно, что есть еще способы закрыть доступ извне к файлам или директориями средствами сервера.&lt;/p&gt;
&lt;p&gt;Способ достаточно хороший и можно сказать &amp;#171;железный&amp;#187;. Только есть шанс, что, к примеру, при переезде сайта файлы .htaccess ненароком не перенесутся, и этого можно не заметить. А паранойя должна быть паранойной &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  поэтому вполне можно совмещать этот способ защиты файлов с их внутренней защитой, реализованной средствами php.&lt;/p&gt;
&lt;h4&gt;Четвертый&lt;/h4&gt;
&lt;p&gt;Этот тот способ, на котором я остановился и который в целом мне нравится &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  Идея в том, чтобы в файле &amp;#171;addon.php&amp;#187; узнавать имя файла, в котором содержится конкретный кусок кода (&lt;strong&gt;__FILE__&lt;/strong&gt;), и имя файла, в котором выполняется текущий код (&lt;strong&gt;$_SERVER['PHP_SELF']&lt;/strong&gt;), после чего можно сравнить оба эти значения. И если они отличаются, значит, &amp;#171;addon.php&amp;#187; выполняется внутри &amp;#171;index.php&amp;#187;, если значения одинаковы, значит, выполняется непосредственно &amp;#171;addon.php&amp;#187;.&lt;/p&gt;
&lt;p&gt;Собственно, вот модифицированный код файла &amp;#171;addon.php&amp;#187;.&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
//Файл addon.php
if($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'] == __FILE__) exit();

print '&amp;lt;p&amp;gt;This addon.php&amp;lt;/p&amp;gt;';
&lt;/pre&gt;
&lt;p&gt;Определение &lt;strong&gt;__FILE__&lt;/strong&gt; возвращает абсолютный путь к файлу, в котором оно вызвано. Используется для отображения информации о скрипте, если в нем произошла ошибка (при обработке исключений).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$_SERVER['PHP_SELF']&lt;/strong&gt; – хранит в себе полный путь относительно корня сайта к скрипту, который в данный момент исполняется (который запросил пользователь в своем браузере, если посмотреть значение переменной &lt;strong&gt;$_SERVER['PHP_SELF']&lt;/strong&gt; из подключаемого файла, будет все равно возращен путь к &amp;#171;главному&amp;#187; файлу).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;$_SERVER['DOCUMENT_ROOT']&lt;/strong&gt; – возвращает абсолютный путь к корню сайта. Из-за того, что в &lt;strong&gt;__FILE__&lt;/strong&gt; абсолютный путь, а в &lt;strong&gt;$_SERVER['PHP_SELF']&lt;/strong&gt; полный путь именно от корня сайта, приходится &lt;strong&gt;PHP_SELF&lt;/strong&gt; совмещать с &lt;strong&gt;DOCUMENT_ROOT&lt;/strong&gt;, чтобы получился абсолютный путь, который уже можно сравнивать с тем путем, который возвращает &lt;strong&gt;__FILE__&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Если обнаруживается, что файл &amp;#171;addon.php&amp;#187; вызван без каких-либо посредников, скрипт просто останавливает свое исполнение. Хотя можно еще по-разному реагировать на такие попытки вторжения &amp;#8212; генерировать ошибку 404, прикидываясь, что файла не существует, или перенаправлять посетителя на первую страницу сайта и т.д.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Внимание:&lt;/strong&gt; под виндовым сервером проверка не будет срабатывать, в этом случае нужно у пути,  который берется через &lt;strong&gt;PHP_SELF&lt;/strong&gt;, заменять все слеши (&amp;#171;/&amp;#187;) на обратные слеши (&amp;#171;\&amp;#187;):&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;if($_SERVER['DOCUMENT_ROOT']. str_replace('/', '\', $_SERVER['PHP_SELF']) == __FILE__) exit();&lt;/pre&gt;
&lt;h3&gt;Все, буквы кончились&amp;#8230;&lt;/h3&gt;
&lt;p&gt;Было бы интересно услышать конструктивную критику или какие-то дополнения (может, есть какой-то еще более простой и эффективный способ?).&lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=wrMBJ11pP4o:jSYRzU_r1Uk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=wrMBJ11pP4o:jSYRzU_r1Uk:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=wrMBJ11pP4o:jSYRzU_r1Uk:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=wrMBJ11pP4o:jSYRzU_r1Uk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/wrMBJ11pP4o" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/paranojya-ob-inkludax-v-php/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Грамотная работа в Word</title>
		<link>http://dev.ezoterik.info/gramotnaya-rabota-v-word/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=gramotnaya-rabota-v-word</link>
		<comments>http://dev.ezoterik.info/gramotnaya-rabota-v-word/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 12:12:19 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[Word]]></category>
		<category><![CDATA[ЛикБез]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=64</guid>
		<description>&lt;p&gt;Часто сталкиваюсь с тем, что люди не умеют корректно работать в программах типа &lt;a href="http://ru.wikipedia.org/wiki/Microsoft_Word"&gt;MS Word&lt;/a&gt; и ей подобных. Хотя обычно большинство из них уверены, что все отлично делают.&lt;/p&gt;
&lt;p&gt;Чаще всего это проблема всех новичков, недавно научившихся в той или иной мере пользоваться вордом (а иногда и у &amp;#171;старичков&amp;#187; &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /&gt;  ). Проблема появляется тогда, когда человек, создавая документ, не знает основной &amp;#171;философии&amp;#187; работы в подобных программах, набирает текст &amp;#171;абы как&amp;#187;, вставляя кучу пробелов где нужно и не нужно и т.п., стремясь к одному – &amp;#171;главное, чтобы выглядело как нужно&amp;#187;. Часто со временем это приводит к выработке каких-то своих &amp;#171;хитростей&amp;#187;, то есть, к изобретению достаточно некачественного велосипеда. С другой стороны, если документы создаются только чтобы их распечатать и забыть про них, а также имеют достаточно маленький размер, то такой подход вполне жизнеспособен. Но, думаю, применение правильного подхода все же может очень облегчить жизнь даже в таких случаях.  Если же эти документы хранятся и предполагается их дальнейшее изменение вами или, тем более, другими людьми, то при &amp;#171;самобытном&amp;#187; способе их изготовления может начаться настоящий хаос.&lt;/p&gt;
&lt;p&gt;Все дальнейшие рекомендации можно и нужно применять не только в MS Word, но и во всех других программах подобного плана (&lt;a href="http://ru.wikipedia.org/wiki/OpenOffice.org_Writer"&gt;OpenOffice.org Writer&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/AbiWord"&gt;AbiWord&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/Google_Docs"&gt;Google Docs&lt;/a&gt;, &lt;a href="http://ru.wikipedia.org/wiki/StarOffice"&gt;StarOffice&lt;/a&gt; и прочие, разве что к программе &amp;#171;Блокнот&amp;#187; далеко не все применимо &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  ), и даже в более серьезных программах, предназначенных для профессиональной верстки текстов. Также предполагается, что человек все же имеет какой-никакой опыт работы в используемой им программе.&lt;br /&gt;
&lt;br /&gt;
Итак, самое главное, забудьте вначале о внешнем виде документа, &amp;#171;зримое не важно&amp;#187; &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  Нужно выработать привычку набирать сначала &amp;#171;чистый&amp;#187; текст, а уже потом его украшать. В этой статье я хочу описать принципы правильного создания чистого текста и его структуры, в следующей &amp;#8212; способы &amp;#171;украшения&amp;#187; такого текста и несколько полезных &amp;#171;в быту&amp;#187; приемов.&lt;/p&gt;
&lt;p&gt;Итак начну&amp;#8230;&lt;/p&gt;
&lt;h3&gt;Пробелы&lt;/h3&gt;
&lt;p&gt;В первую очередь – &lt;strong&gt;никогда&lt;/strong&gt; не используйте в тексте &lt;strong&gt;больше одного пробела&lt;/strong&gt;. В частности, это относится к пробелам перед каждым абзацем для того, чтобы сделать красную строку или отступ перед текстом. Иногда с помощью пробелов выравнивают текст по центру или по правому краю, что является &amp;#171;большим грехом&amp;#187; &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;Также не очень хороши &amp;#171;случайные&amp;#187; вставки двух/трех пробелов между словами вместо одного.&lt;/p&gt;
&lt;p&gt;Почему так делать плохо? Аргументировать могу только тем, что с такими документами в дальнейшем ужасно неудобно работать и модифицировать их. Представьте себе, к примеру, &amp;#171;картину&amp;#187;: вы сделали большой документ (для сгущения красок можно представить, что это какая-то книга) и все красные строки сделали с помощью пробелов, но вдруг неожиданно вам по каким-либо причинам нужно увеличить/уменьшить все отступы красной строки… Первый вариант, это сидеть и руками добавлять или удалять в каждой красной строке нужное количество пробелов. Второй вариант более продвинут, но все равно &amp;#171;не здравый&amp;#187; – использовать поиск и замену по всему документу, &amp;#171;сказав&amp;#187; программе &amp;#171;замени все подряд идущие 4 пробела на 8 подряд идущих пробелов&amp;#187; (можно еще усугубить условие авто-замены, чтобы не заменилось что-то лишнее), но это именно тот случай, когда изобретается &amp;#171;неудобный велосипед&amp;#187;.&lt;/p&gt;
&lt;p&gt;Справедливости ради стоит отметить, что бывают ситуации, где легче в каком-то участке текста использовать более одного подряд идущего пробела, но это лишь исключения из правил, которые если и случаются, то очень-очень редко.&lt;/p&gt;
&lt;h3&gt;Грамотность набора (знаки препинания + пробелы)&lt;/h3&gt;
&lt;p&gt;Аспект, который касается любого набора текстов, где бы то ни было. Это правильность набора текста в плане уместного использования пробелов между знаками препинания. С этим вообще у многих проблемы, хотя &lt;a href="http://www.ezoterik.info/workroom/library/pravila_nabora.htm"&gt;правил набора текста достаточно мало&lt;/a&gt; и нужно лишь захотеть, чтобы начать их успешно применять.&lt;/p&gt;
&lt;h3&gt;Целостность абзацев&lt;/h3&gt;
&lt;p&gt;Вообще нужно как-то наказать того человека, который придумал объяснять назначение кнопки Enter как: &amp;#171;Это кнопка для того, чтобы текст перенести на следующую строку&amp;#187; &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;На самом же деле кнопка Enter нужна только для того, чтобы сделать новый абзац, и никак иначе. Еще с помощью нее можно делать &amp;#171;пустые абзацы&amp;#187; для увеличения расстояния между абзацами.&lt;/p&gt;
&lt;p&gt;Те, кто сильно проникся вариантом &amp;#171;чтобы текст перенести на следующую строку&amp;#187; жмут Enter в конце каждой строки, создавая таким образом искусственный перенос текста на новую строку внутри воображаемого абзаца (воображаемого потому, что по факту это будет не один абзац, а много маленьких абзацев).&lt;/p&gt;
&lt;p&gt;На самом же деле любой редактор переносит текст автоматически, и об этом пользователю не нужно беспокоиться. Когда вы нажимаете клавишу Enter, редактор понимает, что весь написанный блок является самостоятельными абзацем. Такой подход приносит массу удобств для последующего оформления/форматирования текста. Нажатие же Enter`а в конце каждой строки приносит лишь массу &amp;#171;головной боли&amp;#187; и ни грамма плюсов.&lt;/p&gt;
&lt;p&gt;К примеру, попробуйте изменить формат листа для документа, у которого каждая строка перенесена с помощью Enter`а на новую строку, и вы увидите, как текст документа &amp;#171;скукожится&amp;#187; (если уменьшить размер листа) или же не будет заполнять лист во всю ширину (если увеличить лист). Правильно же набранный текст (в смысле абзацев) в какой формат листа не помести &amp;#8212; он везде будет хорошо выглядеть, так как он будет постоянно заполнять лист во всю ширину (как вода в сосуде &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  ).&lt;/p&gt;
&lt;h3&gt;Пример плохого и хорошего абзаца&lt;/h3&gt;
&lt;p&gt;Для наглядности приведу пример. Синими точками обозначены пробелы, символ &lt;span style="color:blue;"&gt;&amp;para;&lt;/span&gt; обозначает нажатие кнопки Enter (символ конца абзаца).&lt;/p&gt;
&lt;h4&gt;Неправильный &amp;#171;абзац&amp;#187;&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/07/bad_paragraph.gif" alt="Пример неправильного &amp;quot;абзаца&amp;quot;" width="411" height="126" class="alignnone size-full wp-image-67" align="center" style="border:1px solid red;" /&gt;&lt;br /&gt;
Пробелами сделана красная строка, нажатие Enter`а в конце каждой строки, да еще и искусственное создание выравнивания текста по ширине с помощью пробелов &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_cry.gif' alt=':cry:' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;h4&gt;Правильный абзац&lt;/h4&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/07/good_paragraph.gif" alt="Пример правильного абзаца" width="411" height="128" class="alignnone size-full wp-image-66" style="border:1px solid green;" align="center" /&gt;&lt;br /&gt;
Чистота и порядок, прямо идиллия &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;h3&gt;Текст с &amp;#171;новой страницы&amp;#187;&lt;/h3&gt;
&lt;p&gt;Если вам нужно, чтобы какая-то часть документа начиналась обязательно с новой страницы, не используйте кучу Enter`ов (пустых абзацев). Так как если вы вдруг решите что-то изменить выше по тексту, весь текст ниже может &amp;#171;поплыть&amp;#187; и нужно будет заново просматривать документ для расстановки нужных кусков текста с начала новых страниц.&lt;/p&gt;
&lt;p&gt;Часто в программах есть возможность вставить &amp;#171;Разрыв страницы&amp;#187;. В MS Word для этого нужно нажать комбинацию клавиш Ctrl+Enter, курсор перескочит на новую страницу, и если на месте курсора расположить нужные текст, он всегда будет начинаться с начала новой страницы, какие бы не происходили сдвиги текста вверху. Разрыв страницы является неким &amp;#171;скачком&amp;#187;, к примеру, из середины листа в начало следующего листа.&lt;/p&gt;
&lt;h3&gt;Заголовки и логическая структура документа&lt;/h3&gt;
&lt;p&gt;Очень часто, когда хотят сделать заголовок (всего документа и подзаголовки), просто пишут нужные текст, изменяют его размер на больший по сравнению с остальным текстом, добавляют ему жирности и т.п. И это не правильно&amp;#8230;&lt;/p&gt;
&lt;p&gt;Во всех программах, про которые эта статья, есть понятие заголовков, т.е. подразумевается, что вы можете выделить нужный абзац и указать, что этот абзац является заголовком, и больше ничего делать не нужно. Причем, указывать заголовки нужно с учетом их иерархии, поэтому вы можете указать не только факт заголовка как такового, но и еще какого именно он уровня: &amp;#171;Заголовок 1 уровня&amp;#187;, &amp;#171;Заголовок 2 уровня&amp;#187;, &amp;#171;Заголовок 3 уровня&amp;#187; и т.д.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://dev.ezoterik.info/wp-content/uploads/2008/07/h1_in_ms_word_2007.gif'&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/07/h1_in_ms_word_2007-150x150.gif" alt="Выбор уровня заголовка в MS Word 2007" title="Выбор уровня заголовка в MS Word 2007" width="150" height="150" class="alignnone size-thumbnail wp-image-68" /&gt;&lt;/a&gt; &lt;a href='http://dev.ezoterik.info/wp-content/uploads/2008/07/h1_in_ms_word_2003.gif'&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/07/h1_in_ms_word_2003-150x150.gif" alt="Выбор уровня заголовка в MS Word 2003" title="Выбор уровня заголовка в MS Word 2003" width="150" height="150" class="alignnone size-thumbnail wp-image-69" /&gt;&lt;/a&gt; &lt;a href='http://dev.ezoterik.info/wp-content/uploads/2008/07/h1_in_openoffice.gif'&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/07/h1_in_openoffice-150x150.gif" alt="Выбор уровня заголовка в OpenOffice.org Writer" title="Выбор уровня заголовка в OpenOffice.org Writer" width="150" height="150" class="alignnone size-thumbnail wp-image-70" /&gt;&lt;/a&gt; &lt;a href='http://dev.ezoterik.info/wp-content/uploads/2008/07/h1_in_google_docs.gif'&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/07/h1_in_google_docs-150x150.gif" alt="Выбор уровня заголовка в Google Docs" title="Выбор уровня заголовка в Google Docs" width="150" height="150" class="alignnone size-thumbnail wp-image-71" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Пока не обращайте внимания на то, что такие заголовки могут выглядеть не так, как бы вам хотелось. Главная идея в том, чтобы программа могла &amp;#171;опознавать&amp;#187; логическую структуру документа, где располагается обычный текст, а где заголовки, и кто чей &amp;#171;ребенок&amp;#187;.&lt;/p&gt;
&lt;p&gt;Эта возможность очень полезна. Так, к примеру, в некоторых программах потом можно автоматически сгенерировать красивое оглавление документа с названиями глав и адекватными номерами страниц этих глав, не затратив для этого никаких усилий.&lt;/p&gt;
&lt;p&gt;Часто в программе присутствует удобный способ навигации по структуре документа (которую можно использовать, только если в документе правильно размечены заголовки). Эта функция просто мега полезна при частой работе с большими документами (книги, сценарии и т.п.).&lt;/p&gt;
&lt;p&gt;Так же немаловажна возможность изменять в дальнейшем внешний вид этих заголовков в несколько кликов и лишиться &amp;#171;удовольствия&amp;#187; делать это вручную для каждого из них.&lt;/p&gt;
&lt;h3&gt;&amp;#171;Скелет&amp;#187; готов&lt;/h3&gt;
&lt;p&gt;В следующей статье я расскажу, как можно оформлять такой чистый текст на примере различных программ. &lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=ShbJKUB7OdA:Iw3u2gBQpOY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=ShbJKUB7OdA:Iw3u2gBQpOY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=ShbJKUB7OdA:Iw3u2gBQpOY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=ShbJKUB7OdA:Iw3u2gBQpOY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/ShbJKUB7OdA" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/gramotnaya-rabota-v-word/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Отсылка e-mail через C#</title>
		<link>http://dev.ezoterik.info/otsylka-e-mail-cherez-c-sharp/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=otsylka-e-mail-cherez-c-sharp</link>
		<comments>http://dev.ezoterik.info/otsylka-e-mail-cherez-c-sharp/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 16:24:25 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[SMTP]]></category>
		<category><![CDATA[Сниппеты]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=62</guid>
		<description>&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/06/mail_from_c_sharp.gif" alt="Отсылка e-mail через C#" width="150" height="118" class="alignnone size-full wp-image-63" align="right" /&gt;Этот кусок кода показывает, как можно программно отослать электронное письмо средствами C#. Письмо отсылается через указанный SMTP-сервер, который требует авторизацию. Так же к письму можно прикрепить одно или несколько вложений.&lt;/p&gt;
&lt;pre class="brush: csharp; title: ; notranslate"&gt;
//Адрес SMTP-сервера
String smtpHost = &amp;quot;SMTP.SERVER.RU&amp;quot;;
//Порт SMTP-сервера
int smtpPort = 25;
//Логин
String smtpUserName = &amp;quot;LOGIN&amp;quot;;
//Пароль
String smtpUserPass = &amp;quot;PASSWORD&amp;quot;;

//Создание подключения
SmtpClient client = new SmtpClient(smtpHost, smtpPort);
client.Credentials = new NetworkCredential(smtpUserName, smtpUserPass);

//Адрес для поля &amp;quot;От&amp;quot;
String msgFrom = &amp;quot;LOGIN@SERVER.RU&amp;quot;;
//Адрес для поля &amp;quot;Кому&amp;quot; (адрес получателя)
String msgTo = &amp;quot;KUDA@TO.RU&amp;quot;;
//Тема письма
String msgSubject = &amp;quot;Письмо от C#&amp;quot;;
//Текст письма
String msgBody = &amp;quot;Привет!\r\n\r\nЭто тестовое письмо\r\n\r\n--\r\nС уважением, C# &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &amp;quot;;
//Вложение для письма
//Если нужно больше вложений, для каждого вложения создаем свой объект Attachment с нужным путем к файлу
Attachment attachData = new Attachment(&amp;quot;D:\Тестовое вложение.zip&amp;quot;);

//Создание сообщения
MailMessage message = new MailMessage(msgFrom, msgTo, msgSubject, msgBody);
//Крепим к сообщению подготовленное заранее вложение
message.Attachments.Add(attachData);

try
{
    //Отсылаем сообщение
    client.Send(message);
}
catch (SmtpException ex)
{
    //В случае ошибки при отсылке сообщения можем увидеть, в чем проблема
    Console.WriteLine(ex.InnerException.Message.ToString());
}
&lt;/pre&gt;
&lt;p&gt;Тело письма и его заголовок будут созданы и отосланы в кодировке &amp;#8212; UTF-8. Если же захочется отослать письмо в кодировке windows-1251, то начинаются проблемы. Мне удалось найти только &lt;a href="http://ariokh-dark.livejournal.com/689562.html"&gt;одно  достаточно подробное описание этой проблемы&lt;/a&gt;. И в более свежих версиях фреймворка (помимо .Net Framework 2.0) точно такая же проблема.&lt;br /&gt;
&lt;br /&gt;
Да, отчасти помогает прописывание вручную заголовка, говорящего о кодировке всего письма, но с другой стороны, не так уж все радужно. Итак, перед кодом отсылки сообщения (после 29-ой строки) добавляем следующий код:&lt;/p&gt;
&lt;pre class="brush: csharp; title: ; notranslate"&gt;
message.SubjectEncoding = Encoding.Default;
message.BodyEncoding = Encoding.Default;
message.Headers[&amp;quot;Content-type&amp;quot;] = &amp;quot;text/plain; charset=windows-1251&amp;quot;;
&lt;/pre&gt;
&lt;p&gt;В итоге мы имеем письмо, у которого два раза (второй раз вставляется автоматом) повторяется заголовок Content-type, в первом указана кодировка windows-1251, а во втором настырный .Net вставляет UTF-8. Не думаю, что такое дублирование заголовков можно назвать корректным. Но это, похоже, единственный способ добиться какой-то адекватности отображения тела письма в почтовой программе, которая получит его.&lt;/p&gt;
&lt;p&gt;Для просмотра писем я использую &lt;a href="http://www.mozilla-europe.org/ru/products/thunderbird/"&gt;Mozilla Thunderbird&lt;/a&gt;. В нем тело письма отображается нормально, но при этом он не понимает кодировки заголовка письма и отображает его некорректно. Если оставить заголовок в кодировке UTF-8, а тело письма создавать в windows-1251:&lt;/p&gt;
&lt;pre class="brush: csharp; title: ; notranslate"&gt;
message.BodyEncoding = Encoding.Default;
message.Headers[&amp;quot;Content-type&amp;quot;] = &amp;quot;text/plain; charset=windows-1251&amp;quot;;
&lt;/pre&gt;
&lt;p&gt;Тогда Thunderbird правильно отображает письмо. Но все эти ухищрения достаточно сомнительны из-за того, что каждый почтовый клиент может по-своему трактовать двойной и противоречивый заголовок Content-type. Так, к примеру, если посмотреть на такое письмо через вэбовский клиент mail.ru, то при любых раскладах тело письма отображается коряво. Тема же отображается правильно, только если отсылать ее в UTF-8.&lt;/p&gt;
&lt;p&gt;Глядя на эту печальную картину, в голову приходит только два варианта решения проблемы. Плюнуть и отсылать письма в UTF-8 или же самостоятельно подключаться к SMTP-серверу и &amp;#171;вручную общаться&amp;#187; с ним по протоколу SMTP, а не использовать готовую реализацию в виде класса SmtpClient.&lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=8FaMgWdR2qA:Ff5PzIuoRKk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=8FaMgWdR2qA:Ff5PzIuoRKk:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=8FaMgWdR2qA:Ff5PzIuoRKk:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=8FaMgWdR2qA:Ff5PzIuoRKk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/8FaMgWdR2qA" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/otsylka-e-mail-cherez-c-sharp/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Правильный редактор для PHP</title>
		<link>http://dev.ezoterik.info/komodo-edit-for-php/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=komodo-edit-for-php</link>
		<comments>http://dev.ezoterik.info/komodo-edit-for-php/#comments</comments>
		<pubDate>Fri, 23 May 2008 22:19:57 +0000</pubDate>
		<dc:creator>ezoterik</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Инструменты]]></category>

		<guid isPermaLink="false">http://dev.ezoterik.info/?p=54</guid>
		<description>&lt;p&gt;Иногда очень сильно не хватает какого-то хорошего редактора для PHP именно с точки зрения комфортной работы с кодом, что-то посерьезней, чем простая подсветка синтаксиса. При этом обычных редакторов пруд пруди, в которых, к сожалению, та же подсветка синтаксиса далеко не всегда корректно работает.&lt;/p&gt;
&lt;p&gt;Хочется иметь нормальную реализацию IntelliSense, а не &amp;#171;деревянную&amp;#187; пародию на него в виде заранее определенного списка методов и констант языка, &amp;#171;вываливающегося&amp;#187; во время работы по поводу и без повода в виде полного списка. IntelliSense обязательно должен &amp;#171;знать&amp;#187; о всех используемыми вами классах, о их методах и переменных, то есть подключил через #include файл с определением своего класса, и редактор сразу же его подхватывает, подсказывая информацию о всех &amp;#171;внутренностях&amp;#187; объектов этого класса.&lt;br /&gt;
&lt;br /&gt;
Не помешали бы так же подсказки во время набора названия функции в виде краткого описания функции (принимаемые параметры, есть ли перегруженные функции и т.п.). Особенно этого не хватает для самописных функций, в некоторых типичных редакторах я видел такие подсказки, но только для родных функций PHP. Ах да, еще очень удобно быстро переходить к определению функции из места ее вызова. Вообще, много чего еще хочется, причем все эти возможности считаю лишь толикой самых необходимых вещей в процессе кодинга и никак не излишеством&amp;#8230;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/05/featureintellisensefilter.png" alt="Пример работы Intellisense в Visual Assist" title="Пример работы Intellisense в Visual Assist" width="426" height="175" class="size-full wp-image-61" /&gt;&lt;/p&gt;
&lt;p&gt;Можно сказать, что в этом смысле моим идеалом является связка MS Visual Studio + &lt;a href="http://www.wholetomato.com"&gt;Visual Assist&lt;/a&gt;, которую я использую при работе с C# и C++ (Visual Assist в этой связке просто как спасательный круг). Когда лишний раз не лезешь в другие файлы, чтобы посмотреть принимаемые параметры функции или названия тех или иных членов класса, это в любом случае способствует производительности и &amp;#171;приятности&amp;#187; процесса. Отсутствие среди своего инструментария такого редактора очень удручает, учитывая все большую (от версии к версии) объектно-ориентированность PHP.&lt;/p&gt;
&lt;h3&gt;И вот оно!&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo_logo.gif" alt="Логотип Komodo" title="Логотип Komodo" width="100" height="55" class="size-full wp-image-59" align="right" /&gt;Все же нашел для себя достаточно неплохой редактор &amp;#8212; &lt;a href="http://www.activestate.com/Products/komodo_ide/komodo_edit.mhtml"&gt;Komodo Edit&lt;/a&gt;. Если вы, как я, пользовались обычными редакторами, заменяющими стандартный &amp;#171;блокнот&amp;#187; и тоже жаждали человеческого IntelliSense, советую обязательно попробовать его. Он ко всему еще и бесплатный (о платной версии ниже) и работает на базе мозиловского фреймворка (XPFE), что делает его так же мультиплатформенным.&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href='http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo.gif'&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo-300x264.gif" alt="Komodo Edit" title="Komodo Edit" width="300" height="264" class="alignnone size-medium wp-image-60" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Этот редактор не идеал, в нем много хорошего, при этом, конечно же, ему есть куда еще развиваться. Но, в целом, в первые дни знакомства с ним у меня не было предела радости &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;Стоит так же отметить поддержку и других языков (Perl, Python, Ruby, Tcl), а так же JavaScript, CSS, HTML, XML и много другого (судя по списку файлов, которые он может открыть, он знает еще много языков и технологий, но не уверен насчет работы IntelliSense для них всех). Приятно удивила поддержка многих популярных фрейворков для JavaScript (для &lt;a href="http://dev.ezoterik.info/jquery_for_javascript/"&gt;моего знакомства с jQuery&lt;/a&gt; это было кстати).&lt;/p&gt;
&lt;p&gt;Я наверняка еще не успел изучить весь функционал Komodo Edit, но некоторые моменты хотел бы описать.&lt;/p&gt;
&lt;p&gt;Первым делом я настроил под себя цветовую схему подсветки кода для PHP (&lt;em&gt;Edit -&gt; Preferences… -&gt; Fonts and Colors&lt;/em&gt;), так как привык уже к цветам из &lt;a href="http://notepad-plus.sourceforge.net"&gt;Notepad++&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href='http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo_p1.gif'&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo_p1-300x259.gif" alt="Настройка цветовой схемы для подсветки PHP кода" title="Настройка цветовой схемы для подсветки PHP кода" width="300" height="259" class="size-medium wp-image-56" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Так же полезным дополнением оказался &lt;a href="http://community.activestate.com/komodo-extension/todo-helper"&gt;плагин&lt;/a&gt;, который находит все TODO в открытом проекте или файле и выводит их в один список (на подобие того, как это реализовано в VS). И плагин, позволяющий видеть в виде одного списка все классы и методы, определенные в открытом файле (&lt;a href="http://community.activestate.com/komodo-extension/source-tree"&gt;Source Tree&lt;/a&gt;) для быстрой навигации по ним.&lt;/p&gt;
&lt;p&gt;Вообще перед использованием Komodo имеет смысл изучить его настройки, изменив те или иные параметры под себя. Я, к примеру, еще переопределил горячую клавишу для перехода к определению функций (сделал F12, как в Visual Studio &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  ).&lt;/p&gt;
&lt;p&gt;В целом все работает достаточно хорошо, &amp;#171;земля и небо&amp;#187; по сравнению с кодингом в обычном редакторе.&lt;/p&gt;
&lt;p&gt;Немного неудобно, что для полноценной поддержки IntelliSense обязательно нужно создавать файл проекта (его нужно просто сохранить в корневой каталог сайта). То есть если открыть один файл вне рамок проекта Komodo, все инклуды, прописанные в нем, не будут обрабатываться как-либо, и, соответственно, Komodo не будет ничего знать о функциях и классах, определенных в подключаемых файлах. Но, в целом, это маленькое неудобство пережить можно &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;С другой стороны, создание файла проекта дает возможность выполнить более тонкие настройки проекта, которые сохраняются и при каждом открытии проекта, Komodo будет помнить о них. Через него, к примеру, можно указать дополнительные директории для того, чтобы Komodo при работе с вашим проектом все время имел ввиду структуру классов и методов (для IntelliSense и различных подсказок), реализованных в файлах, которые лежат в подключаемой директории, даже если эти файлы ни как фактически не подключены (через include или require) к редактируемому файлу. Еще можно производить поиск или замену текста во всех файлах проекта. Так же, Komodo запоминает сделанные вами закладки внутри кода (&lt;em&gt;Ctrl+F2&lt;/em&gt;) для каждого файла, это очень удобно.&lt;/p&gt;
&lt;p&gt;Немного неприятно удивило, что Komodo Edit ничего не знает о встроенных в PHP классах (может, я делаю что-то не так?). К примеру, если нужно использовать класс mysqli:&lt;/p&gt;
&lt;pre class="brush: sql; title: ; notranslate"&gt;
$mysqli = new mysqli(HOST, USER, PASS, MBASE);
if (mysqli_connect_errno()) {
	print &amp;quot;Connect failed: &amp;quot;.mysqli_connect_error();
	exit();
}
$mysqli-&amp;gt;query('INSERT.......');
$mysqli-&amp;gt;close();
&lt;/pre&gt;
&lt;p&gt;Когда после написания слова &amp;#171;$mysqli&amp;#187; я начинаю обращаться к методам этого объекта (пишу знак &amp;#171;-&gt;&amp;#187;), Komodo Edit не хочет подсказывать ничего о методах query, close и т.д., а в строке состояния ругается, что, мол, в глаза не видел определения этого класса&amp;#8230; При этом со встроенными в PHP функциями проблем нет, к примеру, о семействе функций mysqli_* (оберткой над которыми и является класс mysqli) Komodo прекрасно знает. Но, надеюсь, эту недоработку когда-нибудь поправят. Если же вы, к примеру, работаете с базой через свой класс &amp;#8212; обертку (или через что-то вроде PEAR), то проблем с IntelliSense не должно возникать.&lt;/p&gt;
&lt;p&gt;Один раз у меня случилось так, что при редактировании js файла Komodo не понял, какой Java Script фреймворк я использую. Но это, к счастью, всегда можно поправить в его настройках (&lt;em&gt;Edit -&gt; Preferences… -&gt; Code Intelligence&lt;/em&gt;).&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href='http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo_p2.gif'&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo_p2-300x259.gif" alt="Окно настройки, позволяющее указать используемые Java Script фреймворки" title="Окно настройки, позволяющее указать используемые Java Script фреймворки" width="300" height="259" class="size-medium wp-image-57" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Существует платная версия Komodo, называемая &lt;a href="http://www.activestate.com/Products/komodo_ide/index.mhtml"&gt;Komodo IDE&lt;/a&gt;. Как я понял, основное отличие от Komodo Edit в функциях, свойственных многим &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B5%D0%B4%D0%B0_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F"&gt;IDE&lt;/a&gt;. Комодо IDE имеет встроенные инструменты для работы с системой управления версиями (SVN) и отладчик кода.&lt;/p&gt;
&lt;p&gt;Кстати, в Komodo Edit все же есть примитивный отладчик, который на ходу уведомляет о таких мелких ошибках, как забытая точка с запятой в конце строки, незакрытая скобка и т.п. Такие ошибки он подчеркивает красной волнистой линией. Для того, чтобы такая отладка работала, нужно в настройках программы указать путь к исполняемому файлу PHP и php.ini (&lt;em&gt;Edit -&gt; Preferences… -&gt; Languages -&gt; PHP&lt;/em&gt;).&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href='http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo_p3.gif'&gt;&lt;img src="http://dev.ezoterik.info/wp-content/uploads/2008/05/komodo_p3-300x276.gif" alt="Указание пути к исполняемому файлу PHP и php.ini" title="Указание пути к исполняемому файлу PHP и php.ini" width="300" height="276" class="size-medium wp-image-58" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Как видно, подобные настройки можно проделать и для всех остальных языков.&lt;/p&gt;
&lt;h3&gt;Послесловие&lt;/h3&gt;
&lt;p&gt;Komodo Edit теперь мой повседневный инструмент &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  Плюс, для коротких правок каких-то мелочей в эпизодических случаях я продолжаю использовать аналог продвинутого блокнота &amp;#8212; Notepad++, то есть использую его по своему настоящему назначению.&lt;/p&gt;
&lt;p&gt;До Komodo Edit я еще пробовал интересный плагин к Visual Studio, который называется &lt;a href="http://www.jcxsoftware.com/vs.php"&gt;VS.Php&lt;/a&gt;. Он встраивается в Visual Studio и позволяет работать с PHP так же, как, к примеру, с C# (можно отлаживать код, работает IntelliSense и т.п.). Но как-то он не особо впечатлил, особенно на фоне своей платности. К тому же, как я понял, работая в нем можно полностью забыть про поддержку Java Script и т.п. Интересно еще то, что в нем точно так же, как в Komodo, не работает IntelliSense для классов, встроенных в PHP. Так же этот VS.Php конфликтует с Visual Assist.&lt;/p&gt;
&lt;p&gt;Есть еще два подобных редактора, о которых я слышал, но как-то не случилось их попробовать (дальше лишь ИМХО и догадки на основе &amp;#171;слухов&amp;#187;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.zend.com/en/products/studio/"&gt;Zend Studio&lt;/a&gt; – платный, по отзывам сложилось впечатление, что это нечто громоздкое и применимо в первую очередь ну в очень больших и сложных проектах, особенно он уместен, возможно, если проект создается на основе Zend Framework.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; – бесплатный, но отпугнул, скорее всего, своей &amp;#171;накрученностью&amp;#187;. Как я понял, его еще нужно уметь собрать под себя из различных модулей. В общем, как-то не возникло желания разбираться с тем, как его установить и настроить (но в свое время я все же пытался немного &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /&gt;  ), хотя, несомненно, кому-то он может очень нравиться.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;***&lt;/h3&gt;
&lt;p&gt;Если кто-то посоветует какие-нибудь еще редакторы с оглядкой на мои &amp;#171;придирчивые&amp;#187; вкусы, буду очень благодарен. Так же было бы интересно услышать о каких-то дополнительных интересных особенностях Komodo от тех, кто им уже пользуется.&lt;/p&gt;
&lt;p&gt;В общем, долой примитивную подсветку кода с вагоном ненужных функций! Это &amp;#171;наболевший&amp;#187; камень в огород постоянно появляющихся простых редакторов кода, выставляющих на передний план среди своих &amp;#171;достоинств&amp;#187; встроенный проводник по файловой системе или что-то вроде мини редактора/вьювера базы данных (ну зачем это нужно, если нет самых важных вещей именно для того, для чего изначально предполагается использовать редактор кода) и т.п. и т.д.. Почему-то почти каждый начинающий (хотя, может, не всегда начинающий) программист хочет &amp;#171;быстренько&amp;#187; сделать свой &amp;#171;мега&amp;#187; редактор, который часто вырождается в &amp;#171;опять что-то до боли знакомое&amp;#187;&amp;#8230; очевидно, это традиция из серии &amp;#171;Hellow World!&amp;#187; &lt;img src='http://dev.ezoterik.info/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;hr /&gt;&lt;small&gt;Copyright &amp;copy; 2008 &lt;a href="http://dev.ezoterik.info/"&gt;Заметки разработчика&lt;/a&gt;&lt;br /&gt;Эта rss лента только для персонального некоммерческого использования. &lt;/small&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=HRmo8HX-Enw:dTTvBtGN2ec:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=HRmo8HX-Enw:dTTvBtGN2ec:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?i=HRmo8HX-Enw:dTTvBtGN2ec:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devezoterik?a=HRmo8HX-Enw:dTTvBtGN2ec:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devezoterik?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devezoterik/~4/HRmo8HX-Enw" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://dev.ezoterik.info/komodo-edit-for-php/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
	</channel>
</rss>

