<?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:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>dogmap.jp</title>
	<atom:link href="http://dogmap.jp/feed/" rel="self" type="application/rss+xml" />
	<link>http://dogmap.jp</link>
	<description>独断と偏見の何でもレビュー。since Feb. 27, 2005</description>
	<pubDate>Mon, 08 Feb 2010 09:48:26 +0900</pubDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
	<url>http://dogmap.jp/wp-content/themes/dogmap/images/dogmap_logo.jpg</url>
	<title>dogmap.jp</title>
	<link>http://dogmap.jp</link>
	</image>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/feed/" />
		<item>
		<title>Kougaburari</title>
		<link>http://dogmap.jp/2010/02/08/kougaburari/</link>
		<comments>http://dogmap.jp/2010/02/08/kougaburari/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 00:41:34 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Slide show]]></category>
		<category><![CDATA[WordPress Plugin]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2327</guid>
		<description><![CDATA[WordPress 用ランダムポスト・スライドショープラグインを JSeries でリリースしました。
hiromasa作の画像付きアーカイブ表示プラグイン「wp-kougabu」のランダムポスト機能を使用して、スライド [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress 用ランダムポスト・スライドショープラグインを JSeries でリリースしました。<br />
<a href="http://another.maple4ever.net/archives/1124/" title="hiromasa.another :o) » Blog Archive » wp-kougabu 1.12 リリースとぶらりぶらり">hiromasa</a>作の画像付きアーカイブ表示プラグイン「<a href="http://wppluginsj.sourceforge.jp/wp-kougabu/" title="WordPress Plugins/JSeries » wp-kougabu （画像付きアーカイブ）">wp-kougabu</a>」のランダムポスト機能を使用して、スライドショーを表示するプラグインです。<br />
<strong>※ wp-kougabu ver.1.12 以降が有効化されている必要があります。</strong></p>
<p>ダウンロードと使用方法は <a href="http://wppluginsj.sourceforge.jp/kougaburari/" title="WordPress Plugins/JSeries » Kougaburari ( ランダムポスト・スライドショー )">WordPress Plugins/JSeries » Kougaburari ( ランダムポスト・スライドショー )</a> を参照してください。</p>
<p>そもそも、このプラグインに着手したキッカケは、みなみさんの「<a href="http://www.pi-kun.com/archives/1371" title="M's Life 2 » WP2.9 オムライス">WP2.9 オムライス</a>」というエントリでお願いされたから。</p>
<blockquote><p>いまほしいのは kogabu で抽出した画像を js でランダムに表示させるような魔法のプラグインです。そこに手書きキャプションとか追加できたらイイナ。<a href="http://dogmap.jp/">新潟のにーさん</a>とか<a href="http://another.maple4ever.net/">ひろまさ</a>とかが合体して作ってくれないかなあ。</p></blockquote>
<p>名指しで指名されたら作らんわけにはいきますまい。<br />
<span id="more-2327"></span></p>
<p>てなわけで、前から気になっていた jQuery プラグイン <a href="http://malsup.com/jquery/cycle/" title="JQuery Cycle Plugin">JQuery Cycle Plugin</a> を使用して、wp-kougabu が吐き出したランダムポストイメージをスライドショー表示するプラグインを作りました。<br />
開発当初は JSON でランダムポスト情報を取得して動的に組み立ててたんですが、ちょっとサーバ負荷がきつかったようなので JSON 方式は捨てました。<br />
開発中は <a href="http://another.maple4ever.net/" title="hiromasa.another :o)">hiromasa</a>, <a href="http://www.pi-kun.com/" title="M's Life 2">みなみ</a>, <a href="http://www.odysseygate.com/" title="Odysseygate.com | WordPressでつづる、おでのこの道わが旅。">おでこ</a>, <a href="http://fish1091.com/wordpress/" title="Binsan’s Cafe::: Binsan's Cafe">Binsan</a>, <a href="http://mmrt-jp.net/" title="MMRT Web Site ver.5.0">Masayan</a>, <a href="http://love-satchin.org/" title="LOVE!?">さっちん</a> ら、WPer が Twitter 上でテストに付き合ってくれました、多謝。</p>
<p>デモは、以下のサイトで見ることができます。</p>
<ul>
<li><a href="http://shot.dogmap.jp/gallery/" title="shot.dogmap.jp » Gallery">shot.dogmap.jp » Gallery</a></li>
<li><a href="http://another.maple4ever.net/" title="hiromasa.another :o)">hiromasa.another <img src="http://wppluginsj.sourceforge.jp/wp-includes/images/smilies/icon_surprised.gif" alt=":o" class="wp-smiley" title=":o" /> )</a> (サイドバーの「Random Post」)</li>
<li><a href="http://www.pi-kun.com/" title="M's Life 2">M&#39;s Life 2</a> (サイドバーの「Random Scroll」)</li>
<li><a href="http://www.odysseygate.com/" title="Odysseygate.com | WordPressでつづる、おでのこの道わが旅。">Odysseygate.com | WordPressでつづる、おでのこの道わが旅。</a> (サイドバーの「光画部らり」)</li>
<li><a href="http://fish1091.com/wordpress/" title="Binsan’s Cafe::: Binsan's Cafe">Binsan’s Cafe::: Binsan&#39;s Cafe</a> (サイドバーの「Random Post」)</li>
<li><a href="http://mmrt-jp.net/" title="MMRT Web Site ver.5.0">MMRT Web Site ver.5.0</a></li>
<li><a href="http://love-satchin.org/" title="LOVE!?">LOVE!?</a> (サイドバーの「Photo」)</li>
</ul>
<hr />
デモ : ( width=160 height=120 count=20 fx=fadeZoom timeout=4000 speed=1000 )</p>
<div id="slideshow-0" class="slideshow" style="width:160;height:120;">
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/06/08/%E3%81%93%E3%82%8C%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%EF%BC%9F/"><img src="http://static.dogmap.jp/images/gallery/2e375625244c4c6d8d25f96af438dc7d.jpg" width="160" height="120" alt="e5b1b1e6a492e9ad9a2.jpg" title="これは何でしょう？" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/11/05/twicco/"><img src="http://static.dogmap.jp/images/gallery/c995d5454657a497c53ce141aa89f435.jpg" width="160" height="43" alt="logo.png" title="Twicco" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2009/07/03/open-source-world-2009/"><img src="http://static.dogmap.jp/images/gallery/641a8c087e56463f8ce0dff9d8814ed0.jpg" width="160" height="120" alt="cimg1623.jpg" title="﻿Open Source World 2009" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/06/14/%E6%9F%8F%E5%B4%8E%E3%81%88%E3%82%93%E3%81%BE%E5%B8%82/"><img src="http://static.dogmap.jp/images/gallery/15210fc5af110cf7a9ee9b6e1e02c059.jpg" width="160" height="119" alt="cimg2315.jpg" title="柏崎 えんま市 2008" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/10/12/31th-ohsu-street-performings-festival/"><img src="http://static.dogmap.jp/images/gallery/14586d26db8ae0e55a56d0c175d8372b.jpg" width="160" height="120" alt="cimg0589.jpg" title="第31回 大須大道町人祭" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/10/26/%E6%87%90%E3%81%8B%E3%81%97%E3%81%84%E3%83%A2%E3%83%8E%E3%82%92%E7%99%BA%E6%8E%98/"><img src="http://static.dogmap.jp/images/gallery/c2e610cf384f117fea082568d66f6ab6.jpg" width="160" height="120" alt="cimg0686.jpg" title="懐かしいモノを発掘" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/06/18/quick-comments/"><img src="http://static.dogmap.jp/images/gallery/5b1e21bbebe37d7e2e89f7a51dbc9cda.jpg" width="160" height="65" alt="quick-comments001.png" title="Quick Comments" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/10/11/41th-cutlery-festival-in-seki/"><img src="http://static.dogmap.jp/images/gallery/29fea1773b2613f01e8951cd207e28e5.jpg" width="160" height="120" alt="cimg0238.jpg" title="第41回 関市刃物まつり" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/06/11/googlemaps-anywhere/"><img src="http://static.dogmap.jp/images/gallery/56332a27b55198753473062ad5922b63.jpg" width="143" height="120" alt="googlemaps-anywhere03.png" title="Google Maps Anywhere" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/08/02/20080802-%E9%87%A3%E3%82%8A/"><img src="http://static.dogmap.jp/images/gallery/7e095d08a818c520a970a92ed2f97e2d.jpg" width="160" height="120" alt="2008_08020006.jpg" title="2008.08.02 釣り" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2007/06/23/%E8%9B%8D/"><img src="http://static.dogmap.jp/images/gallery/4bf59fd4c682e1d224e99e3e25ea8a1f.jpg" width="160" height="120" alt="hotaru_01.jpg" title="蛍" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2007/06/16/%E6%9F%8F%E5%B4%8E-%E3%81%88%E3%82%93%E3%81%BE%E5%B8%82%E3%81%A8%E3%83%89%E3%83%8D%E3%83%AB%E3%82%B1%E3%83%90%E3%83%96%E3%80%81%E6%99%82%E3%80%85%E3%81%8A%E5%8C%96%E3%81%91/"><img src="http://dogmap.jp/wp-content/plugins/wp-kougabu/wp-kougabu-resize.php?guid=http%3A%2F%2Fdogmap.jp%2Fwp-content%2Fuploads%2F2007%2F06%2Fdoner-kebab.JPG&amp;post_id=1343&amp;width=160&amp;height=120" width="160" height="120" alt="doner-kebab.JPG" title="柏崎 えんま市 2007 (ドネルケバブ、時々お化け)" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2007/05/08/%E9%95%B7%E5%B2%A1-%E6%82%A0%E4%B9%85%E5%B1%B1%E3%81%AE%E6%A1%9C-2007/"><img src="http://static.dogmap.jp/images/gallery/8ad09a90248e710f9fcd9c76d26ceb13.jpg" width="160" height="120" alt="sakura0424l.JPG" title="長岡 悠久山の桜 2007" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/10/18/%E5%8D%97%E9%AD%9A%E6%B2%BC-%E9%85%92%E3%81%AE%E9%99%A3-2008/"><img src="http://static.dogmap.jp/images/gallery/9c136e1f87ad6b1c3ba7788b56e34418.jpg" width="160" height="120" alt="cimg0624.jpg" title="南魚沼 酒の陣 2008" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2009/11/03/tokyo-cabinet-backend-for-the-wp-object-cache/"><img src="http://static.dogmap.jp/images/gallery/b35326ccbdcad6474b8a2150fc0f66e2.jpg" width="160" height="33" alt="tokyocabinet.png" title="WordPress Object Cache のバックエンドに Tokyo Cabinet を利用する" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2009/04/11/%E9%95%B7%E5%B2%A1-%E7%A6%8F%E5%B3%B6%E6%B1%9F%E3%81%AE%E6%A1%9C%E3%81%A8%E9%87%91%E5%B3%B0%E7%A5%9E%E7%A4%BE%E3%81%AE%E5%A4%9C%E6%A1%9C-2009/"><img src="http://static.dogmap.jp/images/gallery/403044e05472a8bf43e2e85a3bade8f1.jpg" width="160" height="120" alt="cimg1323.jpg" title="長岡 福島江の桜と金峰神社の夜桜 2009" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/01/22/hyoron/"><img src="http://static.dogmap.jp/images/gallery/b2f9afa876d2649bf95a11d89aeb0512.jpg" width="160" height="111" alt="134015140_65fa271f18.jpg" title="勝手にブログ評論" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/06/10/%E3%81%B2%E3%81%95%E3%81%B3%E3%81%95%E3%81%AE%E3%83%AB%E3%83%8A%E6%A7%98/"><img src="http://static.dogmap.jp/images/gallery/bd54302c8839ecfed1472787ab5ca02d.jpg" width="160" height="120" alt="11.jpg" title="ひさびさのルナ様" /></a></div>
<div class="slideshow-box" style="display:none;width:160;height:120;"><a href="http://dogmap.jp/2008/07/27/%E3%81%8E%E3%81%8A%E3%82%93%E6%9F%8F%E5%B4%8E%E7%A5%AD%E3%82%8A-%E6%B5%B7%E3%81%AE%E5%A4%A7%E8%8A%B1%E7%81%AB%E5%A4%A7%E4%BC%9A-2008/"><img src="http://static.dogmap.jp/images/gallery/fa2dbe706b1f4d546e0876fddf79d914.jpg" width="160" height="120" alt="cimg0615.jpg" title="ぎおん柏崎祭り 海の大花火大会 2008" /></a></div>
</div>
<div id="slideshow-caption-0" class="slideshow-caption"></div>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2010/02/08/kougaburari/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2010/02/08/kougaburari/" />
	</item>
		<item>
		<title>プラグインを諸々修正</title>
		<link>http://dogmap.jp/2010/01/22/plugins-update/</link>
		<comments>http://dogmap.jp/2010/01/22/plugins-update/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 08:22:22 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[お知らせ]]></category>
		<category><![CDATA[WordPress Plugin]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2324</guid>
		<description><![CDATA[私がリリースしているいくつかのプラグインと言語ファイルを修正しました。
修正したのは以下の4つ。

Short link maker Ver.0.1.1
WordPress.com Stats と競合して有効化できないこ [...]]]></description>
			<content:encoded><![CDATA[<p>私がリリースしているいくつかのプラグインと言語ファイルを修正しました。<br />
修正したのは以下の4つ。</p>
<ul>
<li><a href="http://wordpress.org/extend/plugins/short-link-maker/" title="Short link maker">Short link maker</a> Ver.0.1.1<br />
WordPress.com Stats と競合して有効化できないことがある不具合を修正。</li>
<li><a href="http://wordpress.org/extend/plugins/simple-tweet/" title="Simple Tweet">Simple Tweet</a> Ver.1.2.1<br />
予約投稿時に Tweet されなかった不具合を修正</li>
<li><a href="http://wordpress.org/extend/plugins/google-maps-anywhere/" title="Google Maps Anywhere">Google Maps Anywhere</a> Ver.1.1.7<br />
Map のリンク先が必ず衛星写真になってしまっている不具合を修正<br />
ストリートビューの表示が、ずれてしまう不具合を修正</li>
<li><a href="http://wppluginsj.sourceforge.jp/i18n-ja_jp/p2-theme/" title="P2 日本語リソース">P2 日本語リソース</a><br />
最新バージョン 1.1.3 に対応。作者の Noel にも送付済みなので近々反映されると思います。</li>
</ul>
<p><span id="more-2324"></span></p>
<p>というわけで、ストリートビューの表示テスト。<br />
ウォーリーというより、楳図かずお？<br />
<a href="http://maps.google.com/maps?f=q&amp;hl=ja&amp;geocode=&amp;q=51.463958,-0.215476&amp;ie=UTF8&amp;ll=51.463958,-0.215476&amp;t=h&amp;z=15&amp;layer=c&amp;cbll=51.463958,-0.215476&amp;cbp=1,109.52,,1,15.97&amp;maptype=STREETVIEW" title="Wandsworth, Greater London SW15 1, イギリス">Wandsworth, Greater London SW15 1, イギリス</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2010/01/22/plugins-update/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2010/01/22/plugins-update/" />
	</item>
		<item>
		<title>WordPress のメンテナンスページをカスタマイズ</title>
		<link>http://dogmap.jp/2010/01/19/wordpress-customized-maintenance-mode/</link>
		<comments>http://dogmap.jp/2010/01/19/wordpress-customized-maintenance-mode/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 18:54:05 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Maintenance mode]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2319</guid>
		<description><![CDATA[デフォルト状態の WordPress では、管理パネルから本体のアップグレードやプラグインの一括修正を行っているときにメンテナンスモードに切り替わり、左図のような「Briefly unavailable for sche [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://static.dogmap.jp/2010/01/screenshot_3.png" title="Maintenance mode" rel="lightbox"><img src="http://static.dogmap.jp/2010/01/screenshot_3-160x57.png" alt="Maintenance mode" title="Maintenance mode" width="160" height="57" class="alignleft size-thumbnail wp-image-2320" border="0" align="left" /></a><a href="http://static.dogmap.jp/2010/01/screenshot_2.png" title="Maintenance mode" rel="lightbox"><img src="http://static.dogmap.jp/2010/01/screenshot_2-160x83.png" alt="Maintenance mode" title="Maintenance mode" width="160" height="83" class="alignright size-thumbnail wp-image-2321" border="0" align="right" /></a>デフォルト状態の WordPress では、管理パネルから本体のアップグレードやプラグインの一括修正を行っているときにメンテナンスモードに切り替わり、左図のような<strong>「Briefly unavailable for scheduled maintenance. Check back in a minute.」</strong>という簡素な画面が表示されます。<br />
# 2.7.x 辺りから実装された機能<br />
これでは、あまりにもカッコ悪いので、右図のようにちょっとカッコいいメンテナンス画面を表示してあげるための Tips です。<br />
有名サイトでも、この画面をカスタマイズしてない所はたまに見かけるので、あまり知られていないかなと思ってエントリ (^^;;;<br />
<span id="more-2319"></span></p>
<p>おや、どこかで見かけた書き出し。<br />
そう、やり方は<a href="http://dogmap.jp/2009/07/14/wordpress-customize-db-error/" title="WordPress のデータベースエラーページをカスタマイズ : dogmap.jp">WordPress のデータベースエラーページをカスタマイズ</a>の方法と、ほとんど同じです。<br />
wp-content 以下に maintenance.php と言う名前でメンテナンスモード時に表示させたい PHP ファイルを置いておくだけです。<br />
ちなみに私の所では、こんな感じの内容で maintenance.php を作成しておいてあります。</p>
<pre class="brush: php; auto-links: false;">&lt;?php
header( &#039;HTTP/1.1 503 Service Unavailable&#039; );
header( &#039;Expires: Wed, 11 Jan 1984 05:00:00 GMT&#039; );
header( &#039;Last-Modified: &#039; . gmdate( &#039;D, d M Y H:i:s&#039; ) . &#039; GMT&#039; );
header( &#039;Cache-Control: no-cache, must-revalidate, max-age=0&#039; );
header( &#039;Pragma: no-cache&#039; );
header( &#039;Content-Type: text/html; charset=utf-8&#039; );
?&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;ja&quot;&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
    &lt;title&gt;メンテナンス中 : dogmap.jp&lt;/title&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;/error/style.css&quot; type=&quot;text/css&quot; /&gt;
&lt;/head&gt;
&lt;body id=&quot;error-page&quot;&gt;
&lt;h1&gt;503 Service Unavailable&lt;/h1&gt;
    &lt;p&gt;
        ただいまサーバのメンテナンス中です。&lt;br /&gt;
        数分後に再度リロードしてみてください。
    &lt;/p&gt;
    &lt;p&gt;ご不便おかけしますが、よろしくお願いいたします。&lt;/p&gt;
    &lt;p style=&quot;text-align: right;&quot;&gt;&lt;a href=&quot;http://dogmap.jp/&quot;&gt;http://dogmap.jp/&lt;/a&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>注意する所は WordPress ロード後、早い段階で表示されるので WordPress のテンプレートタグはほとんど使えない点です。</p>
<hr />
<a href="http://static.dogmap.jp/2010/01/screenshot_1.png" title="プラグインのアップグレード" rel="lightbox"><img src="http://static.dogmap.jp/2010/01/screenshot_1-160x110.png" alt="プラグインのアップグレード" title="プラグインのアップグレード" width="160" height="110" class="alignleft size-thumbnail wp-image-2322" border="0" align="left" /></a>ちなみにメンテナンスモードが有効になるタイミングは、本体をアップグレードしたり、プラグインを一括アップグレードしたりするときに「メンテナンスモードを有効にします」と表示された後です。<br />
その後、「メンテナンスモードを無効にしています」と表示されるまで、サイトにアクセスするとメンテナンスモード用の画面が表示されます。</p>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2010/01/19/wordpress-customized-maintenance-mode/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2010/01/19/wordpress-customized-maintenance-mode/" />
	</item>
		<item>
		<title>Custom more text</title>
		<link>http://dogmap.jp/2010/01/06/custom-more-text/</link>
		<comments>http://dogmap.jp/2010/01/06/custom-more-text/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 23:05:22 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[WordPress Plugin]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2317</guid>
		<description><![CDATA[以前、唯奈さんに Twitter でリクエストされてちょちょっと書いた WordPress 用プラグイン「Custom more text」。
投稿のカスタムフィールド「custom-more-text」にテキストが設定 [...]]]></description>
			<content:encoded><![CDATA[<p>以前、<a href="http://twitter.com/yuina_s" title="唯奈 (yuina_s) on Twitter">唯奈さん</a>に Twitter でリクエストされてちょちょっと書いた WordPress 用プラグイン「Custom more text」。<br />
投稿のカスタムフィールド「custom-more-text」にテキストが設定されていた場合、「続きを読む」のテキストを変更するプラグインです。</p>
<p><a href="http://dl.dropbox.com/u/110305/custom-more-text.php" title="Custom more text">http://dl.dropbox.com/u/110305/custom-more-text.php</a><br />
<span id="more-2317"></span></p>
<p>仕組みは簡単で、<a href="http://dogmap.jp/2009/11/10/custom-more-link/" title="more-link の #more-xxxx を削除する : dogmap.jp">more-link の #more-xxxx を削除</a>した時に使用した &quot;<strong>the_content_more_link</strong>&quot; フィルタをフックして、カスタムフィールド「custom-more-text」に設定されたテキストと置き換えてるだけです。<br />
このプラグインを元にすれば、「続きを読む」のテキストをエントリの件名に置換したりも簡単にできると思うよ。</p>
<pre class="brush: php; auto-links: false;">&lt;?php
/*
Plugin Name: Custom more text
Plugin URI:
Description: 「続きを読む」のテキストをカスタムフィールド「custom-more-text」に設定されたテキストに置き換える。(WP2.8以降でないと動作しません)
Author: wokamoto
Version: 0.0.2
Author URI: http://dogmap.jp/
*/
function custom_more_text( $output ) {
	$custom_more_text = get_post_meta(get_the_ID(), &#039;custom-more-text&#039;, true);
	if ( !empty($custom_more_text) )
		$output = preg_replace(&#039;/(&lt;a [^&gt;]*&gt;)[^&lt;]*(&lt;\/a&gt;)/i&#039;, &#039;$1&#039;.$custom_more_text.&#039;$2&#039;, $output );
	return $output;
}

add_filter( &#039;the_content_more_link&#039;, &#039;custom_more_text&#039; );
?&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2010/01/06/custom-more-text/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2010/01/06/custom-more-text/" />
	</item>
		<item>
		<title>Table optimizer</title>
		<link>http://dogmap.jp/2010/01/01/table-optimizer/</link>
		<comments>http://dogmap.jp/2010/01/01/table-optimizer/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 16:07:40 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[WordPress Plugin]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2315</guid>
		<description><![CDATA[WordBench 東京が開催した黙々と何かを作る勉強会もくもく部。
当日は大掃除したりなんだりで、リアルタイムには参加できなかったのですが、あまりに楽しそうだったので、夜中にこっそりビールを呑みながら、一人もくもく部を [...]]]></description>
			<content:encoded><![CDATA[<p>WordBench 東京が開催した黙々と何かを作る勉強会<a href="http://tokyo.wordbench.org/2009/12/19/study-20091226/" title="WordBench 第1回もくもく部 in 東京 at WordBench 東京">もくもく部</a>。<br />
当日は大掃除したりなんだりで、リアルタイムには参加できなかったのですが、あまりに楽しそうだったので、夜中にこっそりビールを呑みながら、一人もくもく部をやってました。<br />
で、1時間あまりで作ったプラグインがこれ。</p>
<p><a href="http://dl.dropbox.com/u/110305/optimizer.php" title="table optimizer">http://dl.dropbox.com/u/110305/optimizer.php</a></p>
<p>wp-cron という WordPress で定期実行してくれる仕組みを使って定期的に全テーブルを optimize してくれるプラグインです。<br />
地味に便利だと思いますよ。<br />
<span id="more-2315"></span></p>
<p>一応、簡単な説明。<br />
やってることは単純で &quot;SHOW TABLES&quot; を発行して、全テーブル名を取得し、その中から $wpdb->prefix でプリフィックスが WordPress で使用しているテーブルと一致するモノを &quot;OPTIMIZE TABLE&quot; してるだけです。<br />
定期的に OPTIMIZE しなくても ANALYZE だけで充分だよ。という人は OPTIMIZE TABLE を ANALYZE TABLE に書き換えてやってください。</p>
<p>MySQL や一般的な RDBMS では、定期的に ANALYZE してやって、テーブルのキーの分布を分析・格納してやることで、DBアクセス時のパフォーマンスアップが見込めます。<br />
動的生成の WordPress では、定期的に ANALYZE TABLE もしくは OPTIMIZE TABLE してやると幸せになれるでしょう。</p>
<pre class="brush: php; auto-links: false;">define(&#039;OPTIMIZER_INTERVAL&#039;, 24 * 60);
define(&#039;OPTIMIZER_SCHEDULE_HANDLER&#039;, &#039;optimize_table&#039;);

class OptimizeTable {

	function optimize_table(){
		global $wpdb, $table_prefix;

		$tables = $wpdb-&gt;get_col(&#039;SHOW TABLES&#039;);
		$pattern = &#039;/^&#039;. preg_quote($wpdb-&gt;prefix) . &#039;/i&#039;;
		foreach ( $tables as $table ) {
			if ( preg_match( $pattern, $table ) ) {
				$wpdb-&gt;query(&quot;OPTIMIZE TABLE $table&quot;);
			}
		}

		$time_interval = OPTIMIZER_INTERVAL;
		$this-&gt;schedule_single_event($time_interval);

	}

	// get wp-cron schedule
	function _get_schedule($schedule_procname = OPTIMIZER_SCHEDULE_HANDLER) {
		$schedule = array(
			&#039;procname&#039; =&gt; &#039;&#039; ,
			&#039;enabled&#039; =&gt; FALSE ,
			&#039;time&#039; =&gt; &#039;&#039; ,
		);

		$crons = _get_cron_array();
		if ( !empty($crons) ) {
			foreach ( $crons as $time =&gt; $tasks ) {
				foreach ( $tasks as $procname =&gt; $task ) {
					if ($procname === $schedule_procname) {
						$schedule[&#039;procname&#039;] = $procname;
						$schedule[&#039;time&#039;] = $time;
						$schedule[&#039;enabled&#039;] = true;
						break;
					}
				}
				if ($schedule[&#039;enabled&#039;]) break;
			}
			unset($procname); unset($task);
			unset($time); unset ($tasks);
		}
		unset($crons);

		return ($schedule);
	}

	function schedule_single_event($time_interval = OPTIMIZER_INTERVAL) {
		return (wp_schedule_single_event(time() + $time_interval * 60, OPTIMIZER_SCHEDULE_HANDLER));
	}

	function schedule_enabled($schedule_procname = OPTIMIZER_SCHEDULE_HANDLER) {
		$schedule = $this-&gt;_get_schedule($schedule_procname);
		return ($schedule[&#039;enabled&#039;]);
	}
}

$optimizer = new OptimizeTable();
if ( !$optimizer-&gt;schedule_enabled() ) $optimizer-&gt;schedule_single_event(0);
add_action(OPTIMIZER_SCHEDULE_HANDLER, array(&amp;$optimizer, &#039;optimize_table&#039;));
unset($optimizer);</pre>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2010/01/01/table-optimizer/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2010/01/01/table-optimizer/" />
	</item>
		<item>
		<title>more-link の #more-xxxx を削除する</title>
		<link>http://dogmap.jp/2009/11/10/custom-more-link/</link>
		<comments>http://dogmap.jp/2009/11/10/custom-more-link/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 18:08:55 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[customize]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2311</guid>
		<description><![CDATA[WordPress の more-link には URL の後ろに #more-xxxx が含まれるため、以前は wp-includes/post-template.php を直接修正して #more-xxxx を付加し [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress の more-link には URL の後ろに #more-xxxx が含まれるため、以前は wp-includes/post-template.php を直接修正して #more-xxxx を付加しないようにしていました。<br />
WordPress 2.8.x からは &quot;<strong>the_content_more_link</strong>&quot; フィルタが追加されたので、more-link の #more-xxxx を削除するのは簡単になりました。<br />
以下のようなコードをテーマの functions.php に追加するだけで実現できます。</p>
<pre class="brush: php; auto-links: false;">&lt;?php
// #more-$id を削除する。
function custom_content_more_link( $output ) {
	$output = preg_replace(&#039;/#more-[\d]+/i&#039;, &#039;&#039;, $output );
	return $output;
}
add_filter( &#039;the_content_more_link&#039;, &#039;custom_content_more_link&#039; );
?&gt;</pre>
<p>コアソースを書き換えちゃうと、アップデートが面倒になるので、できるだけフィルタフックやプラグインを使用してカスタマイズするように心がけましょう。<br />
大抵のことは、コアソースを弄らずともできます。</p>
<p><strong>追記:</strong><br />
すでに <a href="http://wpdocs.sourceforge.jp/" title="Main Page - WordPress Codex 日本語版">WordPress Codex</a> にも乗っているテクニックだそうです。<br />
# <a href="http://twitter.com/ounziw" title="水野史土 (ounziw) on Twitter">@ounziw</a> 情報ありがとうございます。<br />
<a href="http://wpdocs.sourceforge.jp/%E3%80%8C%E7%B6%9A%E3%81%8D%E3%82%92%E8%AA%AD%E3%82%80%E3%80%8D%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA" title="「続きを読む」のカスタマイズ - WordPress Codex 日本語版">「続きを読む」のカスタマイズ &#8211; WordPress Codex 日本語版</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2009/11/10/custom-more-link/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2009/11/10/custom-more-link/" />
	</item>
		<item>
		<title>Ubuntu で ext3 から ext4 へ</title>
		<link>http://dogmap.jp/2009/11/04/converting-ext3-to-ext4/</link>
		<comments>http://dogmap.jp/2009/11/04/converting-ext3-to-ext4/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 20:40:51 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[ext4]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[ファイルシステム]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2310</guid>
		<description><![CDATA[先日、ついうっかり自宅PCを Ubuntu 9.10 にアップデートしてしまいました。
で、ついでに Ubuntu 9.10 の標準ファイルシステムである ext4 にアップデートしたのでメモ。
参考にした URL は以 [...]]]></description>
			<content:encoded><![CDATA[<p>先日、ついうっかり自宅PCを <a href="http://twitter.com/wokamoto/statuses/5261038145" title="Twitter / wokamoto: Ubuntu アップデート中。ウィスキーを呑みながら ...">Ubuntu 9.10 にアップデート</a>してしまいました。<br />
で、ついでに Ubuntu 9.10 の標準ファイルシステムである ext4 にアップデートしたのでメモ。<br />
参考にした URL は以下のとおり。</p>
<ul>
<li><a href="http://ext4.wiki.kernel.org/index.php/Ext4_Howto#Converting_an_ext3_filesystem_to_ext4" title="Ext4 Howto - Ext4">Ext4 Howto &#8211; Ext4</a></li>
<li><a href="http://green.ap.teacup.com/nakaneko/120.html" title="Ubuntuでext3からext4への変換方法 | ぷじょ猫丸のわいわいノート">Ubuntuでext3からext4への変換方法 | ぷじょ猫丸のわいわいノート</a></li>
</ul>
<p><span id="more-2310"></span></p>
<p>手順は、簡単。</p>
<ol>
<li><code>$ df -T</code> でファイル・システムを確認</li>
<li><code>$ sudo tune2fs -O extents,uninit_bg,dir_index /dev/DEV</code> で変換指定</li>
<li><code>$ sudo e2fsck -fpDC0 /dev/DEV</code> で整合性チェック</li>
<li>ext4 に変換したデバイスについて /etc/fstab を修正するのを忘れずに</li>
</ol>
<p>後は、再起動すればおっけ。</p>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2009/11/04/converting-ext3-to-ext4/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2009/11/04/converting-ext3-to-ext4/" />
	</item>
		<item>
		<title>WordPress Object Cache のバックエンドに Tokyo Cabinet を利用する</title>
		<link>http://dogmap.jp/2009/11/03/tokyo-cabinet-backend-for-the-wp-object-cache/</link>
		<comments>http://dogmap.jp/2009/11/03/tokyo-cabinet-backend-for-the-wp-object-cache/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 00:04:34 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Tokyo Cabinet]]></category>
		<category><![CDATA[オブジェクトキャッシュ]]></category>
		<category><![CDATA[サイト運営]]></category>
		<category><![CDATA[チューニング]]></category>
		<category><![CDATA[パフォーマンス]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2308</guid>
		<description><![CDATA[2.5以前の WordPress には Object Cache という機能がありました。
最近の WordPress では、この機能はデフォルトでは使えない状態になっているのですが、wp-content フォルダに o [...]]]></description>
			<content:encoded><![CDATA[<p>2.5以前の WordPress には Object Cache という機能がありました。<br />
最近の WordPress では、この機能はデフォルトでは使えない状態になっているのですが、wp-content フォルダに object-cache.php というファイルを置き、wp-config.php に &quot;define(’ENABLE_CACHE’,true);&quot; を追加することで、この機能が使用できるようになります。<br />
この object-cache.php は、WordPress のコアには含まれていないので、どこからか調達してくる必要があります。<br />
バックエンドに何を使うかにも寄りますが、ファイルや memcached に Cache 情報を持たせるモジュールが提供されています。</p>
<p><strong>参考URL:</strong></p>
<ul>
<li><a href="http://dogmap.jp/2008/12/10/performance-tuning-4/" title="WordPress サイトのパフォーマンスチューニング (4) : dogmap.jp">File-Based Extension to the WordPress Object Cache</a>@dogmap.jp</li>
<li><a href="http://another.maple4ever.net/archives/989/" title="hiromasa.another :o) » Blog Archive » WordPress の memcached による高速化">Memcached backend for the WP Object Cache</a>@hiromasa.another</li>
</ul>
<p>で、この object-cache.php を書いてしまえば、Memcached やファイルだけでなく、軽量データベースライブラリ <a href="http://1978th.net/tokyocabinet/" title="データベースマネージャ Tokyo Cabinet">Tokyo Cabinet</a> なんかもバックエンドのDBとして利用できるのです。<br />
ってなわけで、レンタルサーバに Tokyo Cabinet をインストールして、WordPress から利用してみましょう。<br />
<span id="more-2308"></span></p>
<h3>Tokyo Cabinet のインストール</h3>
<p>さくらのレンタルサーバにインストールする方法をざっくりと紹介。<br />
参考にしたのは、BLOG::broomie.net さんの「<a href="http://blog.broomie.net/index.cgi?id=2" title="BLOG::broomie.net: さくらのレンタルサーバにTokyo Promenadeをインストールする方法">さくらのレンタルサーバにTokyo Promenadeをインストールする方法</a>」というエントリ。</p>
<p>まず、<a href="http://sourceforge.net/projects/tokyocabinet/files/" title="Browse Tokyo Cabinet Files on SourceForge.net">Tokyo Cabinet Files on SourceForge.net</a> から、Tokyo Cabinet のソースをダウンロードしましょう。<br />
2009年11月2日現在では、Ver.1.4.9 が最新バージョンのようです。</p>
<p>次に、ダウンロードしたファイルを展開後、configure -> make してインストールです。<br />
ざっと、こんな感じ。</p>
<pre class="brush: plain; auto-links: false;">$ tar zxvf tokyocabinet-1.4.9.tar.gz
$ cd tokyocabinet-1.4.9
$ ./configure -prefix=$HOME/usr/local
$ gmake
$ gmake install</pre>
<p>注意点は、configure するときにプリフィックスをつけることくらいかな。</p>
<h3>Tokyo Cabinet の PHP バインディングモジュールのインストール</h3>
<p>次に Tokyo Cabinet の PHP バインディングモジュール<a href="http://d.hatena.ne.jp/rsky/20071110/1194639624" title="php_tokyocabinet-0.1.0 - 讃容日記">php_tokyocabinet</a> をインストールしましょう。<br />
最新バージョンは、<a href="http://d.hatena.ne.jp/rsky/20071228/1198841053" title="php_tokyocabinet-0.3.0: Tokyo Cabinet 1.1.x対応(専用) - 讃容日記">php_tokyocabinet-0.3.0</a> のようなので、それをダウンロードします。<br />
ざっと、こんな感じ。</p>
<pre class="brush: plain; auto-links: false;">$ tar zxvf php_tokyocabinet-0.3.0.tgz
$ cd php_tokyocabinet-0.3.0
$ phpize
$ setenv  PKG_CONFIG_PATH $HOME/usr/local/lib/pkgconfig
$ configure --enable-tokyocabinet
$ gmake</pre>
<p># configure内でpkg-configを使うので、PKG_CONFIG_PATH をセットしています。</p>
<p>で、ルート権限があれば、このあと gmake install としてしまえば良いですが、共用レンタルサーバでは、それはできません。<br />
なので、modules/tokyocabinet.so を ~/lib/ext とかにコピーしておいてあげましょう。<br />
その状態で php.ini に以下の記述を追加すれば、OKです。</p>
<pre class="brush: plain; auto-links: false;">[tokyocabinet]
extension_dir = /home/username/lib/ext
extension = tokyocabinet.so</pre>
<p>モジュールが読み込まれているかどうかは phpinfo() で確認できます。<br />
<img src="http://static.dogmap.jp/2009/11/tokyocabinet.png" alt="tokyocabinet" title="tokyocabinet" width="612" height="129" class="aligncenter size-full wp-image-2309" border="0" /></p>
<h3>object-cache の設置</h3>
<p>あとは Object Cache のバックエンドとして、Tokyo Cabinet を使う object-cache.php を作成しましょう。<br />
とりあえず、適当に書いたのが、こんな感じ。</p>
<pre class="brush: php; auto-links: false;">&lt;?php
/*
Name: Tokyo Cabinet
Description: Tokyo Cabinet backend for the WP Object Cache.
Version: 0.1.0
URI:
Author: wokamoto

Install this file to wp-content/object-cache.php
*/

function wp_cache_add($key, $data, $flag = &#039;&#039;, $expire = 0) {
	global $wp_object_cache;
	return $wp_object_cache-&gt;add($key, $data, $flag, $expire);
}

function wp_cache_incr($key, $n = 1, $flag = &#039;&#039;) {
	global $wp_object_cache;
	return $wp_object_cache-&gt;incr($key, $n, $flag);
}

function wp_cache_decr($key, $n = 1, $flag = &#039;&#039;) {
	global $wp_object_cache;
	return $wp_object_cache-&gt;decr($key, $n, $flag);
}

function wp_cache_close() {
	global $wp_object_cache;

	return $wp_object_cache-&gt;close();
}

function wp_cache_delete($id, $flag = &#039;&#039;) {
	global $wp_object_cache;
	return $wp_object_cache-&gt;delete($id, $flag);
}

function wp_cache_flush() {
	global $wp_object_cache;
	return $wp_object_cache-&gt;flush();
}

function wp_cache_get($id, $flag = &#039;&#039;) {
	global $wp_object_cache;
	return $wp_object_cache-&gt;get($id, $flag);
}

function wp_cache_init() {
	global $wp_object_cache;
	$wp_object_cache = new WP_Object_Cache();
}

function wp_cache_replace($key, $data, $flag = &#039;&#039;, $expire = 0) {
	global $wp_object_cache;
	return $wp_object_cache-&gt;replace($key, $data, $flag, $expire);
}

function wp_cache_set($key, $data, $flag = &#039;&#039;, $expire = 0) {
	global $wp_object_cache;
	if ( defined(&#039;WP_INSTALLING&#039;) == false )
		return $wp_object_cache-&gt;set($key, $data, $flag, $expire);
	else
		return $wp_object_cache-&gt;delete($key, $flag);
}

function wp_cache_add_global_groups( $groups ) {
	global $wp_object_cache;
	$wp_object_cache-&gt;add_global_groups($groups);
}

function wp_cache_add_non_persistent_groups( $groups ) {
	global $wp_object_cache;
	$wp_object_cache-&gt;add_non_persistent_groups($groups);
}

class WP_Object_Cache {
	var $global_groups = array(
		&#039;users&#039;,
		&#039;userlogins&#039;,
		&#039;usermeta&#039;,
		&#039;site-options&#039;,
		&#039;site-lookup&#039;,
		&#039;blog-lookup&#039;,
		&#039;blog-details&#039;,
		&#039;rss&#039;
		);

	var $no_hdb_groups = array(
		&#039;posts&#039;,
		&#039;comment&#039;,
		&#039;counts&#039;
		);

	var $autoload_groups = array(
		&#039;options&#039;
		);

	var $cache = array();
	var $db = array();
	var $stats = array();
	var $group_ops = array();
	var $pre;

	var $cache_enabled = true;
	var $default_expiration = 0;

	function WP_Object_Cache() {
		__construct();
	}
	function __construct() {
		global $table_prefix;
		$this-&gt;pre = $table_prefix;
		foreach ( $this-&gt;autoload_groups as $group ) {
			$this-&gt;get_hdb($group);
		}
	}

	function add($id, $data, $group = &#039;default&#039;, $expire = 0) {
		$key = $this-&gt;key($id, $group);

		if ( in_array($group, $this-&gt;no_hdb_groups) ) {
			$this-&gt;cache[$key] = $data;
			return true;
		}

		$hdb =&amp; $this-&gt;get_hdb($group);
		if ( $hdb !== FALSE ) {
			$result = $hdb-&gt;put($key, $this-&gt;maybe_serialize($data));
			@ ++$this-&gt;stats[&#039;add&#039;];
			$this-&gt;group_ops[$group][] = &quot;add $id&quot;;
		} else {
			$result = FALSE;
		}

		if ( false !== $result )
			$this-&gt;cache[$key] = $this-&gt;maybe_serialize($data);

		return $result;
	}

	function add_global_groups($groups) {
		if ( ! is_array($groups) )
			$groups = (array) $groups;

		$this-&gt;global_groups = array_merge($this-&gt;global_groups, $groups);
		$this-&gt;global_groups = array_unique($this-&gt;global_groups);
	}

	function add_non_persistent_groups($groups) {
		if ( ! is_array($groups) )
			$groups = (array) $groups;

		$this-&gt;no_hdb_groups = array_merge($this-&gt;no_hdb_groups, $groups);
		$this-&gt;no_hdb_groups = array_unique($this-&gt;no_hdb_groups);
	}

	function close() {

		foreach ( $this-&gt;db as $bucket =&gt; $hdb )
			$hdb-&gt;close();
	}

	function delete($id, $group = &#039;default&#039;) {
		$key = $this-&gt;key($id, $group);

		if ( in_array($group, $this-&gt;no_hdb_groups) ) {
			unset($this-&gt;cache[$key]);
			return true;
		}

		$hdb =&amp; $this-&gt;get_hdb($group);
		$result = ( $hdb !== FALSE ? $hdb-&gt;out($key) : FALSE );

		@ ++$this-&gt;stats[&#039;delete&#039;];
		$this-&gt;group_ops[$group][] = &quot;delete $id&quot;;

		if ( false !== $result )
			unset($this-&gt;cache[$key]);

		return $result;
	}

	function flush() {
		return true;
	}

	function get($id, $group = &#039;default&#039;) {
		$key = $this-&gt;key($id, $group);
		$hdb =&amp; $this-&gt;get_hdb($group);

		if ( isset($this-&gt;cache[$key]) )
			$value = $this-&gt;maybe_unserialize($this-&gt;cache[$key]);
		else if ( in_array($group, $this-&gt;no_hdb_groups) || $hdb === FALSE )
			$value = false;
		else
			$value = $this-&gt;maybe_unserialize($hdb-&gt;get($key));

		@ ++$this-&gt;stats[&#039;get&#039;];
		$this-&gt;group_ops[$group][] = &quot;get $id&quot;;

		if ( NULL === $value )
			$value = false;

		$this-&gt;cache[$key] = $this-&gt;maybe_serialize($value);

		if ( &#039;checkthedatabaseplease&#039; == $value )
			$value = false;

		return $value;
	}

	function key($key, $group) {
		if ( empty($group) )
			$group = &#039;default&#039;;
		$group = $this-&gt;pre.$group;

		return preg_replace(&#039;/\s+/&#039;, &#039;&#039;, &quot;$group:$key&quot;);
	}

	function replace($id, $data, $group = &#039;default&#039;, $expire = 0) {
		$result = $this-&gt;add($id, $data, $group, $expire);
		return $result;
	}

	function set($id, $data, $group = &#039;default&#039;, $expire = 0) {
		$result = $this-&gt;add($id, $data, $group, $expire);
		return $result;
	}

	function &amp;get_hdb($group) {
		if ( empty($group) )
			$group = &#039;default&#039;;

		if ( in_array($group, $this-&gt;no_hdb_groups) )
			return FALSE;

		$group = $this-&gt;pre . $group;
		if ( !isset($this-&gt;db[$group]) ) {
			$this-&gt;db[$group] = new TCHDB();
			$this-&gt;db[$group]-&gt;open(trailingslashit(WP_CONTENT_DIR) . &#039;cache/&#039; . $group . &#039;.hdb&#039;, TCHDB::OWRITER | TCHDB::OCREAT);
		}

		return $this-&gt;db[$group];
	}

	function maybe_serialize( $data ) {
		if ( is_array( $data ) || is_object( $data ) )
			return serialize( $data );

		if ( is_serialized( $data ) )
			return serialize( $data );

		return $data;
	}

	function maybe_unserialize( $original ) {
		if ( is_serialized( $original ) ) // don&#039;t attempt to unserialize data that wasn&#039;t serialized going in
			return @unserialize( $original );
		return $original;
	}

}
?&gt;</pre>
<p>ただし Tokyo Cabinet は TCHDB::OWRITER オプションで、DBをオープンしている際はテーブルロックをかけてしまうので、このままではパフォーマンスが悪いです。<br />
その辺も、考慮してこのモジュールを修正すれば、結構イケるのでは無いでしょうか？<br />
共用レンタルサーバだから memcached は使えないんだよなぁという人はチャレンジしてみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2009/11/03/tokyo-cabinet-backend-for-the-wp-object-cache/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2009/11/03/tokyo-cabinet-backend-for-the-wp-object-cache/" />
	</item>
		<item>
		<title>名刺</title>
		<link>http://dogmap.jp/2009/10/27/business-card/</link>
		<comments>http://dogmap.jp/2009/10/27/business-card/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 23:09:01 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[身辺雑記]]></category>
		<category><![CDATA[キャンペーン]]></category>
		<category><![CDATA[名刺]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2306</guid>
		<description><![CDATA[AMNさんが、8月から開始したブロガー向けコミュニティーサービスブログクラブのブログクラブオープニングキャンペーンに応募していたのだが、みごと当選して前川企画印刷さんに名刺を作ってもらった。
中々、良い出来で満足。ただ、 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://static.dogmap.jp/2009/10/3091333650.jpg" title="名刺" rel="lightbox"><img src="http://static.dogmap.jp/2009/10/3091333650-160x120.jpg" alt="名刺" title="名刺" width="160" height="120" class="alignright size-thumbnail wp-image-2307" border="0" align="right" /></a><a href="http://agilemedia.jp/" title="ブログマーケティング、ブログ広告のアジャイルメディア・ネットワーク：Agile Media Network">AMN</a>さんが、8月から開始したブロガー向けコミュニティーサービス<a href="http://blogclub.jp/" title="ブログクラブ">ブログクラブ</a>の<a href="http://blogclub.jp/statics/page/2009/08/post-3.html" title="ブログクラブオープニングキャンペーンのお知らせ">ブログクラブオープニングキャンペーン</a>に応募していたのだが、みごと当選して<a href="http://www.kobe-maekawa.co.jp/" title="（有）前川企画印刷/デザイナーもコピーライターも・・・[神戸市兵庫区]">前川企画印刷</a>さんに名刺を作ってもらった。<br />
中々、良い出来で満足。ただ、WordCamp に間に合わなかったのは残念。<br />
次に配布する機会はいつだろう？<br clear="all" /></p>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2009/10/27/business-card/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2009/10/27/business-card/" />
	</item>
		<item>
		<title>redirect_canonical フィルタを使う時の注意点</title>
		<link>http://dogmap.jp/2009/10/23/redirect_canonical/</link>
		<comments>http://dogmap.jp/2009/10/23/redirect_canonical/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 20:02:32 +0900</pubDate>
		<dc:creator>をかもと</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[プラグイン]]></category>

		<guid isPermaLink="false">http://dogmap.jp/?p=2305</guid>
		<description><![CDATA[ちょっとピコンときたので、WordPress 2.3から導入された機能「カノニカルURL」を使って、短縮urlを実現するプラグインを書いてみました。
まだまだβ段階もいいところなんですが、とりあえず公開しておきます。ご要 [...]]]></description>
			<content:encoded><![CDATA[<p>ちょっとピコンときたので、WordPress 2.3から導入された機能<a href="http://detlog.org/archives/540" title="WordPress 2.3の新機能「カノニカルURL」 | detlog.org">「カノニカルURL」</a>を使って、短縮urlを実現するプラグインを書いてみました。<br />
まだまだβ段階もいいところなんですが、とりあえず公開しておきます。ご要望をお寄せください。<br />
<a href="http://dl.getdropbox.com/u/110305/New/short-link-maker.zip">http://dl.getdropbox.com/u/110305/New/short-link-maker.zip</a></p>
<p>このプラグインを有効化すると、シングルページの &lt;head&gt; 内に <code>&lt;link rel=&quot;shortlink&quot; href=&quot;http://dogmap.jp/〜&quot; /&gt;</code> という META タグが吐き出されます。<br />
また、この META タグの href に対してアクセスすると、正式なURLにリダイレクトされるようになります。<br />
Twitter や、印刷した紙に短い URL を書きたいときなんかに使ってください。<br />
ちなみに URL は、単純に post_ID を62進数に変換しただけのものなので、カテゴリ一覧やタグ一覧などでは使えません。<br />
あくまでも post_ID を持っているページのみに対応しています。<br />
<span id="more-2305"></span></p>
<p>さて、これを作る際に困ったのが redirect_canonical フィルタの使い方。<br />
<code>wp-includes/canonical.php</code> を見ると分かりますが、いつもどおり add_filter() で単純に使うだけだとハマりますので注意してください。<br />
# つうか、限りなく仕様不備のような気もする。</p>
<p>カノニカルURL機能を実現しているのは <code>redirect_canonical()</code> という関数です。<br />
この関数の最後で <code>$redirect_url = apply_filters('redirect_canonical', $redirect_url, $requested_url);</code> とやって、&#39;redirect_canonical&#39; というフィルターを使えるようにしてくれているので、このフィルターをフックしてやれば、リクエストがあったURLとは違うURLにリダイレクトしてやることができます。<br />
が、この redirect_canonical() 関数、apply_filter() を呼んだ後で、そのリダイレクト先のURLが正しいかどうかをチェックするために、再度自分を呼んでる(293行目)のです。</p>
<pre class="brush: php; first-line: 282; auto-links: false;">	if ( $redirect_url == $requested_url )
		return false;

	// Note that you can use the &quot;redirect_canonical&quot; filter to cancel a canonical redirect for whatever reason by returning FALSE
	$redirect_url = apply_filters(&#039;redirect_canonical&#039;, $redirect_url, $requested_url);

	if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
		return false;

	if ( $do_redirect ) {
		// protect against chained redirects
		if ( !redirect_canonical($redirect_url, false) ) {
			wp_redirect($redirect_url, 301);
			exit();
		} else {
			// Debug
			// die(&quot;1: $redirect_url&lt;br /&gt;2: &quot; . redirect_canonical( $redirect_url, false ) );
			return false;
		}
	} else {
		return $redirect_url;
	}</pre>
<p>WordPress のカノニカルURL機能では、実在しないURLをリクエストされた時、似たようなURLをサイト内から探して候補を出します。<br />
例えば <code>http://dogmap.jp/<strong>pU</strong></code> という URL がリクエストされた場合、 WordPress は <code>http://dogmap.jp/2007/09/05/<strong>pu</strong>t-scripts-at-the-bottom/</code> をリダイレクト先の候補にします。<br />
しかし、本当は <code>http://dogmap.jp/pU</code> という URL は、post ID 1606 の <code>http://dogmap.jp/2008/03/12/wordpress-233-feed/</code> にリダイレクトさせたいのです。<br />
そこで &#39;redirect_canonical&#39; というフィルターをフックして <code>http://dogmap.jp/pU</code> という URL がリクエストされた場合 <code>http://dogmap.jp/2008/03/12/wordpress-233-feed/</code> をリダイレクト先に指定してやるのですが、２回目にフィルタを呼ばれたときに正常にフィルタ内の関数が動作しない&#8230;</p>
<p>というわけで、以下のような実装にしました。</p>
<pre class="brush: php; auto-links: false;">function redirect_shortlink($redirect_url, $requested_url){
	remove_filter(&#039;redirect_canonical&#039;, &#039;redirect_shortlink&#039; );

	if (empty($requested_url)) return $redirect_url;

	$siteurl = trailingslashit(get_option(&#039;siteurl&#039;));
	$pattern = &#039;/^&#039; . preg_quote($siteurl, &#039;/&#039;) . &#039;([\da-zA-Z]+)$/&#039;;
	if ( preg_match_all( $pattern, $requested_url, $matches ) ) {
		$link_id = $matches[1][0];
		$post_id = n_to_dec($link_id, 62);
		if ( $post_id !== FALSE ) $redirect_url = get_permalink($post_id);
		if ( empty($redirect_url) )
			$redirect_url = ( preg_match(&#039;/[\d]+/&#039;, $link_id)
				? get_permalink($link_id)
				: get_permalink(hexdec($link_id))
			);
		add_filter(&#039;redirect_canonical&#039;, create_function( &#039;&#039;, &quot;return &#039;$redirect_url&#039;;&quot;));
	}
	unset($matches);

	return $redirect_url;
}
add_filter(&#039;redirect_canonical&#039;, &#039;redirect_shortlink&#039;, 10, 2 );</pre>
<p>redirect_canonical() 関数が二回目に呼び出されたときには、一度目に取得したリダイレクトURLを返すようにフィルターを変更しています。</p>
]]></content:encoded>
			<wfw:commentRss>http://dogmap.jp/2009/10/23/redirect_canonical/feed/</wfw:commentRss>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://dogmap.jp/2009/10/23/redirect_canonical/" />
	</item>
	</channel>
</rss>
