<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>hatotech::kumatch</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/" />
    <link rel="self" type="application/atom+xml" href="http://hatotech.org/kumatch/atom.xml" />
    <id>tag:hatotech.org,2007-09-28:/kumatch//2</id>
    <updated>2008-04-23T09:02:15Z</updated>
    <subtitle>日々のテクノロジー冒険記</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Publishing Platform 4.01</generator>

<entry>
    <title>「PHP DOMパーサを使ったテンプレートエンジン」Runemaster</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/04/23/php_domrunemast.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.724</id>

    <published>2008-04-23T08:36:06Z</published>
    <updated>2008-04-23T09:02:15Z</updated>

    <summary>できました。 Runemaster (http://hatotech.org/r...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dom" label="DOM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="library" label="library" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="runemaster" label="Runemaster" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="template" label="Template" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>できました。</p>

<p><a href="http://hatotech.org/runemaster/" target="_blank">Runemaster (http://hatotech.org/runemaster/)</a></p>

<p>これまで「PHP DOMパーサを使ってテンプレートエンジンを作ってみる」としてエントリをあげてきたライブラリが、このたびめでたく（まだベータ的なものですが）初めてのリリースと相成りました。</p>

<p>ライブラリが今の形に落ち着いてからドキュメントをカリカリと書いてたんですがこれが地味に時間がかかってしまっていたので、思い切って 2/3 ほど書いた現在の状態でひとまずリリースしちゃうことにしました。<br />
このまま継続してドキュメントは書き進めていきます。数日単位でポツポツといった感じになるでしょうが、上記サイトに掲載していきますのでどうぞよろしくお願いします。</p>

<p><br />
ちなみにこいつの名前については、はてブにて<a href="http://d.hatena.ne.jp/koyhoge/">小山さん</a>より「カッコイイ名前を付けるように」というお達しがありましたので、このようになりました。<br />
Runemasterは、多彩なSpellを組み合わせることで (x)html の力を Runeストーンに刻み込み、埋め込まれた秘められし力を引き出すことで様々な能力を発揮させることができるのだ！（ドギャァーン）</p>]]>
        
    </content>
</entry>

<entry>
    <title>PHP DOMパーサを使ってテンプレートエンジンを作ってみる4</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/04/10/php_dom4.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.723</id>

    <published>2008-04-09T15:45:43Z</published>
    <updated>2008-04-09T15:49:01Z</updated>

    <summary>この辺までくると、機能的なところでそんなに大きく進展はしてない感じではありますが...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dom" label="DOM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="library" label="library" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="template" label="Template" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>この辺までくると、機能的なところでそんなに大きく進展はしてない感じではありますが、継続的に報告もせんといかんよね！</p>

<p>新しく追加した機能は、フォームに対する値やエレメントの操作。この辺はPEARのHTML_Template_Flexyが良い感じだったので、それと出来る限り同じような使い方が出来るように。</p>

<p><strong>Template</strong></p>
<pre class="code">

&lt;form name="example"&gt;
  &lt;input type="text" name="email" /&gt;

  &lt;select name="person"&gt;
    &lt;option value="1"&gt;foo&lt;/option&gt;
    &lt;option value="2"&gt;bar&lt;/option&gt;
    &lt;option value="3"&gt;baz&lt;/option&gt;
  &lt;/select&gt;

  &lt;input name="item" type="radio" value="1" /&gt;foo
  &lt;input name="item" type="radio" value="2" /&gt;bar
  &lt;input name="item" type="radio" value="3" /&gt;baz
&lt;/form&gt;

</pre>

<p><strong>PHP</strong></p>
<pre class="code">

&lt;?php
$template = new Template();

$values = new stdClass();
$values-&gt;email = 'foo@example.com';
$values-&gt;person = 1;
$values-&gt;item = 2;

$template-&gt;setFormValues('example', $values);
$template-&gt;renderer('Example');
?&gt;

</pre>

<p><strong>Result</strong></p>
<pre class="code">

&lt;form name="example"&gt;
  &lt;input type="text" name="email" value="foo@example.com" /&gt;

  &lt;select name="person"&gt;
    &lt;option value="1" selected="selected"&gt;foo&lt;/option&gt;
    &lt;option value="2"&gt;bar&lt;/option&gt;
    &lt;option value="3"&gt;baz&lt;/option&gt;
  &lt;/select&gt;

  &lt;input name="item" type="radio" value="1" /&gt;foo
  &lt;input name="item" type="radio" value="2" checked="checked" /&gt;bar
  &lt;input name="item" type="radio" value="3" /&gt;baz
&lt;/form&gt;

</pre>

<p><a href="http://hatotech.org/kumatch/datas/template-20080409.zip">template-20080409.zip</a></p>

<p>地味に「PHPSpec を使った開発のケーススタディ」的な感じでテンプレートよりも好評な、Specによる仕様確認の現在はこちら。</p>
<pre class="code">
テンプレート変数割り当て
<font color="#008000">  - オブジェクトを割り当てると、プロパティがテンプレート変数として利用される
  - 連想配列を割り当てると、配列キーがテンプレート変数として利用される
  - テンプレート変数として配列が利用できる
  - テンプレート変数としてオブジェクトが利用できる
  - テンプレート変数は配列とオブジェクトが混合で利用できる
  - テンプレート変数として割り当てたクラスオブジェクトのメソッドが利用できる
  - テンプレート変数に対して関数が利用できる
  - テンプレート変数として指定する属性の名称が変更できる
  - 置換されるテンプレート変数は何もせずともhtmlspecialchars済み
  - 置換されるテンプレート変数のhtmlspecialcharsは個別で無効にできる
  - テンプレート内で同じ変数は、利用タグに関係なく何度でも使える
  - 値がassignされていないテンプレート変数は無視される
  - 値を割り当てるのに利用したタグは明示的に消去することができる
  - エレメント属性の値に対してのみ｛｝で囲んだテンプレート変数を利用できる</font>

エレメント操作
<font color="#008000">  - セレクタによる指定ノードのエレメントが追加、変更できる
  - セレクタによる複数対象のエレメントが追加、変更できる
  - エレメントの各要素のうち、今のところタグ名は変えれない</font>

フォーム操作
<font color="#008000">  - テキストラインへ値をセットすることができる
  - テキストエリアへ値をセットすることができる
  - hiddenへ値をセットすることができる
  - セレクトボックスを選択状態にできる
  - ラジオボタンをチェック状態にできる
  - チェックボックスをチェック状態にできる
  - ボタンやサブミットへ値がセットすることができる
  - 指定するフォームに値をhiddenとしてセットすることができる
  - リストをセレクトオプションとして登録することができる</font>

条件による表示切り替え処理
<font color="#008000">  - テンプレート変数値がtrueであれば表示、偽であれば非表示にできる
  - テンプレート変数値の条件を反転評価して表示非表示を切り替えることができる
  - オブジェクトのテンプレート変数を使って表示非表示を切り替えることができる
  - 配列のテンプレート変数を使って表示非表示を切り替えることができる
  - クラスメソッドの評価によって表示非表示を切り替えることができる
  - 関数の評価によって表示非表示を切り替えることができる</font>

挿入処理
<font color="#008000">  - セレクタによる指定ノード内の末尾にコンテンツが追加できる
  - セレクタによる指定ノード内の末尾にノードが追加できる
  - セレクタによる指定ノード内の先頭にコンテンツが追加できる
  - セレクタによる指定ノード内の先頭にノードが追加できる</font>

