<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>X-&#62;A-&#62;O</title>
	<atom:link href="http://blog.xao.jp/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.xao.jp/blog</link>
	<description>xao.jp</description>
	<lastBuildDate>Sun, 04 Apr 2010 09:12:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/" />
		<item>
		<title>Controller から View に &#8216;title&#8217; を セットする際の注意</title>
		<link>http://blog.xao.jp/blog/?p=126</link>
		<comments>http://blog.xao.jp/blog/?p=126#comments</comments>
		<pubDate>Sun, 04 Apr 2010 08:30:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=126</guid>
		<description><![CDATA[

CakePHP では、意外なところに例外的な措置があって、思わぬ事態に遭遇することがあります。知っていれば便利な機能も、知らないと逆に不便。
今回は、Controller::set で、&#8217;title&#8 [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>CakePHP では、意外なところに例外的な措置があって、思わぬ事態に遭遇することがあります。知っていれば便利な機能も、知らないと逆に不便。</p>
<p>今回は、Controller::set で、&#8217;title&#8217; をキーにしてViewに値を渡そうとして発覚。</p>
<p>&#8216;title&#8217; というキーは、<a href="http://api12.cakephp.org/class/controller#method-Controllerset">Controller::set</a> で特別な意味を持ちます。<br />
すなわち、&#8217;title&#8217; というキーで変数をセットした場合、Viewファイル内で $title として展開されず、レイアウトファイルの $title_for_layout ( ページタイトル) として展開されます。</p>
<pre class="brush:php">/**
 * Saves a variable for use inside a view template.
 *
 * @param mixed $one A string or an array of data.
 * @param mixed $two Value in case $one is a string (which then works as the key).
 *   Unused if $one is an associative array, otherwise serves as the values to $one's keys.
 * @return void
 * @access public
 * @link http://book.cakephp.org/view/427/set
 */
	function set($one, $two = null) {
		$data = array();

		if (is_array($one)) {
			if (is_array($two)) {
				$data = array_combine($one, $two);
			} else {
				$data = $one;
			}
		} else {
			$data = array($one =&gt; $two);
		}

		foreach ($data as $name =&gt; $value) {
			if ($name === 'title') {
				$this-&gt;pageTitle = $value;
			} else {
				if ($two === null &amp;&amp; is_array($one)) {
					$this-&gt;viewVars[Inflector::variable($name)] = $value;
				} else {
					$this-&gt;viewVars[$name] = $value;
				}
			}
		}
	}
</pre>
<p>この25行目を見ると明らかですが、つまり、コントローラーで &#8216;title&#8217;というキーで値をセットしても、Viewには渡らないということです。なので、この箇所をオーバーライドするか、別のキーで値を渡すようにしなくてはなりませんね。</p>
<p>ただ、こんな肝心なメソッドを上書きしちゃうと、他のアプリの構築のときにまた勝手が変わって面倒なことになるのでそれはしたくないです。また、&#8217;title&#8217;という文字だけ特別扱いするというのも汎用性に欠けるため好ましくない(変数の構成が動的に変化する場合、必ずしも変数のキーを知っているとは限らないから)。</p>
<p>なので、今後 Viewに値を渡す場合は、常にハッシュでくるんで、Viewでそれを展開することにしたいと思っています。というか、これまではその方法だったのですが、今回初めて直接 &#8216;title&#8217; というキーを用いたため気づきました。</p>
<p>このような親切設計も、その実装を知っていれば便利ですが、そうでない場合はかえって時間がかかって困ってしまいますね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=126</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=126" />
	</item>
		<item>
		<title>Element から別のElement を呼び出す</title>
		<link>http://blog.xao.jp/blog/?p=109</link>
		<comments>http://blog.xao.jp/blog/?p=109#comments</comments>
		<pubDate>Sun, 07 Mar 2010 06:13:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=109</guid>
		<description><![CDATA[

公式マニュアルを含むWeb上の情報で見つけることができなかったので、メモしておきます。
そもそも、CakePHPを体系的に理解できている人、具体的には Element が View でどのように展開されているのかを理 [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>公式マニュアルを含むWeb上の情報で見つけることができなかったので、メモしておきます。</p>
<p>そもそも、CakePHPを体系的に理解できている人、具体的には Element が View でどのように展開されているのかを理解している人にとっては自明なことで、いちいち疑問にならないことかもしれません。<br />
私自身は非常に行き当たりばったりの付け焼刃な知識しかない上、ソースを読む時間もなかったので単純な処方箋のみになります。<br />
時間のある方は是非一度詳しくお調べになってください。</p>
<p>何がしたいのかというと、Viewから呼び出したElementの中から、さらに別のElementを呼び出すことです。</p>
<p>結論だけ言いますと、Viewに記述するのと全く同じやり方で問題なさそうです。</p>
<p>たとえば、View ファイル view.ctp から Elementファイル elm1.ctp を呼び出す。そして、その elm1.ctp の中に、別のElementファイル elm2.ctp を呼び出す記述をする場合、次の通りで問題ないというのが今のところの結果です。</p>
<p>view.ctp内</p>
<pre class="brush:php">echo $this -&gt; element( "elm1" );</pre>
<p>elm1.ctp内</p>
<pre class="brush:php">echo $this -&gt; element( "elm2" );</pre>
<p>ViewからElementへ新たにパラメータを追加した場合、そのパラメータは引き継がない。<br />
たとえば、view.ctp から、 elm1.ctp へ追加したパラメータを elm2.ctp でも追加したい場合は、 elm1.ctp 内で同様に明示的に追加する必要がある。</p>
<p>view.ctp内</p>
<pre class="brush:php">$params = array( "name1" =&gt; "value1" );
echo $this -&gt; element( "elm1", $params );</pre>
<p>elm1.ctp内</p>
<pre class="brush:php">echo $this -&gt; element( "elm2", $params );
//echo $this -&gt; element( "elm2" ); //これでは $params は elm2.ctp には渡らない</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=109</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=109" />
	</item>
		<item>
		<title>mb_convert_kana のオプション</title>
		<link>http://blog.xao.jp/blog/?p=103</link>
		<comments>http://blog.xao.jp/blog/?p=103#comments</comments>
		<pubDate>Tue, 02 Feb 2010 06:40:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=103</guid>
		<description><![CDATA[

php の mb_convert_kana のオプションを決める際に、毎度まいどリファレンスを見直してるんでさすがに嫌になってきた。










分類
記号
例
意味


半角へ変換
r
Ａ→A
全角英字を半 [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>php の mb_convert_kana のオプションを決める際に、毎度まいどリファレンスを見直してるんでさすがに嫌になってきた。</p>
<p><!--   		BODY,DIV,TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { font-family:"ＭＳ Ｐゴシック"; font-size:x-small } --></p>
<table border="1" cellspacing="0" frame="VOID" rules="NONE">
<colgroup>
<col width="143"></col>
<col width="41"></col>
<col width="61"></col>
<col width="311"></col>
</colgroup>
<tbody>
<tr>
<td width="143" height="17" align="CENTER" bgcolor="#008080"><strong><span style="color: #ffffff;">分類</span></strong></td>
<td width="41" align="CENTER" bgcolor="#008080"><strong><span style="color: #ffffff;">記号</span></strong></td>
<td width="61" align="CENTER" bgcolor="#008080"><strong><span style="color: #ffffff;">例</span></strong></td>
<td width="311" align="CENTER" bgcolor="#008080"><strong><span style="color: #ffffff;">意味</span></strong></td>
</tr>
<tr>
<td rowspan="6" height="106" align="CENTER" valign="MIDDLE"><strong>半角へ変換</strong></td>
<td align="LEFT" bgcolor="#99ccff"><span style="font-family: Arial;">r</span></td>
<td align="LEFT" bgcolor="#99ccff">Ａ→A</td>
<td align="LEFT">全角英字を半角英字へ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#99ccff"><span style="font-family: Arial;">n</span></td>
<td align="LEFT" bgcolor="#99ccff">１→1</td>
<td align="LEFT">全角数字を半角数字へ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#99ccff"><span style="font-family: Arial;">a</span></td>
<td align="LEFT" bgcolor="#99ccff">Ａ１→A1</td>
<td align="LEFT">全角英数字を半角英数字へ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#99ccff"><span style="font-family: Arial;">s</span></td>
<td align="LEFT" bgcolor="#99ccff">＿→_</td>
<td align="LEFT">全角スペースを半角スペースへ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#99ccff"><span style="font-family: Arial;">k</span></td>
<td align="LEFT" bgcolor="#99ccff">ガ→ｶﾞ</td>
<td align="LEFT">全角カタカナを半角カタカナへ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#99ccff"><span style="font-family: Arial;">h</span></td>
<td align="LEFT" bgcolor="#99ccff">が→ｶﾞ</td>
<td align="LEFT">全角ひらがなを半角カタカナへ</td>
</tr>
<tr>
<td rowspan="8" height="143" align="CENTER" valign="MIDDLE"><strong>全角へ変換</strong></td>
<td align="LEFT" bgcolor="#ffffcc"><span style="font-family: Arial;">R</span></td>
<td align="LEFT" bgcolor="#ffffcc">A→Ａ</td>
<td align="LEFT">半角英字を全角英字へ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#ffffcc"><span style="font-family: Arial;">N</span></td>
<td align="LEFT" bgcolor="#ffffcc">1→１</td>
<td align="LEFT">半角数字を全角数字へ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#ffffcc"><span style="font-family: Arial;">A</span></td>
<td align="LEFT" bgcolor="#ffffcc">A1→Ａ１</td>
<td align="LEFT">半角英数字を全角英数字へ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#ffffcc"><span style="font-family: Arial;">S</span></td>
<td align="LEFT" bgcolor="#ffffcc">_→＿</td>
<td align="LEFT">半角スペースを全角スペースへ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#ffffcc"><span style="font-family: Arial;">K</span></td>
<td align="LEFT" bgcolor="#ffffcc">ｶﾞ→カ゛</td>
<td align="LEFT">半角カタカナを全角カタカナへ(濁点記号は分離)</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#ffffcc"><span style="font-family: Arial;">H</span></td>
<td align="LEFT" bgcolor="#ffffcc">ｶﾞ→か゛</td>
<td align="LEFT">半角カタカナを全角ひらがなへ(濁点記号は分離)</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#ffff66"><span style="font-family: Arial;">KV</span></td>
<td align="LEFT" bgcolor="#ffff66">ｶﾞ→ガ</td>
<td align="LEFT">半角カタカナを全角カタカナへ(濁点記号を一文字に)</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#ffff66"><span style="font-family: Arial;">HV</span></td>
<td align="LEFT" bgcolor="#ffff66">ｶﾞ→が</td>
<td align="LEFT">半角カタカナを全角ひらがなへ(濁点記号を一文字に)</td>
</tr>
<tr>
<td rowspan="2" height="34" align="CENTER" valign="MIDDLE"><strong>ひらがなカタカナ変換</strong></td>
<td align="LEFT" bgcolor="#ffcc99"><span style="font-family: Arial;">c</span></td>
<td align="LEFT" bgcolor="#ffcc99">ガ→が</td>
<td align="LEFT">全角カタカナを全角ひらがなへ</td>
</tr>
<tr>
<td align="LEFT" bgcolor="#ffcc99"><span style="font-family: Arial;">C</span></td>
<td align="LEFT" bgcolor="#ffcc99">が→ガ</td>
<td align="LEFT">全角ひらがなを全角カタカナへ</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=103</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=103" />
	</item>
		<item>
		<title>Scaffolding の、 index の行数を変える</title>
		<link>http://blog.xao.jp/blog/?p=100</link>
		<comments>http://blog.xao.jp/blog/?p=100#comments</comments>
		<pubDate>Sun, 01 Nov 2009 15:23:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Scaffold]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=100</guid>
		<description><![CDATA[

Scaffold クラスは、コントローラの $paginate メンバー変数を参照している。
デフォルトでは
var $paginate = array('limit' =&#62; 20, 'page' =&#62;  [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>Scaffold クラスは、コントローラの $paginate メンバー変数を参照している。</p>
<p>デフォルトでは</p>
<pre class="brush:php">var $paginate = array('limit' =&gt; 20, 'page' =&gt; 1);</pre>
<p>なので、1ページ目の20行が表示される。</p>
<p>これを、Controller の継承クラスで上書きして任意に調整。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=100</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=100" />
	</item>
		<item>
		<title>スロツール、アカウント停止中・・・ orz&#8230;</title>
		<link>http://blog.xao.jp/blog/?p=91</link>
		<comments>http://blog.xao.jp/blog/?p=91#comments</comments>
		<pubDate>Sat, 31 Oct 2009 13:36:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=91</guid>
		<description><![CDATA[

まさに青天の霹靂ですが、私の運営しているスロツール.comが、本日の明け方、レンタルサーバー事業者様より、突如アカウントを停止されてしまいました。
もし、スロツールのユーザーさんで、ここをご覧になっているのなら、つま [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>まさに青天の霹靂ですが、私の運営している<a title="スロツール" href="http://slotool.com/" target="_self">スロツール.com</a>が、本日の明け方、レンタルサーバー事業者様より、突如アカウントを停止されてしまいました。</p>
<p>もし、スロツールのユーザーさんで、ここをご覧になっているのなら、つまりそういうわけです。本当にすいません。</p>
<p>理由は、スクリプトの負荷が高すぎるためらしいです。</p>
<p>あぁ、他人事だと思っていたアカ停止がまさか自分に降りかかってくるとは。。。<br />
確かに月200円少しの値段にしては、いろいろとやっていたかもしれません。<br />
そして、サーバー運営者にも当然事情はおありでしょう。<br />
私一人のせいで、他の多くの顧客からクレームが来ていたのだとしたら、高々年間数千円程度のユーザーを重く見ることもないでしょう。</p>
<p>しかし、せめて事前に警告ぐらいしてくれてもいいんじゃないの？</p>
<p>とにかく、こちらとしてはどんな形であれ再稼動させたいわけですが、いくつか提案させていただいたのにナシのツブテ。いったいどうしろと？</p>
<p>マジ、連絡して欲しいですよ。</p>
<hr class="break" />と、22：36にエントリーしているあいだ、アカウント再開のメールが22:34に到着していました。早速、負荷軽減バージョンと差し替え。</p>
<p>ただし、</p>
<blockquote><p>アカウントを元の状態に戻しましたので、ご確認ください。</p>
<p>再度高負荷の状態になった場合、アカウントの停止を行います。ご了承ください。</p>
<p>よろしくお願いいたします。</p></blockquote>
<p>とのことなので、いよいよ別のサーバーへ移転せざるを得ないときがやってきたようです。この文面を見れば、一切の警告ナシで、即アウトになる恐れがあるので、戦々恐々としています。</p>
<p>安いから仕方ない、のだろうか？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=91</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=91" />
	</item>
		<item>
		<title>Model のメンバー変数($belongsTo など)を、コンストラクタで設定する</title>
		<link>http://blog.xao.jp/blog/?p=86</link>
		<comments>http://blog.xao.jp/blog/?p=86#comments</comments>
		<pubDate>Wed, 21 Oct 2009 14:27:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=86</guid>
		<description><![CDATA[

気付いたのでメモ。
「Model::$belongsTo などを、コンストラクタで設定する場合、式の右辺が配列にならないようにするべき。」
たとえば、一般にメンバーフィールドとして記述する際には、必要な値のみ、
cl [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>気付いたのでメモ。<br />
「Model::$belongsTo などを、コンストラクタで設定する場合、式の右辺が配列にならないようにするべき。」</p>
<p>たとえば、一般にメンバーフィールドとして記述する際には、必要な値のみ、</p>
<pre class='brush:php'>class Hoge extends AppModel
{
  var $belongsTo["Moge"] = array(
    "className" =&gt; "Moge",
    "foreignKey" =&gt; "moge_id",
  );

}</pre>
<p>とすればいいですが、これと同じことをやったつもりでも、コンストラクタに以下のように書くと思った通りに動作しません。</p>
<pre class='brush:php'>class Hoge extends AppModel
{
  function __construct()
  {
     parent::__construct();
     $this -&gt; belongsTo["Moge"] = array(
       "className" =&gt; "Moge",
       "foreignKey" =&gt; "moge_id",
     );
  }
}</pre>
<p>ソースを読む時間がないので処方箋だけを言えば、</p>
<pre class='brush:php'>class Hoge extends AppModel
{
  function __construct()
  {
    parent::__construct();
    $this -&gt; belongsTo["Moge"]["className"] = "Moge";
    $this -&gt; belongsTo["Moge"]["foreignKey"] =&gt; "moge_id";
  }
}</pre>
<p>と、する。</p>
<p>親クラスのインスタンス化の際に、&#8221;className&#8221;, &#8220;foreignKey&#8221; だけでなく、&#8221;conditions&#8221;, &#8220;fields&#8221;, &#8220;order&#8221;, &#8220;counterCache&#8221; にも空の値(stirng(0) &#8220;&#8221;)がセットされています。</p>
<pre class='brush:php'>$this -&gt; belongsTo = array(
  "Moge" =&gt; array(
    "className" =&gt; "Moge",
    "foreignKey" =&gt; "Hoge.moge_id",
    "conditions" =&gt; "",
    "fields" =&gt; "",
    "order" =&gt; "",
    "counterCache" =&gt; "",
  )
);</pre>
<p>これら6つの要素のすべてか、一部かは分かりませんが、$belongsTo["Moge"]配列のキーとして、たとえ空の値であってもセットされていないと、アソシエーションを組んでくれないみたいです。</p>
<p>なので、コンストラクタでこれを定義する際は、それらの空の要素も含めて指定するか、必要な値のみを(配列ではなく、次数を落として)文字でセットする必要があります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=86</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=86" />
	</item>
		<item>
		<title>blogger API の XML_RPC の原典は?</title>
		<link>http://blog.xao.jp/blog/?p=73</link>
		<comments>http://blog.xao.jp/blog/?p=73#comments</comments>
		<pubDate>Fri, 16 Oct 2009 03:20:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=73</guid>
		<description><![CDATA[

今、ブログ投稿APIを整理しています。
調査中なので、やがて判明するかもしれませんが、覚え書きしておきます。
blogger.deletePost のパラメータが、MovableType と、それ以外とで異なっている [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>今、ブログ投稿APIを整理しています。</p>
<p>調査中なので、やがて判明するかもしれませんが、覚え書きしておきます。</p>
<p>blogger.deletePost のパラメータが、MovableType と、それ以外とで異なっていることに気づいたのが疑問の発端。 (っていうか、MovableTypeの下記のドキュメントが、単に間違っているっぽいんですが。。。)</p>
<p>MovableType の blogger.deletePost パラメータ (<a href="http://www.sixapart.jp/movabletype/manual/3.3/03_blog_admin_guide/customizing_blogs/xmlrpc_api.html">参考</a>)</p>
<ul>
<li>String appkey</li>
<li>String postid</li>
<li>String username</li>
<li>String password</li>
<li><span style="color: #ff0000;">String content</span></li>
<li>boolean publish</li>
</ul>
<p>そのほかの blogger.deletePost のパラメータ(<a href="http://msdn.microsoft.com/ja-jp/library/aa905663.aspx">参考</a>, <a href="http://www.na.rim.or.jp/~tsupo/program/blogTool/mt_xmlRpc.html">参考</a>)</p>
<ul>
<li>String appkey</li>
<li>String postid</li>
<li>String username</li>
<li>String password</li>
<li>boolean publish</li>
</ul>
<p>実験してみればすぐに分かることかも知れませんが、今のところ特に問題にならないので完全にスルーしてます。要するに、インターフェイスが2種類存在しちゃってるので、blogger の APIにバージョンが複数あるのでなければ、どちらかが間違っているかということでしょう。接頭辞に&#8217;mt.&#8217;が付いてるわけじゃないので、MovableTypeの独自APIでも無いわけで。 なんとなく、deletePost ってメソッドに &#8216;content&#8217; っていうパラメータは不要な気がします。</p>
<p>そこで、肝心の Blogger なのですが、現在は AtomPublishingProtocol に移行しちゃって、 XML-RPCは過去の遺物（<a href="http://www.blogger.com/developers/api/1_docs/">Blogger API</a>）としてしか扱ってないみたい。 &#8216;This documentation is provided for <strong>historical interest 	  only</strong>.&#8217; などと前書きがあるし、その内容には&#8217;実験的なんで、いつ変わるか分かりません&#8217;と但し書きが添えてある状態で放置しているのです。</p>
<p>そして、この過去の遺物のどこをひっくり返しても blogger.deletePost にお目にかかれないという次第。どなたかご存知の方がいらっしゃいましたらご教授下さいませ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=73</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=73" />
	</item>
		<item>
		<title>携帯用CAPTCHA(画像認証)</title>
		<link>http://blog.xao.jp/blog/?p=67</link>
		<comments>http://blog.xao.jp/blog/?p=67#comments</comments>
		<pubDate>Mon, 12 Oct 2009 08:46:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=67</guid>
		<description><![CDATA[

携帯向けの画像認証スクリプトを公開しました。
以下のページでデモの確認とダウンロードが行えます。
http://u.xao.jp/zubotcha_m/
特徴は以下の通り

クッキーを使わない
数字のみの入力
設置が [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>携帯向けの画像認証スクリプトを公開しました。</p>
<p>以下のページでデモの確認とダウンロードが行えます。</p>
<p><a href="http://u.xao.jp/zubotcha_m/">http://u.xao.jp/zubotcha_m/</a></p>
<p>特徴は以下の通り</p>
<ul>
<li>クッキーを使わない</li>
<li>数字のみの入力</li>
<li>設置が（たぶん）とても簡単</li>
</ul>
<p>厳密にCAPTCHAといえば、コンピュータと人間を区別するためのものですが、これは人間に対して、投稿アクションの心理的なハードルを高める目的が主です。いわゆる一つのシシオドシ。</p>
<p>もちろん、画像のフィルタリングを複雑にして、ロボット対策も可能になりますが、そうするのであれば、もっと高機能なスクリプト、たとえば <a href="http://goodphp.mirrors.phpclasses.org/browse/package/3193.html">KCAPTCHA</a> などを利用する方が良いでしょう。</p>
<p>それから、ワンタイムハッシュの発行なんかも実装してないので、二重ポストの防止にもなりません。これは、いずれ必要なときに追加しようと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=67</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=67" />
	</item>
		<item>
		<title>php imagettftext()</title>
		<link>http://blog.xao.jp/blog/?p=61</link>
		<comments>http://blog.xao.jp/blog/?p=61#comments</comments>
		<pubDate>Sun, 11 Oct 2009 16:01:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=61</guid>
		<description><![CDATA[

パラメータ $angle の説明は、原文は &#8216;counter-clockwise&#8217;  なんで、「反時計回り」が正しい。
たまにこの関数を使うたびに気づくんですけど、そのうち訂正されると思ってて [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>パラメータ $angle の説明は、原文は &#8216;counter-clockwise&#8217;  なんで、「反時計回り」が正しい。<br />
たまにこの関数を使うたびに気づくんですけど、そのうち訂正されると思っててもそのままです。</p>
<p><a href="http://www.php.net/manual/ja/function.imagettftext.php">http://www.php.net/manual/ja/function.imagettftext.php</a></p>
<p>ps: メーリングリストに参加して具申いたしたところ、直ちに修正していただけました。有難うございます！(2009/10/21 確認)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=61</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=61" />
	</item>
		<item>
		<title>WordPress の、 do_action って関数を見てみた</title>
		<link>http://blog.xao.jp/blog/?p=48</link>
		<comments>http://blog.xao.jp/blog/?p=48#comments</comments>
		<pubDate>Sun, 04 Oct 2009 15:17:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.xao.jp/blog/?p=48</guid>
		<description><![CDATA[

現在ほとんどデフォルトのままの WordPress 。
とりあえず、差し迫って必要なことは無いのだけど、なにかいじってみたいので Google Analytics を挿入してみようと思います。
結論を言いますと、結局 [...]]]></description>
			<content:encoded><![CDATA[
<!-- ALL ADSENSE ADS DISABLED -->
<p>現在ほとんどデフォルトのままの WordPress 。<br />
とりあえず、差し迫って必要なことは無いのだけど、なにかいじってみたいので Google Analytics を挿入してみようと思います。</p>
<p>結論を言いますと、結局先人の開発したすばらしいプラグイン <a href="OraTransplant » Ultimate Google Analytics plugin for WordPress" target="_blank">Ultimate Google Analytics plugin for WordPress</a> を使用しました。</p>
<p>なので、以下は単にソースを読んだときのメモです。</p>
<p>吐き出されたHTMLソースから、どうやら wp_footer() という関数に、好きなコードを吐き出させるみたい。んで、この wp_footer が何をしているのかたどっていく。</p>
<p>すると、</p>
<p>wp-content\themes\default\footer.php(14)<br />
wp-includes\general-template.php(1362)<br />
wp-includes\plugin.php(299)</p>
<p>までたどり着いたのですが、この、 plugin.php にある</p>
<p>function do_action</p>
<p>ていうのはよく読まないと先へ進めないです。<br />
で、私なりに読んで解釈したのをメモします。<br />
ちなみに、この関数はいたるところで呼び出されていると思いますが、今回はあくまでもフッタの記述。つまり、引数として &#8220;wp_footer&#8221; っていう文字列を渡している場合に限られます。そして、トップページでの呼び出しでのみ調べたことなので、ページが異なれば挙動が変わる可能性も大いにありです。</p>
<pre class="brush:php">function do_action($tag, $arg = '') {
  // 4つのグローバル変数を関数内で展開
  global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;

  // 配列 $wp_actions に "wp_footer" をプッシュ。
  if ( is_array($wp_actions) )
    $wp_actions[] = $tag;
  else
    $wp_actions = array($tag);

  // 配列 $wp_current_filter にも "wp_footer" をプッシュ。(これは、空の配列でした)
  $wp_current_filter[] = $tag;

  // $wp_filter['all'] はセットされていないのでパス
  // Do 'all' actions first
  if ( isset($wp_filter['all']) ) {
    $all_args = func_get_args();
    _wp_call_all_hook($all_args);
  }

  /*-------------------------------------
   $wp_filter[$tag] がセットされていなければ、
   $wp_current_filter から先ほどの "wp_footer" をポップして終了しますが、
   $wp_filter['wp_footer'] に値があるので続く。
   この、 $wp_filter の該当する箇所を抜き出すとこんな風。

  array(
    [wp_footer] =&gt; array
    (
      [10] =&gt; array
      (
        [wp_print_footer_scripts] =&gt; array
        (
          [function] =&gt; wp_print_footer_scripts
          [accepted_args] =&gt; 1
      )

      )

    )
  )

  ここに、処理内容をスタックさせているのでしょう。
  ---------------------------------------*/
  if ( !isset($wp_filter[$tag]) ) {
    array_pop($wp_current_filter);
    return;
  }

  // $args には何もセットされない。
  $args = array();
  if ( is_array($arg) &amp;&amp; 1 == count($arg) &amp;&amp; is_object($arg[0]) ) // array(&amp;$this)
    $args[] =&amp; $arg[0];
  else
    $args[] = $arg;
  for ( $a = 2; $a &lt; func_num_args(); $a++ )
    $args[] = func_get_arg($a);

  /*----------------------------------------
  $merged_filters[$tag] がセットされていないので

  ksort($wp_filter[$tag]);
  $merged_filters[ $tag ] = true;

  っていう処理を行う。けど、$wp_filter['wp_footer'] は、
  1つしか要素が無いので順番は変わらない。 reset してもポインタに影響なし。
  -----------------------------------------*/
  // Sort
  if ( !isset( $merged_filters[ $tag ] ) ) {
    ksort($wp_filter[$tag]);
    $merged_filters[ $tag ] = true;
  }

  reset( $wp_filter[ $tag ] );

  /*-------------------------------------------
  いよいよここで、$wp_filter['wp_footer']
  にセットされたタスクを処理

  current だとか、array にキャストだとか、
  私が使ったことの無い、良く分からんけど なんかかっこいい
  テクニックが最後に出てきてしまいましたが、
  要は $wp_filter['wp_footer'] から、配列を抜き出して、
  その配列を foreach でループさせているのですね。(違う?)
  PHPでポインタとか考えたこと無かったんで、この辺ちょっと勉強不足です。

  で、実際に何を実行しているかというと、

  関数 wp_print_footer_scripts() の呼び出しなのですね。
  受け取る引数の数が 1 ですが、 $args には何も入っていないので、
  wp_print_footer_scripts() には、空の配列が渡されて終了。
  -------------------------------------------*/
  do {
    foreach ( (array) current($wp_filter[$tag]) as $the_ )
      if ( !is_null($the_['function']) )
        call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));

  } while ( next($wp_filter[$tag]) !== false );

  // 最初にプッシュした "wp_footer" をポップして(空に戻る)終了。
  array_pop($wp_current_filter);
}</pre>
<p>で、肝心のフッタの挿入ですが、 wp_print_footer_scripts は、  print_footer_scripts を呼び出していています。（ふぅーっ）</p>
<p>ここまできて、これはやはり先人のご意見を伺おうとググってみたわけです。</p>
<p>「WordPress Google」 ここまで入力した時点で、アナリティクス(って、しかもカタカナで)補完(笑)</p>
<p>はい、すばらしいプラグインがありました。</p>
<p><a href="http://www.oratransplant.nl/uga/" target="_blank">http://www.oratransplant.nl/uga/</a></p>
<p>ありがとう御座いました。</p>
<p>すごいこれ！<br />
ログイン中のユーザーに対してはスクリプト吐き出さないんですね！</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 321px; width: 1px; height: 1px;">function do_action($tag, $arg = &#8221;) {<br />
// 4つのグローバル変数を関数内で展開<br />
global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;</p>
<p>// 配列 $wp_actions に &#8220;wp_footer&#8221; をプッシュ。<br />
if ( is_array($wp_actions) )<br />
$wp_actions[] = $tag;<br />
else<br />
$wp_actions = array($tag);</p>
<p>// 配列 $wp_current_filter にも &#8220;wp_footer&#8221; をプッシュ。(これは、空の配列でした)<br />
$wp_current_filter[] = $tag;</p>
<p>// $wp_filter['all'] はセットされていないのでパス<br />
// Do &#8216;all&#8217; actions first<br />
if ( isset($wp_filter['all']) ) {<br />
$all_args = func_get_args();<br />
_wp_call_all_hook($all_args);<br />
}</p>
<p>/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
$wp_filter[$tag] がセットされていなければ、 $wp_current_filter から先ほどの &#8220;wp_footer&#8221; をポップして終了しますが、 $wp_filter['wp_footer'] に値があるので続く。<br />
この、 $wp_filter が興味深い。該当する箇所を抜き出すとこんな風。</p>
<p>array(<br />
[wp_footer] =&gt; array<br />
(<br />
[10] =&gt; array<br />
(<br />
[wp_print_footer_scripts] =&gt; array<br />
(<br />
[function] =&gt; wp_print_footer_scripts<br />
[accepted_args] =&gt; 1<br />
)</p>
<p>)</p>
<p>)<br />
)</p>
<p>ここに、処理内容をスタックさせているのでしょう。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*/<br />
if ( !isset($wp_filter[$tag]) ) {<br />
array_pop($wp_current_filter);<br />
return;<br />
}</p>
<p>// $args には何もセットされない。<br />
$args = array();<br />
if ( is_array($arg) &amp;&amp; 1 == count($arg) &amp;&amp; is_object($arg[0]) ) // array(&amp;$this)<br />
$args[] =&amp; $arg[0];<br />
else<br />
$args[] = $arg;<br />
for ( $a = 2; $a &lt; func_num_args(); $a++ )<br />
$args[] = func_get_arg($a);</p>
<p>/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
$merged_filters[$tag] がセットされていないので</p>
<p>ksort($wp_filter[$tag]);<br />
$merged_filters[ $tag ] = true;</p>
<p>っていう処理を行う。けど、$wp_filter['wp_footer'] は、1つしか要素が無いので順番は変わらない。 reset してもポインタに影響なし。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/<br />
// Sort<br />
if ( !isset( $merged_filters[ $tag ] ) ) {<br />
ksort($wp_filter[$tag]);<br />
$merged_filters[ $tag ] = true;<br />
}</p>
<p>reset( $wp_filter[ $tag ] );</p>
<p>/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
いよいよここで、$wp_filter['wp_footer']<br />
にセットされたタスクを処理</p>
<p>current だとか、array にキャストだとか、<br />
私が使ったことの無い良く分からんけど、<br />
なんかかっこいいテクニックが最後に出てきてしまいましたが、<br />
要は $wp_filter['wp_footer'] から、配列を抜き出して、<br />
その配列を foreach でループさせているのですね。(違う?)<br />
ポインタとか考えたこと無かったんで、この辺ちょっと勉強不足です。</p>
<p>で、実際に何を実行しているかというと、</p>
<p>関数 wp_print_footer_scripts() の呼び出しなのですね。<br />
受け取る引数の数が 1 ですが、 $args には何も入っていないので、<br />
wp_print_footer_scripts() には、空の配列が渡されて終了。<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-*/<br />
do {<br />
foreach ( (array) current($wp_filter[$tag]) as $the_ )<br />
if ( !is_null($the_['function']) )<br />
call_user_func_array($the_['function'], array_slice($args, 0, (int) $the_['accepted_args']));</p>
<p>} while ( next($wp_filter[$tag]) !== false );</p>
<p>// 最初にプッシュした &#8220;wp_footer&#8221; をポップして(空に戻る)終了。<br />
array_pop($wp_current_filter);<br />
}</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.xao.jp/blog/?feed=rss2&amp;p=48</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.xao.jp/blog/?p=48" />
	</item>
	</channel>
</rss>
