<?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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>WEB рукоделие</title>
	
	<link>http://www.handmadesite.net</link>
	<description>Какой механизм?! Все вручную!</description>
	<lastBuildDate>Sun, 13 Nov 2011 23:18:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/handmadesite" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="handmadesite" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>55.778552</geo:lat><geo:long>37.548244</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fhandmadesite" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fhandmadesite" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fhandmadesite" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fhandmadesite" 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://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fhandmadesite" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fhandmadesite" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</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%2Fhandmadesite" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
		<title>Список статей блога WebAsyst ShopScript</title>
		<link>http://www.handmadesite.net/2011/11/list-of-blog-posts-webasyst-shopscrip/</link>
		<comments>http://www.handmadesite.net/2011/11/list-of-blog-posts-webasyst-shopscrip/#comments</comments>
		<pubDate>Sun, 13 Nov 2011 23:18:01 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[Shop-Script]]></category>
		<category><![CDATA[WASS]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=420</guid>
		<description><![CDATA[Список статей блога, честно говоря, в webasyst сделан довольно бестолково. Лично мне больше нравится, как сделано в WordPress — с возможностью убирать часть поста&#187;под кат&#187;, т.е. в основном списке публиковать только часть статьи и ссылку &#171;читать дальше&#187; для тех, кто заинтересовался. Вообще есть один или несколько плагинов, продаваемых умельцами, которые позволяют делать такую ленту с [...]]]></description>
			<content:encoded><![CDATA[<p>Список статей блога, честно говоря, в webasyst сделан довольно бестолково. Лично мне больше нравится, как сделано в WordPress — с возможностью убирать часть поста&#187;под кат&#187;, т.е. в основном списке публиковать только часть статьи и ссылку &#171;читать дальше&#187; для тех, кто заинтересовался.</p>
<p>Вообще есть один или несколько плагинов, продаваемых умельцами, которые позволяют делать такую ленту с анонсами и даже прикреплять картинку к анонсу. Этот вариант я запомнил и решил, что если быстро ничего не придумаю, то куплю.</p>
<p>Сначала решил, что самое простым решением будет оборачивать часть статьи в DIV и в CSS прописать ему свойство &#8216;display:none;&#8217;. Грубо, но должно получиться. Единственное, что меня остановило — статьи пишу не я, а объяснять как &#171;оборачивать в DIV&#187; мне очень не хочется. И еще контролировать, чтоб вложенность тэгов соблюдалась.</p>
<p>Тогда я обратил внимание, что при написании постов никто не пользуется тэгом HR (горизонтальная линия) и решил, что это будет отличный разделитель. Кнопка для вставки этого тэга есть в стандартном визуальном редакторе, так что проблем у авторов статей возникнуть не должно.<span id="more-420"></span></p>
<p>Файл с шаблоном списка статей (/published/SC/html/scripts/templates/news.frontend.list.tpl.html) поменял как-то так: на показ статей там цикл {section}{sectionelse}{/section}. Вот сразу после {section} и добавил пару строк — тут создаются полезные переменные: URL статьи и ссылка &#171;читать дальше&#187;.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>assign <span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">=</span>article_url value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;?ukey=news&amp;amp;blog_id=&quot;</span><span style="color: #339933;">|</span>cat<span style="color: #339933;">:</span><span style="color: #000088;">$news_posts</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>NID<span style="color: #339933;">|</span>set_query_html<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span>assign <span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">=</span>readmore value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;&lt;p class=<span style="color: #000099; font-weight: bold;">\&quot;</span>readmore<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;&lt;a href=<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #339933;">|</span>cat<span style="color: #339933;">:</span><span style="color: #000088;">$article_url</span><span style="color: #339933;">|</span>cat<span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;Читать полностью &amp;raquo;&lt;/a&gt;&lt;/p&gt;&quot;</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>а там, где выводится текст новости, т.е. просто показывается переменная $news_posts[i].textToPulication, заменил ее на 2 такие строки:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>assign <span style="color: #000000; font-weight: bold;">var</span><span style="color: #339933;">=</span>textToPublication value<span style="color: #339933;">=</span><span style="color: #000088;">$news_posts</span><span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>textToPublication<span style="color: #339933;">|</span>regex_replace<span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;/[<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span>]/iu&quot;</span><span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span><span style="color: #000088;">$textToPublication</span><span style="color: #339933;">|</span>regex_replace<span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;/&lt;hr.*&gt;.*/iu&quot;</span><span style="color: #339933;">:</span><span style="color: #000088;">$readmore</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>После этого в файле шаблона, который отвечает за показ одной статьи блога (/published/SC/html/scripts/templates/news.frontend.post.tpl.html) добавил код, просто убирающий сам тэг HR. Вместо</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #000088;">$news_posts</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>textToPublication<span style="color: #009900;">&#125;</span></pre></div></div>

<p>написал вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009900;">&#123;</span><span style="color: #000088;">$news_posts</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span>textToPublication<span style="color: #339933;">|</span>regex_replace<span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;/&lt;hr.*&gt;/&quot;</span><span style="color: #339933;">:</span><span style="color: #0000ff;">&quot;&quot;</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Вот и все. Обошлись малой кровью, все довольны, все смеются :)</p>

<p><a href="http://feedads.g.doubleclick.net/~a/9mzvCzQXROJvDVD25jHNkax6LKY/0/da"><img src="http://feedads.g.doubleclick.net/~a/9mzvCzQXROJvDVD25jHNkax6LKY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/9mzvCzQXROJvDVD25jHNkax6LKY/1/da"><img src="http://feedads.g.doubleclick.net/~a/9mzvCzQXROJvDVD25jHNkax6LKY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=hR70tR9r6tU:F8cDKB4GJFU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=hR70tR9r6tU:F8cDKB4GJFU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=hR70tR9r6tU:F8cDKB4GJFU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=hR70tR9r6tU:F8cDKB4GJFU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=hR70tR9r6tU:F8cDKB4GJFU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=hR70tR9r6tU:F8cDKB4GJFU:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/hR70tR9r6tU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2011/11/list-of-blog-posts-webasyst-shopscrip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Скидки в скриптах интернет-магазина</title>
		<link>http://www.handmadesite.net/2011/10/skidki-v-skriptax-internet-magazina/</link>
		<comments>http://www.handmadesite.net/2011/10/skidki-v-skriptax-internet-magazina/#comments</comments>
		<pubDate>Sat, 29 Oct 2011 17:59:40 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[Интернет-магазины]]></category>
		<category><![CDATA[интернет-магазин]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=408</guid>
		<description><![CDATA[Готовлюсь сравнивать несколько скриптов интернет-магазинов и CMS, у которых есть соответствующие модули. Пока просто записываю мысли о том, на что обратить внимание. В итоге попробую свести это либо в какую-то таблицу, либо еще как-то систематизировать. Если в процессе я что-то упустил, то не надо стесняться написать в комментариях. Часто возможность раздачи скидок выпадает из факторов, [...]]]></description>
			<content:encoded><![CDATA[<p>Готовлюсь сравнивать несколько скриптов интернет-магазинов и CMS, у которых есть соответствующие модули. Пока просто записываю мысли о том, на что обратить внимание. В итоге попробую свести это либо в какую-то таблицу, либо еще как-то систематизировать. Если в процессе я что-то упустил, то не надо стесняться написать в комментариях.</p>
<p>Часто возможность раздачи скидок выпадает из факторов, которые рассматриваются при выборе платформы. И зря. Трудно себе представить, какие фантазии могут придти в голову владельцам, маркетологам или рекламщикам магазина. Поэтому при выборе скриптов для интернет-магазина этот параметр никак нельзя упускать из виду. Во многих случаях я натыкался на жестко фиксированный набор различных скидочных программ, который причинял изрядные неудобства уже спустя несколько месяцев после запуска сайта. Зачем далеко ходить? Например, после установки модулей приема платежей с кредитных карт владельцу пришло в голову дать скидку за платежи наличными — те самые 3-4%, которые забирает себе эквайрер. А автор скрипта этого не предусмотрел. В таких случаях часто требуется вмешательство в основной код скрипта, что, конечно, расстраивает. И не просто расстраивает! Многие скрипты сейчас имеют возможность автоматического обновления, при котором либо все внесенные изменения, конечно, теряются, либо просто блокируют саму возможность обновления.</p>
<p>Модульность этого компонента скрипта интернет-магазина даст возможность комбинировать и видоизменять, гибко настраивать скидочную систему. Это очень важная составляющая, от которой, во многом, зависит успешность проекта.<span id="more-408"></span></p>
<p>Наиболее распространенные виды скидок, которые понадобятся:</p>
<ol>
<li>Скидка на конкретный товар. Часто это реализуется в карточке товара хранением двух цен — «старая/новая цена». Точно так же это часто бывает неудобно, особенно если скидка на определенный товар для ограниченного круга посетителей. Лучше, если этот функционал будет реализован в разделе скидок, а не в карточке товара</li>
<li>Скидка на группу товаров или категорию или марку. В общем, на какие-то товары, объединенные общим признаком. В принципе, обходится редактированием скидок из первого пункта, но это может быть неудобно. Акция типа «распродажа всех MP3-плееров» заставит менеджеров изрядно потрудиться, указывая на каждый плеер отдельно скидку</li>
<li>Скидка по купону (промо-коду). Такая возможность обязательно должна быть. Купоны могут быть одноразовыми, многоразовыми, с или без ограничения по сроку действия. Еще лучше, если к этим возможностям добавляются возможности из первых двух пунктов, получается очень гибкая система</li>
<li>Скидка за количество заказов, за объем заказа, накопительная за общее количество потраченных денег. Самый часто встречающийся вариант, тут и объяснять ничего не надо</li>
<li>Подарочный сертификат. Также полезная вещь. Отличается от купона тем, что предоставляет не скидку, а определенную сумму, на которую покупатель может выбрать товар. Далеко не во всех скриптах реализовано, ведь для обработки таких купонов надо вести специальный «счет» пользователя, учитывать при оплате состояние этого счета и т.д. И еще неизвестно, что решит владелец магазина, вдруг некоторые товары, например, нельзя будет купить по такому сертификату. Или еще что-то.</li>
</ol>
<p>Таким образом при выборе скрипта надо проверять наличие хотя бы первых четырех пунктов, особо отличать за наличие пункта номер 5 и за «модульность», если скидочные модули можно добавлять самостоятельно. Если в демо-версии непонятно, как реализована система скидок имеет смысл заглянуть на сайт разработчика и посмотреть есть-ли отдельно модули, реализующие какие-нибудь, неважно какие, скидки.</p>
<p>Отдельно еще надо обратить внимание на то, как комбинируются скидки. Как правило везде есть выбор из минимум двух опций: суммировать или выбирать наибольшую. Если кроме этих двух в скрипте предусмотрено что-то еще — можно считать плюсом и отмечать отдельно. Если наоборот, выбора нет — обратить особое внимание, отсутствие этого минимального функционала может создать проблемы при эксплуатации сайта.</p>
<p>При пристальном изучении обратить внимание на реализацию «модульности»: одно дело, если скидка рассчитывается только при оформлении заказа, другое — если есть возможность рассчитать и показать результат расчета при просмотре сайта или карточки товара: наглядно сообщение «цена с учетом Вашей скидки MMM руб., а не NNN как для остальных» также оказывает хорошее действие на принятие решения о покупке.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/ubMy3WRHGy-FlUvpFN_DVLw_xPg/0/da"><img src="http://feedads.g.doubleclick.net/~a/ubMy3WRHGy-FlUvpFN_DVLw_xPg/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ubMy3WRHGy-FlUvpFN_DVLw_xPg/1/da"><img src="http://feedads.g.doubleclick.net/~a/ubMy3WRHGy-FlUvpFN_DVLw_xPg/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=u4sWm4EM7s8:jkz09VsD-qA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=u4sWm4EM7s8:jkz09VsD-qA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=u4sWm4EM7s8:jkz09VsD-qA:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=u4sWm4EM7s8:jkz09VsD-qA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=u4sWm4EM7s8:jkz09VsD-qA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=u4sWm4EM7s8:jkz09VsD-qA:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/u4sWm4EM7s8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2011/10/skidki-v-skriptax-internet-magazina/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Консольная очередь</title>
		<link>http://www.handmadesite.net/2011/01/console-queue/</link>
		<comments>http://www.handmadesite.net/2011/01/console-queue/#comments</comments>
		<pubDate>Mon, 17 Jan 2011 00:10:12 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[queue]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=402</guid>
		<description><![CDATA[У приложения есть несколько задач, которые, по идее, должны выполняться в консоли и пользователь не должен ждать окончания их выполнения. Или они должны стартовать по cron&#8217;у. Т.е. те, что инициировал пользователь, должны начать выполняться немедленно — загружен прайслист, нажата кнопка «обновить рейтинг». Также есть задания, выполняемые по расписанию: генерация sitemap, рассылка новостей почтой и т.д. [...]]]></description>
			<content:encoded><![CDATA[<p>У приложения есть несколько задач, которые, по идее, должны выполняться в консоли и пользователь не должен ждать окончания их выполнения. Или они должны стартовать по cron&#8217;у. Т.е. те, что инициировал пользователь, должны начать выполняться немедленно — загружен прайслист, нажата кнопка «обновить рейтинг». Также есть задания, выполняемые по расписанию: генерация sitemap, рассылка новостей почтой и т.д. Нашел три приемлемых решения, никак не могу выбрать.<span id="more-402"></span></p>
<ol>
<li>Использовать <a href="https://github.com/MSeven/cakephp_queue" target="_blank">плагин CakePHP Queue</a>. Мне не нравится в нем то, что он постоянно крутится отдельной задачей, проверяя каждые N минут наличие новых заданий. С одной стороны заданий планируется не так много, чтоб опрашивать каждые 10 минут, с другой — хочется, чтоб исполнение начиналось сразу после поступления нового. И задания должны быть оформлены в виде <a href="http://book.cakephp.org/ru/view/1109/Tasks" target="_blank">Tasks</a>, но у меня уже есть консольные скрипты со своими tasks.</li>
<li>Можно добавлять в отдельную таблицу задание (название скрипта и параметры) и запускать в бэкграунде (через exec(&#8216;nohup…&#8217;) скрипт-диспетчер, который проверяет, выполняется-ли уже он сам и, если нет, начинает запускать скрипты, доставая их из этой таблицы. Запускать по-простому, с помощью exec(…). Если будет запущена вторая копия диспетчера, она сразу завершится. Так и будут выполнятся поочередно все задания, пока очередь не очистится. Можно добавлять задания из cron&#8217;а, можно из приложения. Раз задание хранится в БД, то можно и лог привязать к номеру этого задания, что тоже приятно. В этой схеме мне нравится все, кроме того, что для выполнения любого консольного скрипта будет запущено 2 копии php с cake. Одна для выполнения диспетчера, вторая — для выполнения задания.</li>
<li>Диспетчером может быть не шелл-скрипт на Cake, а обычный bash-скрипт. Вот только доступа к БД у него нет и задания, наверное, придется записывать построчно в текстовой файл. Отслеживание блокировки файла, удаление строк с выполненными заданиями и прочее совсем не внушают оптимизма.</li>
</ol>
<p>Я ничего не упустил? Может, есть еще какие-то более красивые и удобные варианты?</p>

<p><a href="http://feedads.g.doubleclick.net/~a/PhqA07fDt10o-6NazWXLkSwzcZU/0/da"><img src="http://feedads.g.doubleclick.net/~a/PhqA07fDt10o-6NazWXLkSwzcZU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/PhqA07fDt10o-6NazWXLkSwzcZU/1/da"><img src="http://feedads.g.doubleclick.net/~a/PhqA07fDt10o-6NazWXLkSwzcZU/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=WWfEMOP-clM:ZZKZmS_tsLk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=WWfEMOP-clM:ZZKZmS_tsLk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=WWfEMOP-clM:ZZKZmS_tsLk:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=WWfEMOP-clM:ZZKZmS_tsLk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=WWfEMOP-clM:ZZKZmS_tsLk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=WWfEMOP-clM:ZZKZmS_tsLk:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/WWfEMOP-clM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2011/01/console-queue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Особенности межплагинного взаимодействия</title>
		<link>http://www.handmadesite.net/2010/11/osobennosti-mezhplaginnogo-vzaimodejstviya/</link>
		<comments>http://www.handmadesite.net/2010/11/osobennosti-mezhplaginnogo-vzaimodejstviya/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 11:08:30 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Models]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[Модели]]></category>
		<category><![CDATA[Модель]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=392</guid>
		<description><![CDATA[Конечно, вызывать методы классов плагина из другого плагина не очень хорошо. Но, тем не менее. Чтобы впоследствии не было мучительно больно, при объявлении связей между моделями, надо всегда указывать свойство className, причем полностью, т.е. &#8216;Plugin.MyModel&#8217;. Иначе возможны весьма забавные эффекты. Справедливо для версий 1.2 и 1.3. Дальше немного кода. Есть два плагина: PluginOne и PluginTwo. [...]]]></description>
			<content:encoded><![CDATA[<p>Конечно, вызывать методы классов плагина из другого плагина не очень хорошо. Но, тем не менее. Чтобы впоследствии не было мучительно больно, при объявлении связей между моделями, надо всегда указывать свойство <var>className</var>, причем полностью, т.е. &#8216;Plugin.MyModel&#8217;. Иначе возможны весьма забавные эффекты. Справедливо для версий 1.2 и 1.3. Дальше немного кода.</p>
<p><span id="more-392"></span>Есть два плагина: <var>PluginOne</var> и <var>PluginTwo</var>. У первого две связанные модели: <var>PluginOneModelOne belongsTo PluginOneModelTwo</var>. У второго плагина одна модель, связанная с первой моделью первого плагина (пусть тоже будет belongsTo, неважно): <var>PluginTwoModelOne belongsTo PluginOneModelOne</var>. Соответственно, объявлено все это вот так:</p>
<p>Файл /plugins/plugin_one/models/plugin_one_model_one.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> PluginOneModelOne <span style="color: #000000; font-weight: bold;">extends</span> PluginOneAppModel <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$belongsTo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'PluginOneModelTwo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Файл /plugins/plugin_one/models/plugin_one_model_two.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> PluginOneModelTwo <span style="color: #000000; font-weight: bold;">extends</span> PluginOneAppModel <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$actsAs</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Tree'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Файл /plugins/plugin_two/models/plugin_two_model_one.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> PluginTwoModelOne <span style="color: #000000; font-weight: bold;">extends</span> PluginTwoAppModel <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$belongsTo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'PluginOneModelOne'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'className'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'PluginOne.PluginOneModelOne'</span>
		<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Создадим в контроллере второго плагина тестовый метод:</p>
<p>Файл /plugins/plugin_two/controllers/plugin_two_model_ones_controller.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> PluginTwoModelOnesController <span style="color: #000000; font-weight: bold;">extends</span> PluginTwoAppController <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">function</span> typeofmodel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">get_class</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">PluginTwoModelOne</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">PluginOneModelOne</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">PluginOneModelTwo</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Опачки! Третья модель типа <var>AppModel</var>, а не <var>PluginOneModelTwo</var>! Соответственно, не загружаются behaviours, перечисленные в <var>$actsAs</var>, не работают методы модели, не обрабатываются правила валидации. Хитрый Cake молча создает объект базового класса, чтоб связь работала для стандартной выборки, записи и все.</p>
<p>Достаточно в описании связи моделей первого плагина полностью указать какой класс использовать — все отлично начинает работать. Меняем код <var>PluginOneModelOne</var></p>
<p>Файл /plugins/plugin_one/models/plugin_one_model_one.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> PluginOneModelOne <span style="color: #000000; font-weight: bold;">extends</span> PluginOneAppModel <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$belongsTo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'PluginOneModelTwo'</span><span style="color: #339933;">=&gt;</span>array<span style="color: #009900;">&#40;</span>
				<span style="color: #0000ff;">'className'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'PluginOne.PluginOneModelTwo'</span>
		<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>и запускаем снова тестовый метод. Вот теперь все как и ожидается.</p>
<p>Если подумать, то поведение фреймворка в общем-то логичное. Он ищет класс в текущем плагине и у самого приложения. Хотя мог бы и предупреждать, пусть бы и только в отладочном режиме, что есть проблема.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/uCMsNWc7dYHpk1P5s1KsJTwOp8g/0/da"><img src="http://feedads.g.doubleclick.net/~a/uCMsNWc7dYHpk1P5s1KsJTwOp8g/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/uCMsNWc7dYHpk1P5s1KsJTwOp8g/1/da"><img src="http://feedads.g.doubleclick.net/~a/uCMsNWc7dYHpk1P5s1KsJTwOp8g/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=wIkruHkID4k:G5p_EjZSZmw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=wIkruHkID4k:G5p_EjZSZmw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=wIkruHkID4k:G5p_EjZSZmw:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=wIkruHkID4k:G5p_EjZSZmw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=wIkruHkID4k:G5p_EjZSZmw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=wIkruHkID4k:G5p_EjZSZmw:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/wIkruHkID4k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2010/11/osobennosti-mezhplaginnogo-vzaimodejstviya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проверка логина в Shop-Script</title>
		<link>http://www.handmadesite.net/2010/10/proverka-logina-v-shop-script/</link>
		<comments>http://www.handmadesite.net/2010/10/proverka-logina-v-shop-script/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 17:11:59 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[Shop-Script]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=384</guid>
		<description><![CDATA[На форуме WebAsyst&#8217;а увидел пост про проверку логина, введенного при регистрации. Как обычно впал в ступор от изящного решения. Весь рассматриваемый код находится в файле core_functions/registration_functions.php. Достал напильник и немного подточил. Во первых есть функция _testStrInvalidSymbol($str). Проверяет строку на наличие неправильных символов. Неправильные символы, с точки зрения авторов скрипта: одинарные и двойные кавычки, знаки больше [...]]]></description>
			<content:encoded><![CDATA[<p>На форуме WebAsyst&#8217;а увидел <a href="http://forum.webasyst.ru/viewtopic.php?pid=46941" target="_blank">пост про проверку логина, введенного при регистрации</a>. Как обычно впал в ступор от изящного решения. Весь рассматриваемый код находится в файле <var> core_functions/registration_functions.php</var>. Достал напильник и немного подточил.</p>
<p>Во первых есть функция <var>_testStrInvalidSymbol($str)</var>. Проверяет строку на наличие неправильных символов. Неправильные символы, с точки зрения авторов скрипта: одинарные и двойные кавычки, знаки больше и меньше, а также обратный слэш &#8212; всего пять. Угадайте с одного раза сколько раз в теле функции проверяется условие if. :) Если в строке найден &#171;неправильный&#187; символ, то функция возвращает FALSE, если все в порядке &#8212; TRUE.</p>
<p><span id="more-384"></span></p>
<p>
Заменил все внутренности на равноценную регулярку:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">return</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/\'\\\&quot;\&lt;\&gt;\`/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$str</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span></pre></div></div>

<p>Заодно добавил символ обратной кавычки или как оно там называется &#8212; то что на клавиатуре, левее кнопки с цифрой 1? :)
</p>
<p>Ну, раз занялся регулярками и проверками, вернулся к упомянутой на форуме функции <var>regVerifyContactInfo()</var> &#8212; там есть странное условие: первый символ логин должен быть латинской буквой. Почему буквой? Почему если буквой, то именно латинской, если дальше могут быть любые символы, кроме пяти &#171;запрещенных&#187;? Было бы логично требование, чтобы логин состоял из букв латинского алфавита, цифр, знаков тире, подчеркивания и точки. Или даже без точки :) Оставил это решение на совести разработчиков скрипта, но мимо самой проверки пройти не смог спокойно. вместо сложновложенного <var>if (ord($login) &lt;&#8217;a'&#8230;</var> тоже сделал регулярку (исходную строку найдете по имени константы):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/^[a-z]/i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$login</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span>
<span style="color: #000088;">$error</span> <span style="color: #339933;">=</span> ERROR_LOGIN_SHOULD_START_WITH_LATIN_SYMBOL<span style="color: #339933;">;</span></pre></div></div>

</p>
<p>
Заодно, раз уж открыл файл, заменил пяток вызовов функции ereg() &#8212; она считается устаревшей и неподдерживаемой с версии PHP 5.3</p>

<p><a href="http://feedads.g.doubleclick.net/~a/ZlCLXSUKBehOo-OeDnP3eJx2tmA/0/da"><img src="http://feedads.g.doubleclick.net/~a/ZlCLXSUKBehOo-OeDnP3eJx2tmA/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ZlCLXSUKBehOo-OeDnP3eJx2tmA/1/da"><img src="http://feedads.g.doubleclick.net/~a/ZlCLXSUKBehOo-OeDnP3eJx2tmA/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=gyV9FcwTOXI:gt8-eB0C5wk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=gyV9FcwTOXI:gt8-eB0C5wk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=gyV9FcwTOXI:gt8-eB0C5wk:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=gyV9FcwTOXI:gt8-eB0C5wk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=gyV9FcwTOXI:gt8-eB0C5wk:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=gyV9FcwTOXI:gt8-eB0C5wk:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/gyV9FcwTOXI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2010/10/proverka-logina-v-shop-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Почтовые адреса</title>
		<link>http://www.handmadesite.net/2010/09/street-addresses/</link>
		<comments>http://www.handmadesite.net/2010/09/street-addresses/#comments</comments>
		<pubDate>Sat, 25 Sep 2010 17:56:19 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[Интернет-магазины]]></category>
		<category><![CDATA[Проектирование]]></category>
		<category><![CDATA[Shop-Script]]></category>
		<category><![CDATA[идея]]></category>
		<category><![CDATA[интернет-магазин]]></category>
		<category><![CDATA[интернет-торговля]]></category>
		<category><![CDATA[мысль]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=375</guid>
		<description><![CDATA[Рассматривая кучу платных и бесплатных скриптов для создания интернет-магазинов, обратил внимание на то, что у большинства процесс оформления заказа далек от идеала. Это очень важный этап, который должен быть очень простым для покупателя, с минимумом заполняемых полей. Сейчас хочу остановиться конкретно на блоке данных с почтовым адресом. Обычно это адрес доставки, но также это может [...]]]></description>
			<content:encoded><![CDATA[<p>Рассматривая кучу платных и бесплатных скриптов для создания интернет-магазинов, обратил внимание на то, что у большинства процесс оформления заказа далек от идеала. Это очень важный этап, который должен быть очень простым для покупателя, с минимумом заполняемых полей.</p>
<p>Сейчас хочу остановиться конкретно на блоке данных с почтовым адресом. Обычно это адрес доставки, но также это может быть адресом плательщика и отличаться от адреса доставки. Платит один человек, получает другой или как-то так. Не важно.</p>
<p>Здесь также пользователь должен с минимумом усилий указать максимум полезной информации. Во всех скриптах обычно заполняются такие поля:</p>
<ol>
<li>Почтовый индекс</li>
<li>Страна</li>
<li>Регион, штат или другая территориальная единица (если есть)</li>
<li>Город</li>
<li>улица, дом, квартира и т.д.</li>
</ol>
<p>Для крупных городов, например, для Москвы или Санкт-Петербурга можно дополнительно спросить ближайшую станцию метро. В Webasyst Shop-Script это реализуется дополнительным полем.</p>
<p>Применительно к России возникает вопрос к 3-му пункту, у нас весьма пестрое административное деление. Самое простое — воспользоваться <a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4%D1%8B_%D1%81%D1%83%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B9_%D0%A4%D0%B5%D0%B4%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8" target="_blank">списком кодов субъектов РФ</a> из Википедии. Но тут надо иметь в виду, что некоторые субъекты могут входить в состав других — <a href="http://ru.wikipedia.org/wiki/%D0%A4%D0%B5%D0%B4%D0%B5%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8#.D0.A2.D0.B8.D0.BF.D1.8B_.D1.81.D1.83.D0.B1.D1.8A.D0.B5.D0.BA.D1.82.D0.BE.D0.B2_.D0.A0.D0.BE.D1.81.D1.81.D0.B8.D0.B9.D1.81.D0.BA.D0.BE.D0.B9_.D0.A4.D0.B5.D0.B4.D0.B5.D1.80.D0.B0.D1.86.D0.B8.D0.B8" target="_blank">автономные округа могут входить в состав краев и областей</a>. Большинство реализаций скриптов этого не предусматривают, а зря. <em><strong>Деление на регионы должно быть не плоским списком а древовидным!</strong></em>. Стоп, не надо бежать срочно добавлять поле &#171;parent_id&#187; в существующую базу. Надо сначала погуглить на тему <em>nested sets</em> и проникнуться.</p>
<p>При этом регион «Москва» не идентичен городу Москва. При заполнении списка регионов об этом тоже надо помнить, Зеленоград также входит в состав Москвы, а доставка туда, как правило, отличается ценой.</p>
<p>Также имеет смысл хранить список наиболее крупных населенных пунктов каждого региона, чтобы пользователь мог выбрать город из списка или написать, если в списке нет нужного населенного пункта. Минимум опечаток — максимум точности при определении стоимости доставки.</p>
<p><strong>Update</strong>. Раз уж речь зашла о древовидном хранении, то список страны-регионы_(области, края и т.д.) можно хранить в единой таблице. В ней корневыми элементами или элементами первого уровня (корень тогда будет &#171;World&#187; :) ) будут страны. Для классификации можно воспользоваться <a href="http://ru.wikipedia.org/wiki/ISO_3166" target="_blank">стандартом ISO 3166</a> и его подразделами относительно административных единиц.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/ORrmXD22gesEAdGib3mjZbY85J0/0/da"><img src="http://feedads.g.doubleclick.net/~a/ORrmXD22gesEAdGib3mjZbY85J0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/ORrmXD22gesEAdGib3mjZbY85J0/1/da"><img src="http://feedads.g.doubleclick.net/~a/ORrmXD22gesEAdGib3mjZbY85J0/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=V6J5iZ3YRqQ:fQSeu46-kWw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=V6J5iZ3YRqQ:fQSeu46-kWw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=V6J5iZ3YRqQ:fQSeu46-kWw:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=V6J5iZ3YRqQ:fQSeu46-kWw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=V6J5iZ3YRqQ:fQSeu46-kWw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=V6J5iZ3YRqQ:fQSeu46-kWw:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/V6J5iZ3YRqQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2010/09/street-addresses/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Множественные уязвимости Shop-Script</title>
		<link>http://www.handmadesite.net/2010/06/mnozhestvennyie-uyazvimosti-shop-script/</link>
		<comments>http://www.handmadesite.net/2010/06/mnozhestvennyie-uyazvimosti-shop-script/#comments</comments>
		<pubDate>Mon, 14 Jun 2010 10:27:37 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[Shop-Script]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=365</guid>
		<description><![CDATA[По привычке, время от времени, просматриваю сообщения об уязвимости скрипта Shop-Script. Компания Артикус, автор этого скрипта, уже давно перестала его поддерживать и продает теперь новую версию, более навороченную и красивую. Тем не менее этот скрипт разошелся по сети в миллионах копий, как легальных, так и нелегальных. А также породил великое множество продолжений и улучшений. Поэтому [...]]]></description>
			<content:encoded><![CDATA[<p>По привычке, время от времени, просматриваю сообщения об уязвимости скрипта Shop-Script. <a href="http://www.articus.ru/" target="_blank">Компания Артикус</a>, автор этого скрипта, уже давно перестала его поддерживать и продает теперь новую версию, более навороченную и красивую. Тем не менее этот скрипт разошелся по сети в миллионах копий, как легальных, так и нелегальных. А также породил великое множество продолжений и улучшений. Поэтому обнаруженный мною отчет, несмотря на то, что ему уже 2 месяца, будет интересен многим.</p>
<p>В отчете рассматривался Shop-Script Free &#8212; это как раз бесплатная версия того, что ходит по интернету огромным тиражом. На Free версии основана <a href="http://lego.piconline.ru/" target="_blank">наиболее цельная и популярная доработка под названием &#171;Shop-Script Free Lego Edition&#187;</a>.</p>
<p>Вывод неутешительный. На 14 апреля в скрипте имелось <a href="http://www.vupen.com/english/advisories/2010/0882" target="_blank">27 уязвимостей, позволяющих атакующему получить доступ к базе данных, манипулировать данными и скомпрометировать систему</a>.</p>
<p>В частности ошибки, позволяющие выполнять команды SQL, в обработке параметров, передаваемых в скрипт: (1) add2cart, (2) c_id, (3) categoryID, (4)  list_price, (5) name, (6) new_offer, (7) price, (8) product_code, (9)  productID, (10) rating, and (11) save_product. <a href="http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2010-1463" target="_blank">Пруфлинк</a>.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/aBh9iXyZ9zndI2zFSYRmkK4jUTQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/aBh9iXyZ9zndI2zFSYRmkK4jUTQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/aBh9iXyZ9zndI2zFSYRmkK4jUTQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/aBh9iXyZ9zndI2zFSYRmkK4jUTQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=DgmyzXKyEUo:6kJfwUYaPac:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=DgmyzXKyEUo:6kJfwUYaPac:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=DgmyzXKyEUo:6kJfwUYaPac:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=DgmyzXKyEUo:6kJfwUYaPac:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=DgmyzXKyEUo:6kJfwUYaPac:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=DgmyzXKyEUo:6kJfwUYaPac:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/DgmyzXKyEUo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2010/06/mnozhestvennyie-uyazvimosti-shop-script/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Тот же контент, только в профиль</title>
		<link>http://www.handmadesite.net/2010/04/tot-zhe-kontent-tolko-v-profil/</link>
		<comments>http://www.handmadesite.net/2010/04/tot-zhe-kontent-tolko-v-profil/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 11:18:55 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[Поисковики]]></category>
		<category><![CDATA[canonical]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[link]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=354</guid>
		<description><![CDATA[Давно думал над проблемой одинаковых страниц. Ну, почти одинаковых &#8212; где один и тот же контент по-разному представлен. Обычно это индексные страницы, типа прайслистов, списков статей, постов или чего-то такого. На большинстве таких страниц есть возможность получить список, скажем, отсортированный по каком-либо критерию &#8212; цене, дате публикации и т.д. Таким образом на сайте получаются фактически [...]]]></description>
			<content:encoded><![CDATA[<p>Давно думал над проблемой одинаковых страниц. Ну, почти одинаковых &#8212; где один и тот же контент по-разному представлен. Обычно это индексные страницы, типа прайслистов, списков статей, постов или чего-то такого. На большинстве таких страниц есть возможность получить список, скажем, отсортированный по каком-либо критерию &#8212; цене, дате публикации и т.д. Таким образом на сайте получаются фактически одинаковые страницы, с одним и те-же или похожим содержанием, но разными URL. Например с сортировкой по-умолчанию, по цене и по названию:</p>
<pre>http://www.example.com/products/prices

http://www.example.com/products/prices/index/order:price

http://www.example.com/products/prices/index/order:title
</pre>
<p>Мне кажется, что поисковому роботу такое может и не понравится, уж больно это смахивает на попытку заспамить поисковик. Я раздумывал о том, что,наверное, такие страницы, в URL которых указаны подобные параметры неплохо бы, наверное, закрывать от индексирования. Обычными директивами meta в заголовке страницы.<span id="more-354"></span></p>
<p>Поскольку никаких санкций в отношении таких страниц от поисковиков не наблюдалось, все эти раздумья относились к теории, нигде я эту идею не применял. Просто держал в голове, что, когда буду менять в коде надо позаботиться и об этом вопросе. Не профиту ради, а для чистоты веба вообще :)</p>
<p>Совсем небольшая заковыка в разрезе CakePHP состояла в том, что для кейка без разницы URL http://www.example.com/products/prices и http://www.example.com/products/prices/index &#8212; надо было бы как-то эту ситуацию обрабатывать.</p>
<p>Совсем недавно наткнулся на решение этой <a href="http://www.google.com/support/blogger/bin/answer.py?hl=ru&amp;answer=139394" target="_blank">проблемы &#171;похожих страниц&#187; в гугловской документации к платформе Blogger</a>. Не совсем понятно, почему они именно там это разместили, поскольку это было бы полезно всем владельцам сайтов, а не только авторам блогов на платформе Blogger.</p>
<p>Оказывается Google отлично понимает атрибут rel=&quot;canonical&quot;. Т.е. в заголовке (в разделе &lt;head&gt;) страниц размещаем элемент:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;link rel=&quot;canonical&quot; href=&quot;http://www.example.com/prices&quot; /&gt;</pre></div></div>

<p>и больше не паримся. В атрибуте href этого элемента указан адрес &#171;основной&#187; (&#171;канонической&#187; в терминах Google) страницы. Поисковик обещает учитывать такие ссылки и стараться выдавать клиентам адрес именно этой страницы.</p>
<p>Ссылка может быть как относительной, так и абсолютной. Но Google рекомендует ставить абсолютную. Можно, кстати, попробовать указать страницу на другом домене &#8212; это тоже не возбраняется.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/-NzhdXC_IaNjUzKy3nFQlqtpqmE/0/da"><img src="http://feedads.g.doubleclick.net/~a/-NzhdXC_IaNjUzKy3nFQlqtpqmE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/-NzhdXC_IaNjUzKy3nFQlqtpqmE/1/da"><img src="http://feedads.g.doubleclick.net/~a/-NzhdXC_IaNjUzKy3nFQlqtpqmE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=dchOzZzdWkg:PNwCoMTuMs8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=dchOzZzdWkg:PNwCoMTuMs8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=dchOzZzdWkg:PNwCoMTuMs8:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=dchOzZzdWkg:PNwCoMTuMs8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=dchOzZzdWkg:PNwCoMTuMs8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=dchOzZzdWkg:PNwCoMTuMs8:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/dchOzZzdWkg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2010/04/tot-zhe-kontent-tolko-v-profil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Список всех-всех контроллеров</title>
		<link>http://www.handmadesite.net/2009/11/all-controllers-of-app/</link>
		<comments>http://www.handmadesite.net/2009/11/all-controllers-of-app/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 10:58:38 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=344</guid>
		<description><![CDATA[Понадобилось мне получить список всех контроллеров приложения, включая контроллеры плагинов. Configure::listObjects, увы, такого не умеет. Этот метод выдает только все контроллеры приложения, но без контроллеров плагинов. Пришлось немного адаптировать метод, предложенный Rob Weaver в гуглогруппе CakePHP. На выходе у моего метода получается объединенный список контроллеров. Основные &#8212; как отдает метод listObjects, а принадлежащие плагинам в [...]]]></description>
			<content:encoded><![CDATA[<p>Понадобилось мне получить список всех контроллеров приложения, включая контроллеры плагинов. Configure::listObjects, увы, такого не умеет. Этот метод выдает только все контроллеры приложения, но без контроллеров плагинов. Пришлось немного адаптировать метод, <a href="http://groups.google.com/group/cake-php/browse_thread/thread/ba66cb8ff0d60957/0f7a7d48ac988c32?lnk=gst&amp;q=listobjects+plugin+controller#0f7a7d48ac988c32" target="_blank">предложенный</a> <a href="http://groups.google.com/groups/profile?enc_user=aYwLfxIAAAAlIZ7IWf4E4HkoLpEPQXFa8rhlH0Pnl47z4AZhN98BFg" target="_blank">Rob Weaver</a> в <a href="http://groups.google.com/group/cake-php" target="_blank">гуглогруппе CakePHP</a>. На выходе у моего метода получается объединенный список контроллеров. Основные &#8212; как отдает метод listObjects, а принадлежащие плагинам в виде &#171;Plugin.Controller&#187;. Можно их поочередно скармливать сразу в App::import. Разве что выбрость те, названия которых на &#171;App&#187; заканчивается, если они не нужны. Будете загружать, помните, что <a href="http://www.handmadesite.net/2009/11/loding-controllers/">класс &#171;Controller&#187; уже должен быть загружен</a>.</p>
<p><span id="more-344"></span>
<p><strong>Update.</strong> Метод Folder::findRecursive возвращал слишком много файлов, в том числе и ненужных. Переписал немного, теперь опрашиваем только директорию с плагином и его контроллерами.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #009933; font-style: italic;">/**
 * Lists the names of controllers including plugin controllers
 * 
 * @return array
 */</span>
static <span style="color: #000000; font-weight: bold;">function</span> listControllers<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    App<span style="color: #339933;">::</span><span style="color: #004000;">import</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Core'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'File'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Folder'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$controllers</span> <span style="color: #339933;">=</span> Configure<span style="color: #339933;">::</span><span style="color: #004000;">listObjects</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'controller'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> Configure<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">pluginPaths</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$pluginPath</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$folder</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Folder<span style="color: #009900;">&#40;</span><span style="color: #000088;">$pluginPath</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_dirs</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$folder</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_dirs</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$plugin_dir</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$pluginName</span> <span style="color: #339933;">=</span> Inflector<span style="color: #339933;">::</span><span style="color: #004000;">camelize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_dir</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$folder</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cd</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$pluginPath</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$plugin_dir</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$controllerFiles</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$folder</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'.*_controller\.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$folder</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cd</span><span style="color: #009900;">&#40;</span>Folder<span style="color: #339933;">::</span><span style="color: #004000;">addPathElement</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$folder</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">path</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'controllers'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$controllerFiles</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$controllerFiles</span><span style="color: #339933;">,</span><span style="color: #000088;">$folder</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'.*_controller\.php'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$controllerFiles</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">basename</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #000088;">$controllers</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$pluginName</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'.'</span> <span style="color: #339933;">.</span>
                    Inflector<span style="color: #339933;">::</span><span style="color: #004000;">camelize</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span>
                    <span style="color: #990000;">strlen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_controller.php'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$controllers</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<p><a href="http://feedads.g.doubleclick.net/~a/zEnxfUMLMf8Tgyon2SJlVvWhTYE/0/da"><img src="http://feedads.g.doubleclick.net/~a/zEnxfUMLMf8Tgyon2SJlVvWhTYE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/zEnxfUMLMf8Tgyon2SJlVvWhTYE/1/da"><img src="http://feedads.g.doubleclick.net/~a/zEnxfUMLMf8Tgyon2SJlVvWhTYE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=hS65vaP9ZLU:YfavyuIKskU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=hS65vaP9ZLU:YfavyuIKskU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=hS65vaP9ZLU:YfavyuIKskU:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=hS65vaP9ZLU:YfavyuIKskU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=hS65vaP9ZLU:YfavyuIKskU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=hS65vaP9ZLU:YfavyuIKskU:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/hS65vaP9ZLU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2009/11/all-controllers-of-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Попробуем почитать между строк</title>
		<link>http://www.handmadesite.net/2009/11/lets-try-to-read-between-lines/</link>
		<comments>http://www.handmadesite.net/2009/11/lets-try-to-read-between-lines/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 17:22:03 +0000</pubDate>
		<dc:creator>Сергей</dc:creator>
				<category><![CDATA[Поисковики]]></category>
		<category><![CDATA[yandex]]></category>

		<guid isPermaLink="false">http://www.handmadesite.net/?p=337</guid>
		<description><![CDATA[Очередное интервью с представителями Яндекса, на этот раз на Roem.Ru. Никаких особенных откровений, конечно, нет. Что же вы хотели, чтоб яндексоиды всем бесплатно раздали рекомендации, как выбраться на первое место в выдаче по любому запросу? Но все-таки что-то надо говорить и из обтекаемых формулировок можно выстраивать разные забавные предположения. Лично я не завсегдатай SEO-форумов, возможно, [...]]]></description>
			<content:encoded><![CDATA[<p>Очередное <a href="http://roem.ru/2009/11/23/shestnadtsat_voprosov_yandexu/" target="_blank">интервью с представителями Яндекса</a>, на этот раз на Roem.Ru. Никаких особенных откровений, конечно, нет. Что же вы хотели, чтоб яндексоиды всем бесплатно раздали рекомендации, как выбраться на первое место в выдаче по любому запросу? Но все-таки что-то надо говорить и из обтекаемых формулировок можно выстраивать разные забавные предположения. Лично я не завсегдатай SEO-форумов, возможно, все это уже где-то обсуждалось &#8212; если баян, извините.<span id="more-337"></span></p>
<p><strong>Сегалович</strong>:</p>
<blockquote><p>Ровно в этих рамках (борьба с «глупостью») мы относительно недавно реализовали алгоритм определения запросов и ответов, которые можно трактовать двояко: и как поиск эротического и порнографического содержания, и как невинный информационный запрос. Например, запрос [девочки] может быть поиском повести Людмилы Улицкой, а вовсе не «девочек по вызову». Для человека, ищущего Улицкую, ответ с порнографией не просто нерелевантен, он «явная глупость».</p>
<p>Опираясь на классификаторы запросов и сайтов по порнографическому и непорнографическому содержанию, и построив соответствующие метрики, отражающие долю резко нерелевантного поведения нашей системы по «двояким» запросам, мы смогли реализовать механизм понижения в выдаче сайтов порнографического содержания.</p></blockquote>
<p>Было бы логично, если бы Яндекс подсовывал разным посетителям разные варианты выдачи, основываясь на данных предыдущих запросов, статистики из Метрики и т.д. Не специально для каждого пользователя, а для каких-то условных групп, типа &#171;любитель клубнички&#187;, &#171;книжный червь&#187; или каких-то таких. А что? Статистика по запросам есть, статистика посещенных сайтов и проведенного на них времени &#8212; то же (Метрика, различные кнопки ТИЦ, блогов и т.д.) &#8212; нарисовать схему интересов пользователя можно. И потом соотнести с какой-то своей внутренней классификацией. А вот слова о том, что ответ не подвергается модификации &#8212; это, возможно, и временно. На паре &#171;порно/непорно&#187; алгоритм просто обкатывается.</p>
<p>Если Яндекс все-таки реализует модификацию выдачи в зависимости от вычесленных предпочтений пользователя &#8212; вот будет головная боль оптимизаторам! Почистил куки, походил по сайтам с пластиковыми окнами &#8212; получи выдачи про строительство и остекление балконов, почистил куки, походил по сайтам с программным обеспечением &#8212; получи выдачу про Windows. И все в ответ на один и тот же запрос &#171;окошки&#187;.</p>
<p><strong>Сегалович</strong>:</p>
<blockquote><p>по ряду запросов мы мониторим выдачу других поисковых машин, всех, кто хоть как-то ищет по-русски, включая все версии самого Яндекса &#8212; рабочую версию и внутренние, экспериментальные (у Яндекса много версий). И складываем все результаты в один котел. Если какой-то сайт присутствует в этом «котле», если он там имеет достаточно хорошие оценки, и при этом отсутствует в Яндексе, мы начинаем разбираться – почему</p></blockquote>
<p><strong>Садовский</strong>:</p>
<blockquote><p>Чтобы было понятно, «котел» какого объема оценивается, подчеркну, что это речь идет о десятках тысяч запросов, которые мы проверяем таким образом. Мы проверяем первые 30 позиций по каждому запросу. Считайте: десятки тысяч запросов, умножить на 30 первых позиций, умножить на количество версий, &#8212; это десятки миллионов URL.</p></blockquote>
<p>Мониторят конкурентов. Очевидно, Google, Bing и Рамблер. Наверное и Yahoo. Об остальных можно только догадываться. Составляют множество сайтов, попадающих в выдачу всех или бОльшей части конкурентов. Потом сравнивают со своими результатами. Конкретная позиция, наверное, не очень важна &#8212; главное присутствие в первых 30-ти результатах. Смотрят, какие сайты попали к ним &#8212; если различие сильное, это повод задуматься. Т.е. если после получения результатов от конкурентов оказывается, например, что 22 сайта присутствуют у всех, а у Яндекса только 5 из этих сайтов &#8212; это повод побеспокоиться.</p>
<p>Сразу возникает интересная идея &#8212; путь к первой странице выдачи Яндекса может лежать и через результаты выдачи его конкурентов.</p>
<p><strong>Сегалович</strong>:</p>
<blockquote><p>Так вот, практически все обращения в службу техподдержки &#8212; я думаю, в цифрах это будет более 90% &#8212; касаются именно таких сайтов из «серой зоны». Пишут грамотные аргументированные письма: «А вот смотрите, почему вы этот сайт выбросили, он качественный, контент уникальный, ссылки по теме. Объясните почему.» Цель таких писем – методом перебора уточнить безопасные границы в этой «серой зоне». Предприняли какое-то действие – смотрят результат. Если результат отрицательный, сайт попал под санкции, они пытаются получить от нас обратную связь, проанализировать причины.</p></blockquote>
<p><strong>Певцов</strong>:</p>
<blockquote><p>&#8230;как показывает практика, большинство сайтов, по поводу отсутствия которых в выдаче к нам обращаюся вебмастера, создавались специально с целью обмана поисковой системы и манипуляции результатами поиска&#8230;</p></blockquote>
<p><strong>Садовский</strong>:</p>
<blockquote><p>Я хочу заметить, что если мы видим, что имела место ошибка с нашей стороны, то в алгоритмы вносятся изменения, улучшающие работу системы в целом, и это касается других сайтов, которые тоже могли бы пострадать в аналогичной ситуации.</p></blockquote>
<p>Ну все уже догадались? Жаловаться на то, что сайт выпал из индекса, хотя соответствует &#171;техническим параметрам&#187; &#8212; ссылки, качество контента и т.д. &#8212; не надо. Ищите другую аргументацию. Вам же не робот отвечает, человек. И он понимает, что вебмастер беспокоящийся о технической стороне вопроса &#8212; не их союзник. И еще. Удалось убедить, что &#171;сателлит&#187; белый и пушистый? Будьте готовы к тому, что из под санкций могут выползти и &#171;сателлиты&#187; конкурентов. Любите жаловаться на &#171;сателлиты&#187; конкурентов, присутствующие в выдаче? Будьте готовы к тому, что вместе с ними пойдут ко дну и ваши такие-же.</p>
<p><strong>Певцов</strong>:</p>
<blockquote><p>уникальность контента совсем не определяющая вещь. О ней много говорят, но более важная характеристика &#8212; не уникальность, а полезность контента <em>[и далее по тексту]</em></p></blockquote>
<p>&#171;У вас на сайте неуникальный текст! Ужас-ужас-ужас!&#187; &#8212; страшилка. То есть, если скопировать все подряд, санкции будут. Но умеренное разбавление своих статей статьями, взятыми из других источников, может не повлечь никаких санкций. Таким образом, если где-то в интернетах нашлась удачная статья, подходящая сайту и автор не против ее распространения, можно спокойно скопировать ее к себе или процитировать. Ссылка на оригинал, как мне кажется, в данном случае будет лишним подтверждением &#171;добрых намерений&#187;.</p>
<p>Четвертая часть о воровстве контента. Авторам стОит отдавать свои статьи в RSS. Не жмотитесь, отдавайте всю статью. Роботы, сканирующие блогосферу быстрее и чаще забирают контент. Если статья у кого-то скопирована, не надо расстраиваться, страница с этим текстом не первая в выдаче. Еще не факт, что посетителя заинтересует первый сайт. 2-5 место тоже хороши. И до конца первой страницы &#8212; нормально. Кроме того, скопированная страница может придать общий тематический вес сайту, подняв его по другим, похожим, низкочастотным запросам.</p>
<p>Торговля и обмен ссылками яндексоидов раздражают. Но, если уж они научились находить &#171;продажные ссылки&#187;, то зачем банить всю страницу, она может оказаться вполне нормальной, а ссылки &#8212; результатом баловства наемного вебмастера. Ну неучитывали-бы тихонько эти самые ссылки молча. Дятлы бы продолжали бы заниматься бесполезным трудом и не искали бы каких-то иных методов воздействия на поисковик.</p>
<p>Ну вот как-то вот так. Спасибо, что дочитали до конца. :)</p>

<p><a href="http://feedads.g.doubleclick.net/~a/4kJF2S5ZAwIGebbHF4hzgwGrrrQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/4kJF2S5ZAwIGebbHF4hzgwGrrrQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/4kJF2S5ZAwIGebbHF4hzgwGrrrQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/4kJF2S5ZAwIGebbHF4hzgwGrrrQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/handmadesite?a=qYOr9YbFdyM:Jd4zxGrtZ_I:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=qYOr9YbFdyM:Jd4zxGrtZ_I:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=qYOr9YbFdyM:Jd4zxGrtZ_I:I9og5sOYxJI"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=I9og5sOYxJI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=qYOr9YbFdyM:Jd4zxGrtZ_I:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/handmadesite?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/handmadesite?a=qYOr9YbFdyM:Jd4zxGrtZ_I:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/handmadesite?i=qYOr9YbFdyM:Jd4zxGrtZ_I:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/handmadesite/~4/qYOr9YbFdyM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.handmadesite.net/2009/11/lets-try-to-read-between-lines/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