繰り返し処理
<font color="#008000">  - phpのforeach_as_valueのような処理ができる
  - phpのforeach_as_key_valueのような処理ができる
  - 繰り返し処理エレメント内でも、トップレベルのテンプレート変数が使える
  - 通常の変数と繰り返し対象の展開変数の変数名が重複した場合は、展開変数が優先さ
れる
  - 繰り返し対象の展開変数がオブジェクトや配列も利用できる
  - 繰り返し処理はネストできる
  - foreach属性と同じエレメントにkey属性を設定して変数展開できる
  - リスト変数が空もしくはnullの場合はinnertextが消える</font>

機能の複合利用
<font color="#008000">  - foreach構文とif構文を組み合わせて利用できるが、同エレメント内にてリスト変数と同時に利用できる条件は展開変数になる
  - foreach構文で繰り返されるコンテンツ内のエレメント要素が｛｝変数で変更できる
  - foreach構文で繰り返されるコンテンツ内でチェックボックスの生成およびチェック状態が実現できる</font>

<font color="#008000">47 examples, 0 failures</font>
</pre>

<p>かなり充実してきた感じで、今回から若干コードの内容や構成に手を入れ始めています。もうすぐ本当にベータリリースできそうな気もしますが、ここからは引き続きコードのリファクタリングを続けながら、あとは仕様の若干の追加や見直しなども進めます。条件分岐として &lt;span if="foo &gt; 10"&gt; みたいな記述もできるようにしたい。</p>]]>
        
    </content>
</entry>

<entry>
    <title>PHP DOMパーサを使ってテンプレートエンジンを作ってみる3</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/04/05/php_dom3.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.722</id>

    <published>2008-04-04T15:15:25Z</published>
    <updated>2008-04-04T15:31:44Z</updated>

    <summary>鈍足ながら少しずつ機能を増やしていっています。 前回から追加された機能は、if ...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dom" label="DOM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="library" label="library" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="template" label="Template" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>鈍足ながら少しずつ機能を増やしていっています。</p>

<p>前回から追加された機能は、if 記法によって表示箇所を切り替えできるようにしてみたのと、指定したノード内にコンテンツを挿入するという機構。</p>

<p>if 記法の切り替えとは、次のようにエレメントに if 属性を準備しておき</p>

<p><strong>Template</strong></p>
<pre class="code">

&lt;div&gt;
  &lt;span if="foo"&gt;Message A&lt;/span&gt;
  &lt;span if="bar"&gt;Message B&lt;/span&gt;
&lt;/div&gt;

</pre>

<p>変数の値が「真」判定されればそのまま表示、「偽」判定されればエレメントが消滅します。foo = 1, bar = 0 とした場合なら、次のようになります。</p>

<p><strong>Result</strong></p>
<pre class="code">

&lt;div&gt;
  &lt;span if="foo"&gt;Message A&lt;/span&gt;
  
&lt;/div&gt;

</pre>
<br /><br />

<p>一方のノード内へのコンテンツ挿入は、セレクタで指定するノードへ append で末尾に、prepend で先頭に挿入します。</p>

<p><strong>Template</strong></p>
<pre class="code">

&lt;p id="foo"&gt;Content&lt;/p&gt;
&lt;p id="bar"&gt;Content&lt;/p&gt;

</pre>

<p><strong>PHP</strong></p>
<pre class="code">

&lt;?php
$template = new Template();

$text = 'Insertion';
$node = '&lt;span&gt;Insertion&lt;/span&gt;';

/* id="foo", id="bar" にそれぞれ $text, $node を挿入 */
$template-&gt;append('#foo', $text);
$template-&gt;prepend('#bar', $node);
$template-&gt;renderer('Example');
?&gt;

</pre>

<p><strong>Result</strong></p>
<pre class="code">

&lt;p id="foo"&gt;ContentInsertion&lt;/p&gt;
&lt;p id="bar"&gt;&lt;span&gt;Insertion&lt;/span&gt;Content&lt;/p&gt;

</pre>


<p><a href="http://hatotech.org/kumatch/datas/template-20080404.zip">template-20080404.zip</a></p>

<p>恒例の PHPSpec による仕様確認はこちら。大分充実してきました。</p>
<pre class="code">
テンプレート変数割り当て
<font color="#008000">  - オブジェクトを割り当てると、プロパティがテンプレート変数として利用される
  - 連想配列を割り当てると、配列キーがテンプレート変数として利用される
  - テンプレート変数として配列が利用できる
  - テンプレート変数としてオブジェクトが利用できる
  - テンプレート変数は配列とオブジェクトが混合で利用できる
  - テンプレート変数として割り当てたクラスオブジェクトのメソッドが利用できる
  - テンプレート変数に対して関数が利用できる
  - テンプレート変数として指定する属性の名称が変更できる
  - 置換されるテンプレート変数は何もせずともhtmlspecialchars済み
  - 置換されるテンプレート変数のhtmlspecialcharsは個別で無効にできる
  - テンプレート内で同じ変数は、利用タグに関係なく何度でも使える
  - 値がassignされていないテンプレート変数は無視される
  - 値を割り当てるのに利用したタグは明示的に消去することができる</font>

エレメント操作
<font color="#008000">  - セレクタによる指定ノードのエレメントが追加、変更できる
  - セレクタによる複数対象のエレメントが追加、変更できる
  - エレメントの各要素のうち、今のところタグ名は変えれない</font>

条件による表示切り替え処理
<font color="#008000">  - テンプレート変数値がtrueであれば表示、偽であれば非表示にできる
  - テンプレート変数値の条件を反転評価して表示非表示を切り替えることができる
  - オブジェクトのテンプレート変数を使って表示非表示を切り替えることができる
  - 配列のテンプレート変数を使って表示非表示を切り替えることができる
  - クラスメソッドの評価によって表示非表示を切り替えることができる
  - 関数の評価によって表示非表示を切り替えることができる
  - foreach構文と組み合わせて表示非表示を切り替えることができるが、同エレメント内にてリスト変数と同時に利用できる条件は展開変数</font>

挿入処理
<font color="#008000">  - セレクタによる指定ノード内の末尾にコンテンツが追加できる
  - セレクタによる指定ノード内の末尾にノードが追加できる
  - セレクタによる指定ノード内の先頭にコンテンツが追加できる
  - セレクタによる指定ノード内の先頭にノードが追加できる</font>

繰り返し処理
<font color="#008000">  - phpのforeach_as_valueのような処理ができる
  - phpのforeach_as_key_valueのような処理ができる
  - 通常の変数と繰り返し対象の展開変数の変数名が重複した場合は、展開変数が優先さ
れる
  - 繰り返し対象の展開変数がオブジェクトや配列も利用できる
  - 繰り返し処理はネストできる
  - foreach属性と同じエレメントにkey属性を設定して変数展開できる
  - リスト変数が空もしくはnullの場合はinnertextが消える</font>

<font color="#008000">34 examples, 0 failures</font>
</pre>
]]>
        
    </content>
</entry>

<entry>
    <title>PHP DOMパーサを使ってテンプレートエンジンを作ってみる2</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/03/30/php_dom2.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.721</id>

    <published>2008-03-29T16:08:44Z</published>
    <updated>2008-03-31T14:44:58Z</updated>

    <summary>前回のエントリの続きです。 前回からの進展としては、時間切れで出来なかった関数実...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dom" label="DOM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="library" label="library" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="template" label="Template" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>前回のエントリの続きです。</p>

<p>前回からの進展としては、時間切れで出来なかった関数実行、指定する DOM Element の要素書き換えや、繰り返し処理の実装。そしてここまで来るとコードがさらにゴチャゴチャとしてくるので、若干のリファクタリング作業をば。</p>

