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

<channel>
	<title>Ars Longa, Vita Brevis &#187; советы</title>
	<atom:link href="http://blog.sjinks.pro/tag/tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Особенности работы функции checkdnsrr()</title>
		<link>http://blog.sjinks.pro/php/825-checkdnsrr-undocumented-features/</link>
		<comments>http://blog.sjinks.pro/php/825-checkdnsrr-undocumented-features/#comments</comments>
		<pubDate>Fri, 24 Sep 2010 12:49:56 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=825</guid>
		<description><![CDATA[Иногда «Да» означает «Нет» Функция checkdnsrr() используется для проверки существования записей DNS. Например, фреймворк Kohana использует эту функцию для проверки наличия MX-записи домена, указанного в адресе электронной почты. Тем не менее, существуют некоторые подводные камни, связанные с использованием данной функции, о которых разработчикам нужно знать. В Linux есть магический файл — /etc/resolv.conf; он отвечает за конфигурацию резолвера [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/php/825-checkdnsrr-undocumented-features/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Иногда «Да» означает «Нет»</em></h2>
<p>Функция <a href="http://php.net/manual/en/function.checkdnsrr.php"><code>checkdnsrr()</code></a> используется для проверки существования записей <a href="http://blog.sjinks.pro/tag/dns/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  DNS">DNS</a>. Например, фреймворк Kohana использует эту функцию для проверки наличия MX-записи домена, указанного в адресе электронной почты.</p>
<p>Тем не менее, существуют некоторые подводные камни, связанные с использованием данной функции, о которых разработчикам нужно знать.<span id="more-825"></span></p>
<p>В <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> есть магический файл — <a href="http://linux.die.net/man/5/resolv.conf"><code>/etc/resolv.conf</code></a>; он отвечает за конфигурацию <dfn>резолвера</dfn> (набор функций в библиотеке C, предоставляющих доступ к Internet DNS).</p>
<p>В этом файле может быть задан параметр <code>search</code>, в котором задаётся список дополнительных доменов для поиска (обычно локальное имя домена).</p>
<p>Этот параметр может оказывать очень сильное влияние на результат, возвращаемый <code>checkdnsrr()</code>. Например, при поиске записи типа A для несуществующего домена <code>checkdnsrr()</code> вернёт 0:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8254">
        <div class="code bash" id="p825code4">
$ php <span class="re5">-r</span> <span class="st_h">'echo (int)checkdnsrr(&quot;x.y&quot;, &quot;A&quot;), &quot;\n&quot;;'</span><br />
<span class="nu0">0</span>
        </div>
    </div>
</div>

<p>Но если вдруг в <code>/etc/resolv.conf</code> задан параметр <code>search</code>, то результат уже не так однозначен. Например, если имеется запись</p>
<p><code>search example.com</code></p>
<p>то алгоритм поиска будет таким:</p>
<ol>
<li>Сначала система будет пытаться найти запись A для несуществующего домена <code>x.y</code>;</li>
<li>Так как домен с таким именем не существует, система будет пробовать суффиксы, перечисленные в параметре <code>search</code>. В нашем случае система будет искать домен <code>x.y.example.com</code></li>
</ol>
<p>Если у домена <code>example.com</code> есть wildcard-запись типа A (<code>*.example.com. IN A 1.2.3.4</code>), то <code>checkdnsrr()</code> вернёт <code>true</code> — хотя это и не тот результат, который ожидается.</p>
<p>С проверкой MX-записей может возникнуть такая же ситуация: например, если имеются такие записи DNS:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8255">
        <div class="code text" id="p825code5">
*.example.com. IN CNAME example.com.<br />
example.com. &nbsp; IN MX 10 mail.example.com.
        </div>
    </div>
</div>

<p>В этом случае при наличии <code>search example.com</code> в <code>/etc/resolv.conf</code> <code>checkdnsrr()</code> будет возвращать <code>true</code> для любых доменов.</p>
<p>Из приведённого примера видим, что положительный результат может быть на самом деле ложноположительным, что на самом деле очень плохо. Тем не менее, есть очень простой способ, позволяющий решить проблему — добавлять точку в конец доменного имени:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8256">
        <div class="code php" id="p825code6">
<span class="re0">$result</span> <span class="sy0">=</span> <span class="kw3">checkdnsrr</span><span class="br0">&#40;</span><span class="st0">&quot;x.y.&quot;</span><span class="sy0">,</span> <span class="st0">&quot;A&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>В этом случае над именем не будет проводиться никаких манипуляций, и результат будет не таким неопределённым <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/php/825-checkdnsrr-undocumented-features/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/php/825-checkdnsrr-undocumented-features/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux: экстренная перезагрузка сервера</title>
		<link>http://blog.sjinks.pro/administering/586-linux-force-reboot-shutdown/</link>
		<comments>http://blog.sjinks.pro/administering/586-linux-force-reboot-shutdown/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 20:08:37 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=586</guid>
		<description><![CDATA[Перезагрузка системы двумя командами echo Иногда случаются ситуации (поменьше бы их таких), когда из-за какой-нибудь ошибки оборудования или повреждения файловой системы операционная система входит в ступор и не может прочитать ничего с диска. Систему нужно перезагружать, но система не может прочитать /sbin/reboot, а техническая поддержка тупит (не могу не передать привет техперсоналу HiVelocity.net). В этом [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/586-linux-force-reboot-shutdown/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Перезагрузка системы двумя командами echo</em></h2>
<p>Иногда случаются ситуации (поменьше бы их таких), когда из-за какой-нибудь ошибки оборудования или повреждения файловой системы операционная система входит в ступор и не может прочитать ничего с диска. Систему нужно перезагружать, но система не может прочитать <span class="codebox"><code class="bash"><span class="sy0">/</span>sbin<span class="sy0">/</span>reboot</code></span>, а техническая поддержка тупит (не могу не передать привет техперсоналу HiVelocity.net).</p>
<p>В этом случае систему можно перезагрузить двумя командами <span class="codebox"><code class="bash"><span class="kw3">echo</span></code></span> (нужны права администратора).<span id="more-586"></span></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5869">
        <div class="code bash" id="p586code9">
<span class="kw3">echo</span> 1 <span class="sy0">&gt;</span> <span class="sy0">/</span>proc<span class="sy0">/</span>sys<span class="sy0">/</span>kernel<span class="sy0">/</span>sysrq<br />
<span class="kw3">echo</span> b <span class="sy0">&gt;</span> <span class="sy0">/</span>proc<span class="sy0">/</span>sysrq-trigger
        </div>
    </div>
</div>

<p>Данная последовательность команд перезагрузит систему, не производя размонтирование файловых систем и сброс буферов на диск. Способ весьма экстремальный, но действенный.</p>
<p>Если требуется безопасная перезагрузка, то нужно выполнить такую последовательность:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58610">
        <div class="code bash" id="p586code10">
<span class="kw3">echo</span> 1 <span class="sy0">&gt;</span> <span class="sy0">/</span>proc<span class="sy0">/</span>sys<span class="sy0">/</span>kernel<span class="sy0">/</span>sysrq<br />
<span class="kw3">echo</span> e <span class="sy0">&gt;</span> <span class="sy0">/</span>proc<span class="sy0">/</span>sysrq-trigger<br />
<span class="kw3">echo</span> i <span class="sy0">&gt;</span> <span class="sy0">/</span>proc<span class="sy0">/</span>sysrq-trigger<br />
<span class="kw3">echo</span> s <span class="sy0">&gt;</span> <span class="sy0">/</span>proc<span class="sy0">/</span>sysrq-trigger<br />
<span class="kw3">echo</span> u <span class="sy0">&gt;</span> <span class="sy0">/</span>proc<span class="sy0">/</span>sysrq-trigger<br />
<span class="kw3">echo</span> b <span class="sy0">&gt;</span> <span class="sy0">/</span>proc<span class="sy0">/</span>sysrq-trigger
        </div>
    </div>
</div>

<p>Построчно:</p>
<ol>
<li>Включение SysRq</li>
<li>Отправление SIGTERM всем процессам, кроме <span class="codebox"><code class="bash">init</code></span></li>
<li>Отправление SIGKILL всем процессам, кроме <span class="codebox"><code class="bash">init</code></span></li>
<li>Сброс всех данных на диск (<span class="codebox"><code class="bash"><span class="kw2">sync</span></code></span>)</li>
<li>Перемонтирование всех файловых систем в режим &laquo;только для чтения&raquo;</li>
<li>Перезагрузка системы</li>
</ol>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/586-linux-force-reboot-shutdown/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/586-linux-force-reboot-shutdown/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Вывод списка страниц с описанием</title>
		<link>http://blog.sjinks.pro/wordpress/550-list-pages-with-descriptions/</link>
		<comments>http://blog.sjinks.pro/wordpress/550-list-pages-with-descriptions/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 20:40:46 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=550</guid>
		<description><![CDATA[Простая альтернатива wp_list_pages() Для вывода подстраниц (иными словами, дочерних страниц текущей страницы) авторы тем очень часто используют такой код (пример взят из OneTheme): &#60;?php $children = wp_list_pages(&#039;title_li=&#38;child_of=&#039;.$post-&#62;ID.&#039;&#38;echo=0&#039;); if ($children) { ?&#62; &#60;ul&#62; &#60;?php echo $children; ?&#62; &#60;/ul&#62; &#60;?php } ?&#62; У wp_list_pages(), на мой взгляд, есть два серьёзных недостатка: Хотя для вывода информации нужны всего [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/550-list-pages-with-descriptions/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Простая альтернатива wp_list_pages()</em></h2>
<p>Для вывода подстраниц (иными словами, дочерних страниц текущей страницы) авторы тем очень часто используют такой код (пример взят из OneTheme):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p55014">
        <div class="code php" id="p550code14">
<span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; <span class="re0">$children</span> <span class="sy0">=</span> wp_list_pages<span class="br0">&#40;</span><span class="st_h">'title_li=&amp;child_of='</span><span class="sy0">.</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="sy0">.</span><span class="st_h">'&amp;echo=0'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$children</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="sy1">?&gt;</span><br />
&nbsp; &nbsp; <span class="sy0">&lt;</span>ul<span class="sy0">&gt;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">&lt;?php</span> <span class="kw1">echo</span> <span class="re0">$children</span><span class="sy0">;</span> <span class="sy1">?&gt;</span><br />
&nbsp; &nbsp; <span class="sy0">&lt;/</span>ul<span class="sy0">&gt;</span><br />
<span class="kw2">&lt;?php</span> <span class="br0">&#125;</span> <span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>У <span class="codebox"><code class="php">wp_list_pages<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>, на мой взгляд, есть два серьёзных недостатка:</p>
<ol>
<li>Хотя для вывода информации нужны всего два поля (<code>ID</code> и <code>post_title</code>), <span class="codebox"><code class="php">wp_list_pages<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> выбирает всю информацию, что ведёт к увеличению трафика между <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> и <a href="http://blog.sjinks.pro/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a> (и, в конечном итоге, сказывается на производительности);</li>
<li>При использовании <span class="codebox"><code class="php">wp_list_pages<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> не получается вывести дополнительную информацию о странице (например, её описание, рейтинг и т.п.).</li>
</ol>
<p><span id="more-550"></span><br />
С первым недостатком разбираются разработчики (если я не ошибаюсь, уже готов патч), а со вторым не всё так просто: функциональность &laquo;зашита&raquo; в класс <code>Walker_Page</code>, не предоставляющий фильтров, с помощью которых можно &laquo;повлиять&raquo; на результат (<code>the_title</code> не в счёт, в нашем случае с ним будет больше проблем, чем пользы). Так что если нужна дополнительная функциональность, придётся писать свою функцию (или класс).</p>
<p>Пример функции, выводящей список страниц с описаниями (как <a href="http://www.playguitarblog.com/guitar-lesson-video/">здесь</a>; своеобразная интеграция с All in One SEO Pack):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p55015">
        <div class="code php" id="p550code15">
<span class="kw2">function</span> render_items_recursive<span class="br0">&#40;</span><span class="sy0">&amp;</span><span class="re0">$pages</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st_h">'&lt;ul&gt;'</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$pages</span> <span class="kw1">as</span> <span class="re0">$x</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;&lt;li class='page_item page-item-<span class="es4">{$x-&gt;ID}</span>'&gt;&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st_h">'&lt;a href=&quot;'</span> <span class="sy0">.</span> get_page_link<span class="br0">&#40;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&quot; title=&quot;'</span> <span class="sy0">.</span> attribute_escape<span class="br0">&#40;</span>apply_filters<span class="br0">&#40;</span><span class="st_h">'the_title'</span><span class="sy0">,</span> <span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">post_title</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&quot;&gt;'</span> <span class="sy0">.</span> apply_filters<span class="br0">&#40;</span><span class="st_h">'the_title'</span><span class="sy0">,</span> <span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">post_title</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;/a&gt; '</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st_h">'&lt;span class=&quot;description&quot;&gt;'</span> <span class="sy0">.</span> get_post_meta<span class="br0">&#40;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="sy0">,</span> <span class="st_h">'description'</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'&lt;/span&gt;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">children</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; render_items_recursive<span class="br0">&#40;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">children</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st_h">'&lt;/li&gt;'</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st_h">'&lt;/ul&gt;'</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> list_pages_with_description<span class="br0">&#40;</span><span class="re0">$parent</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$p</span> <span class="sy0">=</span> <span class="sy0">&amp;</span>get_pages<span class="br0">&#40;</span><span class="st_h">'sort_column=menu_order,post_title&amp;child_of='</span> <span class="sy0">.</span> <span class="re0">$parent</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">true</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$p</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="re0">$pages</span> <span class="sy0">=</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$map</span> &nbsp; <span class="sy0">=</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$item</span> &nbsp;<span class="sy0">=</span> <span class="kw4">null</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$p</span> <span class="kw1">as</span> <span class="re0">$x</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">unset</span><span class="br0">&#40;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">post_content</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$parent</span> <span class="sy0">==</span> <span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">post_parent</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pages</span><span class="br0">&#91;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$x</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$map</span><span class="br0">&#91;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#93;</span> &nbsp; <span class="sy0">=</span> <span class="sy0">&amp;</span><span class="re0">$pages</span><span class="br0">&#91;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$item</span> <span class="sy0">=</span> <span class="sy0">&amp;</span><span class="re0">$map</span><span class="br0">&#91;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">post_parent</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">children</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$x</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$map</span><span class="br0">&#91;</span><span class="re0">$x</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#93;</span> &nbsp; &nbsp; &nbsp;<span class="sy0">=</span> <span class="sy0">&amp;</span><span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">children</span><span class="br0">&#91;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$item</span><span class="sy0">-&gt;</span><span class="me1">children</span><span class="br0">&#41;</span><span class="sy0">-</span>1<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">unset</span><span class="br0">&#40;</span><span class="re0">$map</span><span class="sy0">,</span> <span class="re0">$item</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; render_items_recursive<span class="br0">&#40;</span><span class="re0">$pages</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$s</span> <span class="sy0">=</span> <span class="kw3">ob_get_contents</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">ob_end_clean</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$s</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Вызывается так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p55016">
        <div class="code php" id="p550code16">
<span class="kw2">&lt;?php</span> <span class="re0">$children</span> <span class="sy0">=</span> list_pages_with_description<span class="br0">&#40;</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span><br />
<span class="kw2">&lt;?php</span> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$children</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="sy1">?&gt;</span><br />
&nbsp; &nbsp; <span class="kw2">&lt;?php</span> <span class="kw1">print</span> <span class="re0">$children</span><span class="sy0">;</span> <span class="sy1">?&gt;</span><br />
<span class="kw2">&lt;?php</span> <span class="kw1">endif</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>А выглядеть всё будет так, как по ссылке выше. Поддерживается неограниченный уровень вложенности. В PHP4 из-за проблем с организацией ссылок работать, скорее всего, не будет.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/550-list-pages-with-descriptions/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/550-list-pages-with-descriptions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Простой способ генерирования паролей в Bash</title>
		<link>http://blog.sjinks.pro/linux/516-password-generation-in-bash/</link>
		<comments>http://blog.sjinks.pro/linux/516-password-generation-in-bash/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 03:20:50 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=516</guid>
		<description><![CDATA[Генерация пароля без использования Perl CHARS=&#34;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&#38;*()-_=+\\&#124;/&#34; LENGTH=&#34;8&#34; while [ &#34;${n:=1}&#34; -le &#34;$LENGTH&#34; ] ; do PASSWORD=&#34;$PASSWORD${CHARS:$(($RANDOM%${#CHARS})):1}&#34; let n+=1 done И на закуску немного экзотики: LENGTH=10 base64 -w $LENGTH /dev/urandom &#124; head -n 1 © 2012 Ars Longa, Vita Brevis. Все права защищены. Перепубликация материалов без разрешения автора запрещена. При использовании материалов блога наличие активной не [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/516-password-generation-in-bash/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Генерация пароля без использования Perl</em></h2>
          
<div class="codebox">
    <div class="the_code" style="" id="p51619">
        <div class="code bash" id="p516code19">
<span class="re2">CHARS</span>=<span class="st0">&quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$%^&amp;*()-_=+\\|/&quot;</span><br />
<span class="re2">LENGTH</span>=<span class="st0">&quot;8&quot;</span><br />
<span class="kw1">while</span> <span class="br0">&#91;</span> <span class="st0">&quot;<span class="es3">${n:=1}</span>&quot;</span> <span class="re5">-le</span> <span class="st0">&quot;<span class="es2">$LENGTH</span>&quot;</span> <span class="br0">&#93;</span> ; <span class="kw1">do</span><br />
&nbsp; &nbsp; <span class="re2">PASSWORD</span>=<span class="st0">&quot;<span class="es2">$PASSWORD</span><span class="es3">${CHARS:$(($RANDOM%${#CHARS}</span>)):1}&quot;</span><br />
&nbsp; &nbsp; <span class="kw3">let</span> n+=1<br />
<span class="kw1">done</span>
        </div>
    </div>
</div>

<p><span id="more-516"></span><br />
И на закуску немного экзотики:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p51620">
        <div class="code bash" id="p516code20">
<span class="re2">LENGTH</span>=10<br />
base64 <span class="re5">-w</span> <span class="re1">$LENGTH</span> <span class="sy0">/</span>dev<span class="sy0">/</span>urandom <span class="sy0">|</span> <span class="kw2">head</span> <span class="re5">-n</span> <span class="nu0">1</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/linux/516-password-generation-in-bash/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/516-password-generation-in-bash/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Мысли на тему массового UPDATE в MySQL</title>
		<link>http://blog.sjinks.pro/mysql/487-on-bulk-update-in-mysql/</link>
		<comments>http://blog.sjinks.pro/mysql/487-on-bulk-update-in-mysql/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 08:24:16 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=487</guid>
		<description><![CDATA[Оказывается, это возможно! INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9) ON DUPLICATE KEY UPDATE `b`=VALUES(`b`), `c`=VALUES(`c`); Например, для WordPress (при условии, что пара (user_id, meta_key) является уникальным ключом): INSERT INTO `wp_usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES (1, &#039;key1&#039;, &#039;value1&#039;), (1, &#039;key2&#039;, &#039;value2&#039;), (1, &#039;key3&#039;, &#039;value3&#039;), (1, &#039;key4&#039;, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/mysql/487-on-bulk-update-in-mysql/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Оказывается, это возможно!</em></h2>
          
<div class="codebox">
    <div class="the_code" style="" id="p48723">
        <div class="code mysql" id="p487code23">
<span class="kw2">INSERT</span> <span class="kw1">INTO</span> <span class="st0">`table`</span> <span class="br0">&#40;</span><span class="st0">`a`</span><span class="sy2">,</span> <span class="st0">`b`</span><span class="sy2">,</span> <span class="st0">`c`</span><span class="br0">&#41;</span> <span class="kw1">VALUES</span><br />
<span class="br0">&#40;</span>1<span class="sy2">,</span> 2<span class="sy2">,</span> 3<span class="br0">&#41;</span><span class="sy2">,</span> <span class="br0">&#40;</span>4<span class="sy2">,</span> 5<span class="sy2">,</span> 6<span class="br0">&#41;</span><span class="sy2">,</span> <span class="br0">&#40;</span>7<span class="sy2">,</span> 8<span class="sy2">,</span> 9<span class="br0">&#41;</span><br />
<span class="kw1">ON</span> <span class="kw1">DUPLICATE KEY</span> <span class="kw1">UPDATE</span> <span class="st0">`b`</span><span class="sy1">=</span><span class="kw1">VALUES</span><span class="br0">&#40;</span><span class="st0">`b`</span><span class="br0">&#41;</span><span class="sy2">,</span> <span class="st0">`c`</span><span class="sy1">=</span><span class="kw1">VALUES</span><span class="br0">&#40;</span><span class="st0">`c`</span><span class="br0">&#41;</span><span class="sy2">;</span>
        </div>
    </div>
</div>

<p>Например, для <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> (при условии, что пара <code>(user_id, meta_key)</code> является уникальным ключом):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p48724">
        <div class="code mysql" id="p487code24">
<span class="kw2">INSERT</span> <span class="kw1">INTO</span> <span class="st0">`wp<span class="es1">_</span>usermeta`</span> <span class="br0">&#40;</span><span class="st0">`user<span class="es1">_</span>id`</span><span class="sy2">,</span> <span class="st0">`meta<span class="es1">_</span>key`</span><span class="sy2">,</span> <span class="st0">`meta<span class="es1">_</span>value`</span><span class="br0">&#41;</span> <span class="kw1">VALUES</span><br />
<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy2">,</span> <span class="st0">'key1'</span><span class="sy2">,</span> <span class="st0">'value1'</span><span class="br0">&#41;</span><span class="sy2">,</span><br />
<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy2">,</span> <span class="st0">'key2'</span><span class="sy2">,</span> <span class="st0">'value2'</span><span class="br0">&#41;</span><span class="sy2">,</span><br />
<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy2">,</span> <span class="st0">'key3'</span><span class="sy2">,</span> <span class="st0">'value3'</span><span class="br0">&#41;</span><span class="sy2">,</span><br />
<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy2">,</span> <span class="st0">'key4'</span><span class="sy2">,</span> <span class="st0">'value4'</span><span class="br0">&#41;</span><span class="sy2">,</span><br />
<span class="br0">&#40;</span><span class="nu0">1</span><span class="sy2">,</span> <span class="st0">'key5'</span><span class="sy2">,</span> <span class="st0">'value5'</span><span class="br0">&#41;</span><br />
<span class="kw1">ON</span> <span class="kw1">DUPLICATE KEY</span> <span class="kw1">UPDATE</span> <span class="st0">`meta<span class="es1">_</span>value`</span><span class="sy1">=</span><span class="kw1">VALUES</span><span class="br0">&#40;</span><span class="st0">`meta<span class="es1">_</span>value`</span><span class="br0">&#41;</span><span class="sy2">;</span>
        </div>
    </div>
</div>

<p><a href="http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html">Должно работать</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/mysql/487-on-bulk-update-in-mysql/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/mysql/487-on-bulk-update-in-mysql/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>WordPress: одновременный логин для HTTP и HTTPS</title>
		<link>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/</link>
		<comments>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 19:09:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[HTTPS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=486</guid>
		<description><![CDATA[Простое решение для POST на SSL URL В WordPress, начиная с версии 2.6, встроена поддержка HTTPS: можно сделать либо HTTPS-логин, либо поместить панель администратора за SSL. Однако, из-за особенностей реализации, когда пользователь входит в систему, он получает cookie либо для HTTP, либо для HTTPS. Иными словами, если пользователь попал на http&#x003A;//example.com/wp-admin/, то при переходе на [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Простое решение для POST на <a href="http://blog.sjinks.pro/tag/ssl/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SSL">SSL</a> URL</em></h2>
<p>В <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, начиная с версии 2.6, встроена поддержка <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>: можно сделать либо <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>-логин, либо поместить панель администратора за SSL. Однако, из-за особенностей реализации, когда пользователь входит в систему, он получает cookie либо для HTTP, либо для <a href="http://blog.sjinks.pro/tag/https/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTTPS">HTTPS</a>. Иными словами, если пользователь попал на <code>http&#x003A;//example.com/wp-admin/</code>, то при переходе на <code>https&#x003A;//example.com/wp-admin/</code> ему придётся входить в систему еще раз.</p>
<p>Всё бы ничего, но если плагин делает POST на HTTPS, то пользователь попадает на wp-login.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a>, который после успешного входа сделает перенаправление (GET) на URL, который ожидает принять POST. При этом если POST шёл на <code>https&#x003A;//example.com/wp-admin/admin.php?page=somepage&amp;<strong style="color: red">noheader=1</strong></code>, то пользователь увидит безобразную страницу.<span id="more-486"></span></p>
<p>К счастью, есть простое решение. Как известно, аутентификационные cookies устанавливает процедура <code>wp_set_auth_cookie</code>. Перед их установкой она генерирует событие <code>set_auth_cookie</code>, которому передаются следующие параметры:</p>
<ul>
<li><span class="codebox"><code class="php"><span class="re0">$auth_cookie</span></code></span>&nbsp;&mdash;&nbsp;значение для cookie, сгенерированное процедурой <span class="codebox"><code class="php">wp_generate_auth_cookie<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>;</li>
<li><span class="codebox"><code class="php"><span class="re0">$expire</span></code></span>&nbsp;&mdash;&nbsp;0, если пользователь не выбрал "Запомнить меня", не 0 в противном случае;</li>
<li><span class="codebox"><code class="php"><span class="re0">$expiration</span></code></span>&nbsp;&mdash;&nbsp;срок жизни cookie;</li>
<li><span class="codebox"><code class="php"><span class="re0">$user_id</span></code></span>&nbsp;&mdash;&nbsp;ID пользователя (из таблицы <code>wp_users</code>);</li>
<li><span class="codebox"><code class="php"><span class="re0">$scheme</span></code></span>&nbsp;&mdash;&nbsp;схема аутентификации: <code>secure_auth</code> для SSL, <code>auth</code> для HTTP.</li>
</ul>
<p>Использовать эти данные можно следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p48626">
        <div class="code php" id="p486code26">
<span class="co4">/**<br />
&nbsp;* set_auth_cookie action hook<br />
&nbsp;*<br />
&nbsp;* @param string $auth_cookie &nbsp; Value generated by wp_generate_auth_cookie()<br />
&nbsp;* @param int $expire &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, if Remember Me is not checked<br />
&nbsp;* @param int $expiration &nbsp; &nbsp; &nbsp; Cookie expiration date<br />
&nbsp;* @param int $user_id &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ID of the logged in usger<br />
&nbsp;* @param string $scheme &nbsp; &nbsp; &nbsp; &nbsp;Authentication scheme (secure_auth or auth)<br />
&nbsp;*/</span><br />
<span class="kw2">function</span> sj_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$auth_cookie</span><span class="sy0">,</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="re0">$expiration</span><span class="sy0">,</span> <span class="re0">$user_id</span><span class="sy0">,</span> <span class="re0">$scheme</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">static</span> <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">===</span> <span class="re0">$was_here</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st_h">'secure_auth'</span> <span class="sy0">==</span> <span class="re0">$scheme</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wp_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$user_id</span><span class="sy0">,</span> 0 <span class="sy0">!=</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">elseif</span> <span class="br0">&#40;</span><span class="st_h">'auth'</span> <span class="sy0">==</span> <span class="re0">$scheme</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wp_set_auth_cookie<span class="br0">&#40;</span><span class="re0">$user_id</span><span class="sy0">,</span> 0 <span class="sy0">!=</span> <span class="re0">$expire</span><span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$was_here</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<br />
add_action<span class="br0">&#40;</span><span class="st_h">'set_auth_cookie'</span><span class="sy0">,</span> <span class="st_h">'sj_set_auth_cookie'</span><span class="sy0">,</span> <span class="sy0">-</span>100<span class="sy0">,</span> 5<span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/tips-and-tricks/486-simultaneous-login-for-http-and-https/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Секреты update_postmeta_cache()</title>
		<link>http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/</link>
		<comments>http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 10:27:14 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Советы]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[производительность]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=349</guid>
		<description><![CDATA[Способ увеличения производительности при чтении метаданных записей Если плагину приходится в цикле читать метаданные для большого количества записей, можно увеличить производительность путём использования функции update_postmeta_cache(). Например, такой код $all_posts = $wpdb-&#62;get_col(&#34;SELECT `ID` FROM `{$wpdb-&#62;posts}` WHERE `post_type` = &#039;post&#039; ORDER BY `post_title`&#34;); if (false == empty($all_posts)) : foreach ($all_posts as $id) : $caps = get_post_meta($id, &#039;_disclosesecret_cap&#039;); [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Способ увеличения производительности при чтении метаданных записей</em></h2>
<p>Если плагину приходится в цикле читать метаданные для большого количества записей, можно увеличить <a href="http://blog.sjinks.pro/tag/performance/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  производительность">производительность</a> путём использования функции <code>update_postmeta_cache()</code>.<span id="more-349"></span></p>
<p>Например, такой код</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34929">
        <div class="code php" id="p349code29">
<span class="re0">$all_posts</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">get_col</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT `ID` FROM `<span class="es4">{$wpdb-&gt;posts}</span>` WHERE `post_type` = 'post' ORDER BY `post_title`&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$all_posts</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">:</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$all_posts</span> <span class="kw1">as</span> <span class="re0">$id</span><span class="br0">&#41;</span> <span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$caps</span> <span class="sy0">=</span> get_post_meta<span class="br0">&#40;</span><span class="re0">$id</span><span class="sy0">,</span> <span class="st_h">'_disclosesecret_cap'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//...</span><br />
&nbsp; &nbsp; <span class="kw1">endforeach</span><span class="sy0">;</span><br />
<span class="kw1">endif</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>потребует выполнения <var>n</var> дополнительных запросов, где <var>n</var>&nbsp;&mdash;&nbsp;число выбраннных записей.</p>
<p>Код можно сделать гораздо эффективнее, добавив всего одну строку:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34930">
        <div class="code php" id="p349code30">
<span class="re0">$all_posts</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">get_col</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT `ID` FROM `<span class="es4">{$wpdb-&gt;posts}</span>` WHERE `post_type` = 'post' ORDER BY `post_title`&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$all_posts</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">:</span><br />
&nbsp; &nbsp; update_postmeta_cache<span class="br0">&#40;</span><span class="re0">$all_posts</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$all_posts</span> <span class="kw1">as</span> <span class="re0">$id</span><span class="br0">&#41;</span> <span class="sy0">:</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$caps</span> <span class="sy0">=</span> get_post_meta<span class="br0">&#40;</span><span class="re0">$id</span><span class="sy0">,</span> <span class="st_h">'_disclosesecret_cap'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//...</span><br />
&nbsp; &nbsp; <span class="kw1">endforeach</span><span class="sy0">;</span><br />
<span class="kw1">endif</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>В этом случае понадобится один дополнительный запрос.</p>
<p><strong>Техническая информация:</strong> <code>get_post_meta()</code> вызывает <code>update_postmeta_cache()</code>, если метаинформация не найдена во внутреннем кэше (группа <code>post_meta</code>, ключ <span class="codebox"><code class="php"><span class="re0">$id</span></code></span>&nbsp;&mdash;&nbsp;уникальный идентификатор записи). Так как <code>update_postmeta_cache()</code> читает <strong>все</strong> метаданные для указанных записей, получаем пенальти в одно обращение к базе данных на уникальную запись.</p>
<p><code>update_postmeta_cache()</code> в качестве параметра принимает либо строку (список идентификаторов записей, разделённых запятой), либо массив. "Стоимость" вызова данной функции составляет один запрос к базе данных на весь набор параметров.</p>
<p><strong>Побочные эффекты:</strong> если длина SQL-запроса превысит значение переменной <code>max_allowed_packet</code> (для <a href="http://blog.sjinks.pro/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a>), запрос к базе данных завершится ошибкой.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/tips-and-tricks/349-secrets-of-update_postmeta_cache/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Пять советов верстальщику</title>
		<link>http://blog.sjinks.pro/css/171-five-tips-my-five-cents/</link>
		<comments>http://blog.sjinks.pro/css/171-five-tips-my-five-cents/#comments</comments>
		<pubDate>Tue, 27 May 2008 22:17:43 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=171</guid>
		<description><![CDATA[Мои пять копеек Принимая эстафету, организованную Никитой Селецким, от Максима Покровского, добавляю свои пять копеек в копилку советов по вёрстке. Изучайте стандарты W3C. Как это ни банально звучит, хороший верстальщик (да и web-разработчик) просто обязан (пусть не наизусть) знать и понимать спецификации. Недавно в книжном магазине видел книжку по верстке. Лучше бы я её не [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/171-five-tips-my-five-cents/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Мои пять копеек</em></h2>
<p>Принимая эстафету, организованную <a href="http://seleckis.lv/journal/css/5-sovetov-verstalschiku">Никитой Селецким</a>, от <a href="http://pokrovskii.com/5-sovetov-verstalshhiku">Максима Покровского</a>, добавляю свои пять копеек в копилку советов по вёрстке.</p>
<ol>
<li><strong>Изучайте стандарты W3C.</strong> Как это ни банально звучит, хороший верстальщик (да и web-разработчик) просто обязан (пусть не наизусть) знать и понимать спецификации. Недавно в книжном магазине видел книжку по верстке. Лучше бы я её не видел: вложенные таблицы, архаичные тэги и всё в том же духе. Так вот: такие книги&nbsp;&mdash;&nbsp;зло. Всё, что надо знать, есть в спецификациях <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Следствия из данной рекомендации: да здравствует семантическая вёрстка; Vaild XHTML/CSS forever (тем не менее, это не должно быть самоцелью).</li>
<li><strong>Дизайн должен быть кросс-браузерным.</strong> Internet Explorer уже давно не единственный браузер, которым пользуются люди, но, тем не менее, существует большое количество сайтов, которые написаны исключительно под IE. Так вот, это неправильно. Дизайн (равно как и код) нужно тщательно тестировать в как можно большем количестве браузеров. Для тех, кто под Windows, вообще райская жизнь: на одной машине без проблем уживаются IE6/7, FireFox, Opera, Safari и даже Konqueror из виндового порта KDE4. Затраты времени на тест в различных браузерах окупаются: заказчики имеют тенденцию смотреть на дизайн в экзотических браузерах, и когда всё отлично смотрится с первого раза, их приятно удивляет. А приятное удивление заказчика оборачивается бонусами для исполнителя <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li><strong>Помните про usability и accessibility.</strong> Тестируйте сайт с выключенными картинками, JavaScript и CSS (в различных комбинациях). Страница без CSS позволяет получить представление о том, как поисковик воспринимает страницу. Контент в самом низу? Что же удивляться, что Гугол недооценивает сайт? Или поставьте себя на место человека с ограниченными способностями, использующего скринридер. Хватит ли у Вас терпения, чтобы прослушать главную страницу Вашего сайта? Или Вам это надоест, когда скринридер пойдет читать меню навигации? Отключили JavaScript и развалился дизайн/не отправляется форма? Далеко не все пользователи включают JavaScript. И если для правильного отображения сайта требуется то, что может не быть доступно всем пользователям&nbsp;&mdash;&nbsp;это минус.</li>
<li><strong>Изучайте работу мастеров.</strong> Это полезно. Только ключевое слово&nbsp;&mdash;&nbsp;<em>изучайте</em>. Если слепо передрать код/макет/нужное подставить без понимания того, что там происходит&nbsp;&mdash;&nbsp;это нехорошо. А если разобраться с кодом, то приобретаются знания и опыт. Как говорится, знание&nbsp;&mdash;&nbsp;сила.</li>
<li><strong>Упрощайте.</strong> Если код можно упростить, его нужно упростить. Во-первых, так понятнее, во-вторых&nbsp;&mdash;&nbsp;чище, в-третьих&nbsp;&mdash;&nbsp;размер страницы уменьшается. Суп из <code>div</code>'ов ничуть не лучше вложенных таблиц, поверьте.</li>
</ol>
<p>Вроде всё&hellip; Эстафету передавать мне особо некому (разве что Вам, <a href="http://www.w3school.ru/blog/">Всеволод</a>), поэтому подхватывайте все желающие <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/css/171-five-tips-my-five-cents/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/css/171-five-tips-my-five-cents/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