<p>繰り返し処理は PHP の foreach ～ as みたいなのができるように、例えば次のようにテンプレート側で foreach , as 要素を準備しといて、</p>
<pre class="code">

&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;id&lt;/th&gt;
    &lt;th&gt;name&lt;/th&gt;
    &lt;th&gt;email&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr foreach="persons" as="person"&gt;
    &lt;td key="person.id"&gt;&lt;/td&gt;
    &lt;td key="person.name"&gt;&lt;/td&gt;
    &lt;td key="person.email.pc"&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

</pre>

<p>persons 変数に配列を assign すれば、こんな感じに置換される。</p>
<pre class="code">

&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;id&lt;/th&gt;
    &lt;th&gt;name&lt;/th&gt;
    &lt;th&gt;email&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr &gt;
    &lt;td key="person.id"&gt;1&lt;/td&gt;
    &lt;td key="person.name"&gt;foo&lt;/td&gt;
    &lt;td key="person.email.pc"&gt;foo@example.com&lt;/td&gt;
  &lt;/tr&gt;&lt;tr &gt;
    &lt;td key="person.id"&gt;2&lt;/td&gt;
    &lt;td key="person.name"&gt;bar&lt;/td&gt;
    &lt;td key="person.email.pc"&gt;bar@example.com&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;

</pre>
<br /><br />

<p>一方、DOM Element の要素書き換えはテンプレート側の準備一切なしで PHP 側から Element指定＋内容適応。なお Element の指定方法はひとまず DOM パーサ仕様で。jquery like なものなのでスムーズに使えそう。</p>

<pre class="code">
&lt;?php
$template = new Template();

$element = new stdClass();
$element->class = 'example';
$element->aaa = 'AAA';

/* id="foo" の Elememt に class="example", aaa="AAA" を追加 */
<s>$template->setElement('#foo', $element);  </s>
$template->setAttribute('#foo', $element); /* メソッド名変更予定 */
$template->renderer('Example');
?&gt;
</pre>

<p><a href="http://hatotech.org/kumatch/datas/template-20080330.zip">template-20080330.zip</a></p>

<p>なお現在の仕様はこちら。</p>
<pre class="code">
テンプレート変数割り当て
<font color="#008000">  - オブジェクトを割り当てると、プロパティがテンプレート変数として利用される
  - 連想配列を割り当てると、配列キーがテンプレート変数として利用される
  - テンプレート変数として配列が利用できる
  - テンプレート変数としてオブジェクトが利用できる
  - テンプレート変数は配列とオブジェクトが混合で利用できる
  - テンプレート変数として割り当てたクラスオブジェクトのメソッドが利用できる
  - テンプレート変数に対して関数が利用できる
  - タグ内のテンプレート変数の要素名が変更できる
  - 置換されるテンプレート変数は何もせずともhtmlspecialchars済み
  - 置換されるテンプレート変数のhtmlspecialcharsは個別で無効にできる
  - テンプレート内で同じ変数は、利用タグに関係なく何度でも使える
  - 値がassignされていないテンプレート変数は無視される</font>

エレメント操作
<font color="#008000">  - セレクタによる指定ノードのエレメントが追加、変更できる
  - セレクタによる複数対象のエレメントが追加、変更できる
  - エレメントの各要素のうち、今のところタグ名は変えれない</font>

繰り返し処理
<font color="#008000">  - phpのforeach_as_valueのような処理ができる
  - phpのforeach_as_key_valueのような処理ができる
  - 通常の変数と繰り返し対象の展開変数の変数名が重複した場合は、展開変数が優先さ
れる
  - 繰り返し対象の展開変数がオブジェクトや配列も利用できる
  - 繰り返し処理はネストできる</font>

<font color="#008000">20 examples, 0 failures </font>
</pre>

<p>実は前回の仕様ではテンプレートはキャッシュするようになってたんですが、その機構はひとまずカットしました。毎度テンプレートを DOM パースする必要はないなと思って準備してたんですが、PHPコード側から動的に値が適応される「Element 書き換え」を行う場合は結局毎回パースしなおさなければならず、その辺非常にややこしい処理になりそうだったので、現時点ではあまり深く考えなくてよいよう機構そのものをなくしました。<br />
まあ Element 書き換えが発生しない場合も当然あるでしょうから、後々キャッシュできる機能とそうでない機能をきちんと分けた上で改めて再考すればいいかな。</p>

<p>あと、ちゃんとカッコイイ名前をつけたほうがよいとのことで、どうしたもんかと思っているわけです。ネタでいくならKumartyだな！</p>]]>
        
    </content>
</entry>

<entry>
    <title>PHP DOMパーサを使ってテンプレートエンジンを作ってみる</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/03/27/php_dom.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.720</id>

    <published>2008-03-26T16:23:58Z</published>
    <updated>2008-03-26T16:26:21Z</updated>

    <summary>男なら一度はテンプレートエンジンの作成に挑戦してみるよね！ ということで PHP...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dom" label="DOM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="library" label="library" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="template" label="Template" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>男なら一度はテンプレートエンジンの作成に挑戦してみるよね！</p>

<p>ということで <a href="http://simplehtmldom.sourceforge.net/" target="_blank">PHP Simple HTML DOM Parser</a> を使って、DOMパーサ利用ならではのテンプレートエンジンを作ってみました。<br />
ひとまずはテンプレート変数の利用だけ。クラス名とかは考えるのが面倒だったのでひとまず Template で。</p>
<br />
<br />

<u><strong>PHP</strong></u>
<pre class="code">

&lt;?php
require_once 'Template.php';
$variables = new stdClass();
$variables->foo = 'AAA';
$variables->bar = array(1, 2);
$variables->baz->quux = 'BBB';

$template = new Template('./templates', './caches');
$template->assign($variables);
$template->renderer('Example');
?&gt;

</pre>
<br />
<br />
<u><strong>Template (Example.html)</strong></u>
<pre class="code">

&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;span key="foo"&gt;hoge&lt;/span&gt;
  &lt;div key="bar.0"&gt;hoge&lt;/div&gt;
  &lt;p key="bar.1"&gt;hoge&lt;/p&gt;
  &lt;p key="bar.2"&gt;hoge&lt;/p&gt;
  &lt;font color="#FF0000" key="baz.quux"&gt;hoge&lt;/font&gt;
&lt;/body&gt;
&lt;/html&gt;

</pre>
<br />
<br />

<u><strong>結果</strong></u>
<pre class="code">

&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;span key="foo"&gt;AAA&lt;/span&gt;
  &lt;div key="bar.0"&gt;1&lt;/div&gt;
  &lt;p key="bar.1"&gt;2&lt;/p&gt;
  &lt;p key="bar.2"&gt;hoge&lt;/p&gt;
  &lt;font color="#FF0000" key="baz.quux"&gt;BBB&lt;/font&gt;
&lt;/body&gt;
&lt;/html&gt;

</pre>

<p>割り当てたオブジェクト（もしくは連想配列）のプロパティが、タグ内の「key=***」という属性で指定されている箇所をテンプレート変数として置換。変数としても配列、オブジェクトともに利用可能。あと「key」という属性名も好きな名称に指定可能。<br />
<a href="http://phptal.motion-twin.com/" target="_blank">PHPTAL</a>ってより<a href="http://mayaa.seasar.org/" target="_blank">mayaa</a>に近い？（使ったことないのでよくわからない。中間層の XML もないけど。）
</p>

<p><a href="http://hatotech.org/kumatch/datas/template-20080327.zip">template-20080327.zip</a></p>

<p>まだまだ途中段階だし、コードもベタに書いて一切見直ししていないのでアレな内容ですが。</p>

<p>ちなみにアーカイブ内の specs ディレクトリ内は、<a href="http://www.phpspec.org/" target="_blank">PHPSpec</a>によるファイル群（スペック、テスト）で、ここを見れば＆動かせば、現在の仕様や利用方法などが分かります。<br />
なお現在の状態はこんな感じ。<br />
</p>
<br />

<pre class="code">
テンプレート変数割り当て
<font color="#008000">  - オブジェクトを割り当てると、プロパティがテンプレート変数として利用される</font>
<font color="#008000">  - 連想配列を割り当てると、配列キーがテンプレート変数として利用される</font>
<font color="#008000">  - テンプレート変数として配列が利用できる</font>
<font color="#008000">  - テンプレート変数としてオブジェクトが利用できる</font>
<font color="#008000">  - テンプレート変数は配列とオブジェクトが混合で利用できる</font>
<font color="#008000">  - テンプレート変数として割り当てたクラスオブジェクトのメソッドが利用できる</font>
<font color="#800080">  - テンプレート変数に対して関数が利用できる (ERROR)</font>
<font color="#008000">  - タグ内のテンプレート変数の要素名が変更できる</font>
<font color="#008000">  - 置換されるテンプレート変数は何もせずともhtmlspecialchars済み</font>
<font color="#008000">  - 置換されるテンプレート変数のhtmlspecialcharsは個別で無効にできる</font>
<font color="#008000">  - 置換されるテンプレート変数に対して個別にurlencodeできる</font>
<font color="#008000">  - 置換されるテンプレート変数に対して個別にnl2brできる</font>
<font color="#008000">  - テンプレート内で同じ変数は、利用タグに関係なく何度でも使える</font>

テンプレートエンジンの利用
<font color="#008000">  - 利用するとキャッシュができる</font>
<font color="#008000">  - キャッシュデータがあるとそれが描写で再利用される</font>
<font color="#008000">  - キャッシュデータ作成後にテンプレートが更新されると、キャッシュを作り直して描写する</font>
<font color="#008000">  - テンプレートファイルの拡張子が変更できる</font>

<font color="#FF0000">17 examples, 0 failures, 1 error</font>
</pre>


<p>関数利用を作ってる最中でタイムアップ。また後日にでも。</p>]]>
        
    </content>
</entry>

<entry>
    <title>PHP Simple HTML DOM Parser</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/03/26/php_simple_html.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.719</id>

    <published>2008-03-26T05:28:42Z</published>
    <updated>2008-03-26T05:40:25Z</updated>

    <summary>PHP Simple HTML DOM Parser これ面白い。 requir...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dom" label="DOM" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="library" label="library" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p><a href="http://simplehtmldom.sourceforge.net/" target="_blank">PHP Simple HTML DOM Parser</a></p>

<p>これ面白い。</p>

<div class="code">

<p>require_once 'html_dom_parser.php';</p>

<p>$dom = file_get_dom('http://www.google.co.jp/search?q=%E3%83%94%E3%82%AB%E3%83%81%E3%83%A5%E3%82%A6&lr=lang_ja&ie=utf-8&oe=utf-8');</p>

<p>foreach ($dom->find('a') as $node) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$node->innertext = str_replace('ピカチュウ', 'オプーナ', $node->innertext);<br />
&nbsp;&nbsp;&nbsp;&nbsp;$node->href = 'http://www.opoona.com/index.htm';<br />
}</p>

<p>foreach ($dom->find('b') as $node) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;$node->innertext = str_replace('ピカチュウ', 'オプーナ', $node->innertext);<br />
}</p>

<p>print $dom->save();</p>

</div>

<p></p>

<span class="mt-enclosure mt-enclosure-image"><a href="http://hatotech.org/kumatch/uploads/20080326.png"><img alt="20080326.png" src="http://hatotech.org/kumatch/uploads/20080326-thumb-400x258.png" width="400" height="258" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></a></span>

<p><br />
なんか色々思いついたので、暫らくの間これで遊びます。<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>室内整頓中</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/03/26/post_169.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.718</id>

    <published>2008-03-25T16:28:03Z</published>
    <updated>2008-04-09T15:27:43Z</updated>

    <summary>ごちゃーっとしていることに嫌気が差した2008年、思い立って自宅室内にところ狭し...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="Diary" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="diary" label="Diary" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>ごちゃーっとしていることに嫌気が差した2008年、思い立って自宅室内にところ狭しと並べられていた家電、パソコン類を整頓することにしました。</p>

<p>手始めに、既に使っていないくせに何故か部屋の中に留まり続けていた小型のブラウン管TVや CRT ディスプレイを処分。<br />
驚くべきことに4台にもなっていた自作パソコンも、機能面や用途面を含めてえいやと一台に集約して残りを排除。<br />
うちに遊びにきた人は必ず反応していた3面もの液晶ディスプレイも、ワイド24型を1つだけを残して残りは排除。<br />
テレビに接続されていた各種プレイヤも、HDDレコーダ１つを残して残りは排除。</p>

<p><br />
と、ここまで一気に進めて室内スッキリし始めたところで、PC からアナログ線で繋いで利用していた古いステレオアンプ＋スピーカーx2が何故か気に入らなくなり、デスクトップPC向けのエレガントな2.1chサラウンドシステムを IYH!（イヤッッホォォォオオォオウ！の意ですなわち衝動買い）。調整も済んでいい音を楽しんでますが、思い切りやってしまった感が。</p>

<p>家電はこんなところで、後日は本類に着手する予定。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Piece_ORM で簡単データベース＋PHPプログラム</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/03/18/piece_orm_php.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.717</id>

    <published>2008-03-18T14:09:38Z</published>
    <updated>2008-03-18T14:41:53Z</updated>

    <summary>Piece_ORM を使えば、だれでも簡単にデータベースを使ったPHPプログラム...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Piece" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="piece_orm" label="Piece_ORM" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>Piece_ORM を使えば、だれでも簡単にデータベースを使ったPHPプログラムを書くことができます。（任天堂のCM風に。）</p>

<p><br />
<strong><u>1. フォルダの作成</u></strong></p>

<p>Piece_ORM を動作させるには、プログラムのファイルとは別に3つのフォルダを使います。<br />
プログラムファイルを作成するフォルダ内に、次の3つのフォルダを作成します。</p>

<p>・config<br />
・cache<br />
・mappers</p>

<p><br />
<strong><u>2. データベース情報を準備する</u></strong></p>

<p>次に Piece_ORM から接続するデータベースサーバの情報を設定します。<br />
仮にデータベースの情報が</p>

<p>データベース: PostgreSQL<br />
ホスト名: localhost</p>

<p>database : example<br />
username : example_user<br />
password : example_password</p>

<p>以上のようなものなら、先ほど作ったフォルダのうちの１つ、config フォルダの中に「piece-orm-config.yaml」という名前のファイルを作成し、次のように記述します。</p>

<pre class="code">
- name: database1
  dsn: pgsql://example_user:example_password@localhost/example
</pre>

<p><br />
<strong><u>3. テーブルを準備する</u></strong></p>

<p>続いて、実際にプログラムから読み込みや書き込みを行おうとするテーブルを準備します。</p>

<p>データベース内の実際のテーブルは予め作成しておきます。ここでは「person」という名前のテーブルを作成したとします。</p>

<p>先ほど作ったフォルダのうちの１つ、mapper フォルダの中に「Person.yaml」という名前のファイルを作成します。中身は何も必要ありません。</p>

<p><br />
<strong><u>4. プログラムを書く</u></strong></p>

<p>最後にプログラムを書きます。書くプログラムは非常に短くて簡単です。</p>

<p>SELECT 文の SQL は次のようなコードを準備します。SELECT した結果のレコードがオブジェクトとして簡単に参照が可能です。</p>

<div class="code">

<p>&lt;?php</p>

<p><font color="#A0A0A0">// Piece_ORM を読み込む</font><br />
<font color="#004080">require_once</font> <font color="#FF8000">'Piece/ORM.php'</font>;</p>

<p><font color="#A0A0A0">// Piece_ORM を設定する</font><br />
<font color="#008040">Piece_ORM</font>::configure(<font color="#FF8000">'config'</font>, <font color="#FF8000">'cache'</font>, <font color="#FF8000">'mappers'</font>); </p>

<p><font color="#A0A0A0">// person テーブルを対象にする</font><br />
$<font color="#AAAA00">mapper</font> = <font color="#008040">Piece_ORM</font>::getMapper(<font color="#FF8000">'Person'</font>);</p>

<p><font color="#A0A0A0">// select * from peron where id = 1;</font><br />
$<font color="#AAAA00">person1</font> = $<font color="#AAAA00">mapper</font>-&gt;findById(1);<br />
<font color="#0080FF">echo</font> $<font color="#AAAA00">person1</font>-&gt;<font color="#AAAA00">name</font>;    <font color="#A0A0A0">// name カラムを表示</font></p>

<p><font color="#A0A0A0">// select * from peron where name = 'foo';</font><br />
$<font color="#AAAA00">person2</font> = $<font color="#AAAA00">mapper</font>->findByName(<font color="#FF8000">'foo'</font>);<br />
<font color="#0080FF">echo</font> $<font color="#AAAA00">person2</font>-&gt;<font color="#AAAA00">name</font>;<br />
?&gt;<br />
</div></p>

<p><br />
INSERT, UPDATE, DELETE も簡単です。</p>

<div class="code">

<p>&lt;?php</p>

<p><font color="#A0A0A0">// Piece_ORM を読み込みと設定</font><br />
<font color="#004080">require_once</font> <font color="#FF8000">'Piece/ORM.php'</font>;<br />
<font color="#008040">Piece_ORM</font>::configure(<font color="#FF8000">'config'</font>, <font color="#FF8000">'cache'</font>, <font color="#FF8000">'mappers'</font>); </p>

<p><font color="#A0A0A0">// person テーブルを対象にする</font><br />
$<font color="#AAAA00">mapper</font> = <font color="#008040">Piece_ORM</font>::getMapper(<font color="#FF8000">'Person'</font>);</p>

<p><font color="#A0A0A0">// 新しいレコードとして INSERT</font><br />
$<font color="#AAAA00">person</font> = <font color="#0080FF">new</font> <font color="#008040">stdClass</font>();<br />
$<font color="#AAAA00">person</font>-&gt;name = <font color="#FF8000">'foo'</font>;<br />
$<font color="#AAAA00">mapper</font>-&gt;insert($<font color="#AAAA00">person</font>);</p>

<p><font color="#A0A0A0">// name カラムを変更して UPDATE</font><br />
$<font color="#AAAA00">person</font>-&gt;name = <font color="#FF8000">'bar'</font>;<br />
$<font color="#AAAA00">mapper</font>-&gt;update($<font color="#AAAA00">person</font>);</p>

<p><font color="#A0A0A0">// DELETE</font><br />
$<font color="#AAAA00">mapper</font>-&gt;delete($<font color="#AAAA00">person</font>);</p>

<p>?&gt;<br />
</div></p>

<p><br />
詳しくはこちら<br />
<a href="http://trac.piece-framework.com/piece-doc/wiki/ja/users/piece-orm/UsersManual/Installation" target="_blank">Piece_ORM のインストール</a><br />
<a href="http://trac.piece-framework.com/piece-doc/wiki/ja/users/piece-orm/QuickStart/CrashCourseInPiece_ORM" target="_blank">Piece_ORM のより詳細なチュートリアル</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>iTunes ライブラリのデータ共有＆バックアップ環境の最も簡潔な方法</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/03/12/itunes.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.716</id>

    <published>2008-03-12T13:24:27Z</published>
    <updated>2008-03-12T14:03:56Z</updated>

    <summary>音楽や動画などのデータを保存しているストレージ用のマシンとHDDがヘタれたので、...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PC/Software" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="itunes" label="iTunes" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="music" label="Music" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="software" label="Software" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>音楽や動画などのデータを保存しているストレージ用のマシンとHDDがヘタれたので、ひとまず新しいHDDを買ってきたんですよ。この手のPCパーツを買うのは2年ぶりほどですけど、相変わらず暫らく遠ざかっているだけで性能アップと価格ダウンの進展が大きくて驚くばかりですよ。HITACHI の省電力仕様のHDD 500GB が 9000円でした。</p>

<p>で、タイトルにあるように iTunes ライブラリ（音楽データ、アートワーク、楽曲再生リスト）を新しい HDD に移しつつ、既存の再生環境でも正しく再生されるようにしないといけないなあと思ったんですね。気をつけないと「データが見つかりません」とか言われてデッドリンクが大量発生しちゃうし。<br />
そこで、ふと気づいたんですよ。なんで今までこの方法が思いつかなかったんだろうと。google で調べても同じことやってるケースが一杯ヒットしているくらいだし。</p>

<p>iTunes ライブラリ用って１つのフォルダにまとめられているんで、そこをシンボリックリンクにすれば、参照先がどこに移動したって再生環境側は気にする必要がないんですよね。仮に再生側で再インストールしたとしても、ストレージ側の iTunes ライブラリをシンボリックリンクしなおせばすぐ元通りだし、今回のようにストレージ側が変わっても、これまた同じようにシンボリックリンクしなおせばすぐ参照できるようになる。</p>

<p>まずは現行の再生側の iTunes ライブラリフォルダをバックアップなどに移して、iTunes から認識できるライブラリフォルダが存在しないようにしときます。Windows ならば「マイミュージック」内に iTunes がない状態に。一方、実際の iTunes ライブラリフォルダがどこか別のところにある状態にします。ここでは仮に d:\music\iTunes あたりとします。</p>

<p>Windows 環境では通常シンボリックリンクをはる手段がないものの、MS の TechNet で<a href="http://technet.microsoft.com/ja-jp/sysinternals/bb896768(en-us).aspx" target="_blank">シンボリックリンクを作る junction コマンドのプログラム</a>が配布されているようなのでコレを使うとOK。windows フォルダや system32 フォルダあたりの実行パスが通っているところにコピーしたあと、コマンドプロンプトを立ち上げて以下のように junction コマンドを発行してあげればOK。</p>

<div class="code">
c:\Documnets and Setting\username> cd "My Documnets\My Music"

<p>c:\Documnets and Setting\username\My Documnets\My Music > junction iTunes d:\music\iTunes<br />
</div></p>

<p>ちなみに Cygwin 環境があれば ln コマンドで同じことができます。</p>

<p>これで、見かけ上はマイミュージックに iTunes フォルダがあるように見えるものの、実際その中身は d:\music\iTunes という状況に。</p>

<p>再生側は全般的に c:\Documnets and Setting\username\My Documnets\My Music\iTunes として見えているので、これのシンボリックリンク先がネットワーク越しの異なるマシンなんてこともOKでしょう。複数マシンが1つの iTunes ライブラリを参照する状態になるので、どのマシンでもライブラリへの楽曲追加ができるし、共通の再生リストも利用できますね。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Movable TypeにおいてSQLiteからMySQLへ手動でデータ移行する</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/02/19/movable_typesql.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.715</id>

    <published>2008-02-19T09:55:55Z</published>
    <updated>2008-02-19T10:04:45Z</updated>

    <summary>うちの Blog で利用している Movable Type は SQLite で...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="Blog" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Develop" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="movabletype" label="Movable Type" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mysql" label="MySQL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sqlite" label="SQLite" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>うちの Blog で利用している Movable Type は SQLite でデータ保存を行っていたのですが、どうもその SQLite データファイルが、利用しているホスティングであるさくらサーバの容量に対して到底無視できない割合（1/4）を利用しているということが判明。事実、容量の空きが非常に苦しいものとなってきていました。<br />
その一方、さくらでは別途 MySQL も用意されており、ユーザは www 用サーバとは別に準備されたいくつかの MySQL サーバのうちの1つを選択し利用できるというサービス体系になっています。</p>

<p>そんな利用状況なさくらサービス、ひょっとすると使用可能なホスティングデータ量ってば、利用可能なサーバ容量の範囲とは別でないかという甘い考えが思いついたことはさておき、そもそも SQLite よりも MySQL サーバを利用するほうが保持するデータ容量は少なくなるであろうという考えの元、SQLite から MySQL へデータ移行することにしました。</p>

<p>その際、当方の SQLite におけるデータ構造や SQL 内容の理解がないので、1つ1つ確認しながら出来るよう、大よそを手動で事を進めていきました。今回のケースは Movable Type におけるお話ですが、他のものにもある程度流用できるのではないでしょうか。なおデータベース、および SQL についての若干ながらの知識が必要になるかもしれません。（SQL エラーが発生した場合に対応できるとか。）</p>

<p><br />
<u><strong>0. 環境</strong></u></p>

<p>参考までに、今回の環境は以下のとおり。<br />
なお作業はオーソドックスにすべて CLI ベースのクライアントで進めました。</p>

<p> * MySQL 4.0.27<br />
 * SQLite 3.3.17<br />
 * Movable Type 4.0</p>

<p><br />
<u><strong>1. Movable Typeのデータスキーマを MySQL 側に作成</strong></u></p>

<p>まず MySQL 上に Movable Type のデータが格納できるよう、スキーマを作成します。<br />
MT の設定ファイル（mt-config.cgi）内に記述されたデータベース接続設定を SQLite から MySQL のものへ変更し保存します。MT はかつて SQLite 環境で動いていたもので問題ありません。むしろこのまま MySQL へ移行しようとするので、へたに新しい MT の管理ページを作成する必要はありません。</p>

<p>続けて MT の管理ページへアクセスします。すると MT は MySQL 上に MT 用データが存在しないため、新規作成を行おうとしますので、これを進めていきます。MTユーザ登録などもあわせて行う流れとなりますが、内容を覚えておく必要はありません。</p>

<p>作成が完了した後、MySQL クライアントを使って、MT 用テーブルのデータを全て消去します。MT 用テーブルは、テーブル名の先頭すべてに「mt_」という接頭辞がついているものです。<br />
テーブルの削除ではなく、データの削除であることに注意しましょう。データ削除コマンドは「truncate テーブル名」です。またその他のテーブルデータも消えぬことのないように…。</p>

<p>これで MySQL 側の受け口ができました。</p>

<p><br />
<u><strong>2. SQLite のデータダンプ</strong></u></p>

<p>続いて SQLite データをダンプします。</p>

<p>SQLite データは1つのファイルにまとめられている状態となっています。sqlite のコマンドツールはこのデータファイルを指定して実行する仕組みとなっています。またデータダンプは、sqlite の「.dump」コマンドで行います。たとえば SQLite データファイル example.db に対してのデータダンプは、CLI より以下のように実行します。</p>

<div class="code">$ echo '.dump' | sqlite example.db > sqlite.dump.sql</div>

<p>SQLite データファイルの指定、および sqlite コマンドの違いに気をつけましょう。（さくらの場合、「sqlite3」コマンドでした。）</p>

<p>このコマンドの実行で、sqlite.dump.sql というテキストベースの SQL データが出来ました。</p>

<p><br />
<u><strong><br />
3. SQL データを MySQL 向けに編集</strong></u></p>

<p>SQLite のダンプデータは、SQL 文によるデータベースの情報や操作が記載されています。<br />
SQL は色々なデータベースで利用されているものですが、今回ダンプした直後の内容では一部 MySQL で利用できないものが含まれているので、これを編集します。</p>

<p> * 一行目の「BEGIN TRANSACTION;」を削除<br />
 * 最終行の「COMMIT;」を削除<br />
 * その直前の「CREATE INDEX～」行をすべて削除</p>

<p>まず以上のことを行うことで、データ内は「CREATE TABLE～」と「INSERT INTO～」のみのものとなります。</p>

<p>本来ならば、ここから「CREATE TABLE～」のSQLもすべて削除し「INSERT INTO～」のみにすることで MySQL への投入準備が整うのですが、私の場合はここから「INSERT INTO～」文を編集する必要がありました。このままデータを INSERT してしまうと、MySQL 上では目的のデータ構造とは異なるものになろうとしていたからです。</p>

<p>例えば、ダンプデータ内の CREATE TABLE 文が<br />
<div class="code">CREATE TABLE mt_placement ( <br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_id integer not null primary key,<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_blog_id integer not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_category_id integer not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_entry_id integer not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_is_primary boolean not null<br />
);</div><br />
というものに対し、実際のこのテーブルへの INSERT 文は<br />
<div class="code">INSERT INTO "mt_placement" VALUES (4,2,2,4,1);</div><br />
となっていたとします。データベースに対して CREATE TABLE を行った後にこの INSERT を実行すると、以下のようなレコードができます。</p>

<p>    mt_placement テーブル<br />
    ---------------------<br />
    placement_id = 4<br />
    placement_blog_id = 2<br />
    placement_category_id = 2<br />
    placement_entry_id = 4<br />
    placement_is_primary = 1</p>

<p>一方、既に MySQL 上で準備されている mt_placement テーブルは、先ほどの CREATE TABLE のものと同じとは限りません。同じテーブル内容なものの、カラム順が異なるケースが実際にありました。（以下は一例）</p>

<div class="code">

<p>CREATE TABLE mt_placement (<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_id int(11) not null auto_increment,<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_entry_id int(11) not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_blog_id int(11) not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_category_id int(11) not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;placement_is_primary tinyint(4) not null,<br />
&nbsp;&nbsp;&nbsp;&nbsp;PRIMARY KEY(id)<br />
)<br />
type = MYISAM;<br />
</div></p>

<p>この場合、同じ INSERT 文を行った  mt_placement テーブルはこうなります。</p>

<p>    mt_placement テーブル<br />
    ---------------------<br />
    placement_id = 4<br />
    placement_entry_id = 2<br />
    placement_blog_id = 2<br />
    placement_category_id = 4<br />
    placement_is_primary = 1</p>

<p>カラム名を指定した INSERT 文ではないため、テーブル定義を行った順に INSERT が行われてしまい、結果違うレコードに仕上がってしまいます。</p>

<p>これを回避すべく、ダンプデータ内に記述されている CREATE TABLE 文のカラム順序どおりに、INSERT 文を編集していくのです。（説明長い！）</p>

<p><br />
先ほどのこれは、<br />
<div class="code">INSERT INTO "mt_placement" VALUES (4,2,2,4,1);</div></p>

<p>こうします。<br />
<div class="code">INSERT INTO mt_placement<br />
 (placement_id, placement_blog_id, placement_category_id, placement_entry_id, placement_is_primary)<br />
 VALUES (4,2,2,4,1);</div><br />
（ついでにテーブル名のダブルクオートも排除。なお複数行でなくても一行でOK。）</p>

<p>全ての INSERT 文において、対応するテーブルの CREATE TABLE 文で示されているカラム順に従った形で INSERT 文を書き換えていきます。</p>

<p>INSERT 文のすべてを書き換え終わった後に、CREATE TABLE 文をすべて削除します。<br />
　</p>

<p><br />
<u><strong>4. MySQL へデータを投入</strong></u></p>

<p>編集後のファイルを MySQL へ投入します。<br />
例えば MySQL のデータベース「my_database」に対して投入する状況において、3. のセクションで sqlite.dump.sql ファイルを編集後 mysql.import.sql として保存したのであれば、以下のようなコマンドを実行します。</p>

<div class="code">$ mysql my_database < mysql.import.sql</div>

<p>必要に応じて -u, -p などのオプションをつけて、SQL が正しく実行できるようにしましょう。<br />
またエラーが発生した場合は原因を良く確かめて import ファイルを編集し、truncate でもう一度リセットした上で再投入しましょう。</p>

<p><br />
<u><strong>5. Movable Type 管理へアクセス</strong></u></p>

<p>投入後再び Web で MT 管理ページへアクセスします。SQLite 環境で稼動していたものと同じものが参照、利用できるはずです。<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>大乱闘スマッシュブラザーズX</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/02/07/x.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.714</id>

    <published>2008-02-07T05:48:21Z</published>
    <updated>2008-02-07T06:11:39Z</updated>

    <summary>1/31の発売からおよそ一週間たったWii用ゲーム「大乱闘スマッシュブラザーズX...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="Game" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="game" label="Game" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="nintendo" label="Nintendo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wii" label="Wii" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="スマッシュブラザーズ" label="スマッシュブラザーズ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>1/31の発売からおよそ一週間たったWii用ゲーム「大乱闘スマッシュブラザーズX」、スマブラX。恥ずかしながら発売後ずっと遊んでます。</p>

<p>どんなゲームかというと、かつて「マリオブラザーズ」とか「アイスクライマー」とか「バルーンファイト」の2P協力プレイのモードを使って対戦をしていた人に直撃する、ポコポコと4人まで同時に遊べる大乱闘アクションゲームなのです。<br />
また任天堂ゲームのいろんなキャラクターたちが集まって操作できるというのも1つのポイント。</p>

<p>ゲームの中で動くキャラクターやフィールドこそ3Dモデルなものの、昔ながらの2Dゲームのように左右キーで移動して上キー（もしくはボタン）でジャンプしてボタンで攻撃というシンプルな操作はもはやお馴染みなものだからすぐ慣れる。</p>

<p>「面白いよ！」といって初めての人にコントローラを渡してしばらく触っていると、すぐに大よその基本的な操作ができるようになるのは良いですねえ。そのまま4人でワーワープレイできて面白いです。<br />
　<br />
　<br />
このスマブラXは今回で3作目なんですが、今回は「これまでの任天堂ゲーム」を匂わすギミックがこれでもかというほど多数盛り込まれていて、かつて任天堂のゲームで遊んだ数が多ければ多いほど、より楽しめるという仕組みになってます。なつかしい演出やフィールド、キャラクタそして音楽が、記憶の奥に沈みきっていた子供のころのゲームの思い出を呼び起こしてきます。</p>

<p>特に音楽は新旧あわせて約250もの曲が準備されているらしく凄いボリューム。任天堂ゲームの名作のなかの名曲がアレンジされて流れてきます。あまりに懐かしすぎ＋出来が良すぎて涙腺が危なかったのはいよいよ歳ということかなあ。<br />
（ファミコン、スーパーファミコン、ニンテンドー64くらいまでは分かるんだけども、最近のポケモンとかのゲームがよー分からんのが悔しい）<br />
　<br />
　<br />
また今回はネットワークを通じて対戦できるというモードもあって、知ってる人とも知らない人とも遊べます。やってみた感じ、発売直後は（恐らくアクセスが殺到しすぎて）全然遊べなかったのですが、今週になってボチボチと乱闘できるようになりました。アクションゲームのネットワーク対戦って大抵の場合キャラクターがワープしたりとかいきなり攻撃を受けたりとかあるんですが、このスマブラはネットワークを介して遊んでいるとは思えないほどの滑らかさで遊べてしまうのがまた凄い。（なぜ今までの通信対戦ゲームと違うのかが知りたい。）</p>

<p>Wii持ってる知り合いは買ってないのかなあ。フレンド対戦やりたいなあ。集まった結果「じゃあ今日は2グループに分かれて遊ぼうぜ！」とかやりたいなあ。</p>]]>
        
    </content>
</entry>

<entry>
    <title>HTML_Template_Flexy 1.3.xx</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/02/04/html_template_f.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.713</id>

    <published>2008-02-04T07:11:46Z</published>
    <updated>2008-02-04T07:22:59Z</updated>

    <summary>1/31 に開催された勉強会in大阪でも一部の人には話をしていたんですが、その後...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="alanknowles" label="Alan Knowles" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="html_template_flexy" label="HTML_Template_Flexy" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pear" label="PEAR" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>1/31 に開催された勉強会in大阪でも一部の人には話をしていたんですが、その後少しだけ動きがあったので。</p>

<p>勉強会の前日である 1/30 に HTML_Template_Flexy のバージョン 1.3.0 がリリースされ、いくつかの小さな新機能が実装されたということになってます。<br />
このパッケージ、実は DB_DataObject と同じ作者が開発、管理しておりまして。（実際、同日に DB_DataObject のバグフィックスとしてマイナーバージョンがリリース）<br />
で、去年の9月東京で開催されたPHPカンファレンスで私の「ネタ」をご覧になった方はお分かりかと思いますが、この方のパッケージをリリースする際に「ちょっとした落とし穴」みたいなミスをすることがたまにあったりして、あるバージョンのリリース後にも細かなFixバージョンUPを短時間で積み重ねてしまうということがあります。</p>

<p>さて今回の Flexy 1.3.0 にて、少し魅力的な機能を試してみたく Ver.UP して動かしてみたのですが、何やらエラーが発生。どういうことだとメッセージをチェックしたりファイル構成や中身を確認してみると、なんと新機能を利用するため新規に追加された（であろう）クラスファイルが存在しないため require に失敗し、結果 new class できず Fatal が発生している。</p>

<p>「AKまたやらかしやがった！」（<a href="http://d.hatena.ne.jp/rsky/20080131/1201740263" target="_blank">rsky</a> へ送ったメールより）</p>

<p>どうやら CVS には新クラスファイルが存在しているものの、PEAR パッケージを作成するための package.xml 内にそのクラスファイルを記述していなかったため、結果 1.3.0 パッケージ内にファイルが含まれない状況になっていたのです。</p>

<p>多分、CVS にコミット済みのものやらローカルに存在しているソースやら何やらが分散したり、時間が経ったことで混在しているオープン・クローズなソースの状況を忘れてしまっていたりしてるんじゃないかと思います。（今回ファイルを忘れていた分に関しても、機能的な部分の実装は数ヶ月前でした。それでも一部ミスがあったようですが。）</p>

<p>なお、現在出ている 1.3.2 では、1.3.0 リリース時に提示した機能の一部をカットしているようです。現在リリース分のものと CVS 上のソースの内容が異なっているのを見る限り、恐らく再実装しなおして次バージョンがリリースするのではないかと思います。<br />
いまのところ 1.3.2 では問題は特に出ていません。（PHP5 で動かすと「is_a 使うのやめろ」という要求が出るものの、エラーではないです。） flexy:include 内の src 指定に変数が使えるのは地味に便利だし（ちょうど目前の案件で必要そうなシチュエーションだったのでワロタ）、あと radio エレメント内で id 要素を指定しないと怒られてしまうというのもこのバージョンからなくなります。ただし、いくつかの radio で同 name 要素を持つエレメントに対し 同 id 要素を持たせるというのは相変わらず NG。なので今後も変わらずマークアップ担当者には別 id を使うか class を使ってもらうようにしよう！</p>

<p>そしてがんばれ AK!!<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>ファミコン復活</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/01/25/post_168.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.712</id>

    <published>2008-01-24T15:00:12Z</published>
    <updated>2008-01-24T15:31:05Z</updated>

    <summary>年越し実家に帰った際、自分の部屋に残していっていたものをあれこれ物色していると、...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="Game" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="famicom" label="Famicom" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="game" label="Game" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gradius" label="Gradius" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="改造" label="改造" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>年越し実家に帰った際、自分の部屋に残していっていたものをあれこれ物色していると、ファミコンの本体やらカセットやらを発見。ゲーム自体は最近では Wii のバーチャルコンソールで一部が遊べるものの、そういえば「ゲームセンターCX」で有野課長が実際にプレイしているのもこの旧来の赤白ファミコンだなあと思っていると、ふと今住んでいるところでこの赤白ファミコンが「現役で動いている」という環境であれば非常に Cool なのではないかという錯覚に陥ってしまい、実は持ってかえってきていたのでした。</p>

<p>この赤白ファミコン、実際に使っていた人は承知でしょうが、テレビと接続する際にはテレビの後ろにつなぐアンテナ線の間にファミコン用の白いアダプタのようなもの（RFスイッチというのだ！）をかまさなければならなかったんですね。でも頑張れば黄色線やら白線といったおなじみの「ビデオ端子接続」ができるらしいとのこと。インターネットって偉大だなあ。</p>

<p>日本橋にいってパーツを購入してきて、久々に半田ごてを使っての電子工作。学生時分に得た能力を遺憾なく発揮！</p>

<span class="mt-enclosure mt-enclosure-image"><a href="http://hatotech.org/kumatch/uploads/20080124_01.jpg"><img alt="20080124_01.jpg" src="http://hatotech.org/kumatch/uploads/20080124_01-thumb-320x240.jpg" width="320" height="240" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></a></span>

<p>こんな感じで映像用の黄色線と、音声用の白線があり得ないところからにょきっと。<br />
あとは AC アダプタもあわせて繋いで、「ビデオ」にチャンネルあわせてスイッチONすると、ファミコンが映る！「1チャン」ではなく！<br />
　<br />
　<br />
　<br />
<span class="mt-enclosure mt-enclosure-image"><a href="http://hatotech.org/kumatch/uploads/20080124_02.jpg"><img alt="20080124_02.jpg" src="http://hatotech.org/kumatch/uploads/20080124_02-thumb-320x240.jpg" width="320" height="240" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></a></span></p>

<p>左画面に赤白ファミコン、右画面に Wii のバーチャルコンソールで同じゲームを映すという、昔ではできないアホなシチュエーション。見た目の色の違いのほか Wii のほうが D 端子で映しているため綺麗に見える一方で、拡張音源を乗せたグラディウスII、実機のほうが音の出が良い印象（スネア音とか）。<br />
これ、両画面にマリオを映して二人よーいドンでどっちが先にクリアできるかとかできるなあ。</p>

<p>　<br />
あ、ちなみに、家から持って帰ってきたファミコンが元々調子が悪い上、調査中にショートしちゃったみたいで何も映らなくなってしまい、実はこれ日本橋で買ってきた2台目だったりします。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Meadow での日本語取り扱い</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/01/23/meadow_3.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.711</id>

    <published>2008-01-23T09:23:32Z</published>
    <updated>2008-01-23T09:27:04Z</updated>

    <summary>普段使っているテキストエディタは相変わらず Meadow (Meadow3) な...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="Emacs/Meadow" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="emacs" label="Emacs" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="meadow" label="Meadow" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p>普段使っているテキストエディタは相変わらず Meadow (Meadow3) なんですけど、実は密かに日本語の取り扱いが完全ではない状態で使い続けていました。</p>

<p>日本語の取り扱いに問題がないとは以下のようなもの。</p>

<p>(a) 通常の日本語文字群に加えて、NEC 特殊文字や NEC 選定 IBM 拡張文字といった拡張文字群が表示、編集できる。</p>

<p>(b) Shift_JIS, EUC-JP, ISO-2022-JP, UTF-8 などの日本語を取り扱う一通りの文字コードをすべてカバーし、表示、編集できる。また相互変換できる。編集後他のエディタで開いたときに弊害が出ない。</p>

<p>普通は当たり前の機能のような気もするんですけどこれがうまくいっていなくって、UTF-8 では拡張文字が正しく表示できないとか文字コードを変換して保存した際にマッピングが変になったりとか、これを Meadow2 に移行して以後3年以上は目を瞑りながらやってたのでした。不具合に出くわすとしても数が知れているほどなので（書くのはアルファベットばっかりだし）…。</p>

<p>とはいってもやっぱり気持ち悪いのでちゃんと調べてみたところ、以下の2点で記述されている utf-translate-cjk-mode 対策で無事クリアできました。拡張文字だけでなく「～」とか「×」とかの文字も地味～に「豆腐」や違うものに置き換わっていたりしてたのも解決！</p>

<p><a href="http://nijino.homelinux.net/emacs/utf-cjk.html" target="_blank">utf-translate-cjk-mode</a><br />
<a href="http://nijino.homelinux.net/emacs/jisx0208ex.html" target="_blank">JIS X 0208 Extension</a></p>

<p>ちなみに元々は Mule-UCS での対応を目指していたんですが、拡張文字関連が設定次第であっちが豆腐になったりこっちが豆腐になったりでうまくいかなかったので断念。まあ元々 Unicode 関連はもう Mule-UCS に頼らなくても大丈夫だったはずだしね。<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>1/31 PHP勉強会 at 大阪が Apple Store であるようです</title>
    <link rel="alternate" type="text/html" href="http://hatotech.org/kumatch/archives/2008/01/21/131_php_at_appl.html" />
    <id>tag:hatotech.org,2008:/kumatch//2.710</id>

    <published>2008-01-21T09:03:22Z</published>
    <updated>2008-01-21T14:54:19Z</updated>

    <summary>1月31日 PHP勉強会 at 大阪を開催します 去年行われたPiece Net...</summary>
    <author>
        <name></name>
        
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="seminar" label="Seminar" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://hatotech.org/kumatch/">
        <![CDATA[<p><a href="http://d.hatena.ne.jp/ku-suke/20080120" target="_blank">1月31日 PHP勉強会 at 大阪を開催します</a></p>

<p>去年行われた<a href="http://piece-framework.com/2007/11/piece_network_1.html" target="_blank">Piece Network 1</a>の懇親会でも話が出ていたんですが、ついに「PHP勉強会 at 大阪」として開催されるようです。しかも予定どおり Apple Store 内の施設！発表者募集中とのことで、ここはひとつ昨年の PHP カンファレンスのLTでだだスベリしたAlan Knowles漫談を関西初披r</p>

<p>そういうことはありませんが、参加したいと思います。</p>]]>
        
    </content>
</entry>

</feed>
