<?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>高橋文樹.com &#187; プログラミング</title>
	<atom:link href="http://takahashifumiki.com/topics/web/programing/feed/" rel="self" type="application/rss+xml" />
	<link>http://takahashifumiki.com</link>
	<description>小説家高橋文樹が自ら情報を発信するブログです。小説・Web制作などの話があります。</description>
	<lastBuildDate>Sun, 11 Jul 2010 15:53:55 +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://takahashifumiki.com/topics/web/programing/feed/" />
		<item>
		<title>風と光と三十路の私と電子書籍とPHPとtextareaと改行</title>
		<link>http://takahashifumiki.com/web/programing/874/</link>
		<comments>http://takahashifumiki.com/web/programing/874/#comments</comments>
		<pubDate>Tue, 18 May 2010 19:23:10 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[正規表現]]></category>
		<category><![CDATA[電子書籍]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=874</guid>
		<description><![CDATA[ハマったのでメモ。
データベースに正規表現と後方参照のリストを保存したいという得体の知れない欲求を抱いたのがそもそもの始まりでした。
たまたまテキスト置換が日常茶飯事に行われるCMSを作っていたからなんですが、要するに、 [...]]]></description>
			<content:encoded><![CDATA[<p>ハマったのでメモ。</p>
<p>データベースに正規表現と後方参照のリストを保存したいという得体の知れない欲求を抱いたのがそもそもの始まりでした。</p>
<p>たまたまテキスト置換が日常茶飯事に行われるCMSを作っていたからなんですが、要するに、こういう配列をですね、いっぱい作ってDBに突っ込んで、いつでも呼び出せるようにしておきたかったんですよ。</p>
<p>正規表現セットがですね、ほら、こう、あれですよ、なんかお店のメニューみたいにね。</p>
<pre class="brush: php;">
$regs = array(
   &quot;reg&quot;     =&gt; array(
      &quot;/^tel([0-9\-])+$/s&quot;
      &quot;/\n/&quot;
   ),
   &quot;backref&quot; =&gt; array(
      &quot;電話番号$1&quot;,
      &quot;&lt;br /&gt;&quot;
   )
);
for($i = 0, $l = count($regs[&quot;reg&quot;]); $i &lt; $l; $i++){
   preg_replace($regs[&quot;reg&quot;][$i], $regs[&quot;reg&quot;][$i], $str);
}
</pre>
<p>ほら、これでどんなにたくさん正規表現を追加したって、なんの問題もないじゃないですか。</p>
<p>電子書籍とか作るとき、こういう方法でワンソース・マルチプラットフォームを実現しようと思ったんですよ。</p>
<p>いつもいつもDOMれるわけじゃないですからね。</p>
<p>で、問題は入力系です。</p>
<p>はじめはJavascriptとか使ってソータブルテーブルを作ったらね、いいと思ったんですよ。入力しやすいじゃないですか。</p>
<p>でもね、正直CMSのいいところって、ユーザを教育できるじゃないですか。今回は不特定多数に使われるCMSじゃなくて、業務用アプリだったんで、まあ、textareaでいいかなって思ったんですよ。</p>
<p>textareaを二つ用意して、改行が入るところでexplodeかまして分割すればほら素敵な配列のできあがり！　ってね。</p>
<p>でも問題はいつだってバックスラッシュじゃないですか。</p>
<p>正規表現って、バックスラッシュいっぱい入りますよね。あと、シングルクォートとか、HTMLにとってもDBにとってもアレゲなものがたくさん入りますよね。</p>
<p>というわけで、入力系・出力系ともにいろいろ気を付けますよ。</p>
<p>プレースホルダー使ったり、stripslashes使ったり。</p>
<p>でもまあ、ここまでは別に良かったんですよ。</p>
<p>当然CMSなんで、入力・出力・更新・削除があるじゃないですか。</p>
<p>困ったのは更新ですよ。</p>
<p>更新するからには、元のデータを一回出力して、ユーザがそれを修正できなきゃダメじゃないですか。</p>
<p>だから僕はこういう風に出力されたらいいなって思ったんですよ。</p>
<pre class="brush: xml;">
&lt;textarea name=&quot;reg&quot;&gt;/^tel([0-9\-])+$/s
/\n/&lt;/textarea&gt;
&lt;textarea name=&quot;backref&quot;&gt;電話番号$1
&lt;br /&gt;&lt;/textarea&gt;
</pre>
<p>こうすれば、ユーザにとって入力したときと同じ結果が見えるので、更新もし易いですよね。</p>
<p>で、問題はtextarea内での改行ですよ。</p>
<p>今回はFirefoxを使ったんですが、textareに入っていたデータをPHPで受け取ると、改行部分が\r\nになってたんですね。</p>
<p>ぶっちゃけ蝶ラッキーって思いました。</p>
<p>正規表現を適用するDBのコンテンツデータは改行コードLFなんで、単純にexplode(&#8220;\r\n&#8221;, $_POST["reg"])しちゃえば配列が取れるじゃないですか。</p>
<p>ってことはですよ、ユーザに対して出力するときだって、implode(&#8220;\r\n&#8221;, $arr)ってやれば済むと思うじゃないですか。</p>
<p>ところがなんないんですよ。</p>
<pre class="brush: xml;">
&lt;textarea name=&quot;reg&quot;&gt;/^tel([0-9\-])+$/s\r\n/\n/&lt;/textarea&gt;
&lt;textarea name=&quot;backref&quot;&gt;電話番号$1\r\n&lt;br /&gt;&lt;/textarea&gt;
</pre>
<p>なんか\r\nがそのまま出力されてるんですよ。あれーってなるじゃないですか。<br />
で、僕はバックスラッシュがうまく処理されてないのかなって思って、こうやるわけですよ。</p>
<pre class="brush: php;">
&lt;?php
$str = stripshashe(implode(&quot;\\r\\n&quot;, $reg));
?&gt;
&lt;textarea name=&quot;reg&quot;&gt;&lt;?php echo $str; ?&gt;&lt;/textarea&gt;
</pre>
<p>ところが全然ダメなんですね！　で、ググるじゃないですか。</p>
<p>そうすると、nl2br使えとか得意気にいってるページしかヒットしないんですよ。</p>
<p>途方にくれましたよ。</p>
<p>で、まさかと思ってこうやってみたわけです。</p>
<pre class="brush: php;">
$str = implode(&quot;
&quot;, $reg));
?&gt;
&lt;textarea name=&quot;reg&quot;&gt;&lt;?php echo $str; ?&gt;&lt;/textarea&gt;
</pre>
<p>これでうまく行ったんですよ&#8230;</p>
<p>理由はまったくわかりません。でも、PHPってほんとかわいい奴だなって思いました。</p>
<div class="tmkm-amazon-view">
	<p><a href="http://www.amazon.co.jp/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-Jan-Goyvaerts/dp/4873114500%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dhametuha-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873114500" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51WWtGcy1dL._SL160_.jpg" border="0" alt="" /></a></p>
	<p><a href="http://www.amazon.co.jp/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-Jan-Goyvaerts/dp/4873114500%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dhametuha-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873114500" target="_blank">正規表現クックブック</a></p>
	<p><em>著者／訳者：</em>Jan Goyvaerts, Steven Levithan</p>
	<p><em>出版社：</em>オライリージャパン( 2010-04-15 )</p>
	<p><em>定価：</em>￥ 4,410</p>
	<p>大型本 ( 552 ページ )</p>
	<p>ISBN-10 : 4873114500</p>
	<p>ISBN-13 : 9784873114507</p>
<hr class="tmkm-amazon-clear" /></div>


<p>Related posts:<ol><li><a href='http://takahashifumiki.com/web/programing/659/' rel='bookmark' title='Permanent Link: 複数のWordPressでユーザ情報を共有する'>複数のWordPressでユーザ情報を共有する</a></li>
<li><a href='http://takahashifumiki.com/web/22/' rel='bookmark' title='Permanent Link: Wordpressのパスワード認証を別アプリに流用する方法'>Wordpressのパスワード認証を別アプリに流用する方法</a></li>
<li><a href='http://takahashifumiki.com/literature/38/' rel='bookmark' title='Permanent Link: 文芸作品としてのコード、コードとしての文芸作品'>文芸作品としてのコード、コードとしての文芸作品</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/874/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/874/" />
	</item>
		<item>
		<title>WordPressのテスト環境と本番環境を同期する時に使えるSQL文</title>
		<link>http://takahashifumiki.com/web/programing/856/</link>
		<comments>http://takahashifumiki.com/web/programing/856/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 19:11:34 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[引っ越し]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=856</guid>
		<description><![CDATA[WordPressに限らず、ブログやCMSを運営している人はローカル環境と本番環境を持っていたりすると思います。
で、大体サーバ上にあるデータをFTPでローカルに落として来て環境を反映させたりするのですが、DB内に記述さ [...]]]></description>
			<content:encoded><![CDATA[<p>WordPressに限らず、ブログやCMSを運営している人はローカル環境と本番環境を持っていたりすると思います。</p>
<p>で、大体サーバ上にあるデータをFTPでローカルに落として来て環境を反映させたりするのですが、DB内に記述されている画像ファイルやらリンクやらが書き変わってしまうのが困りもの。</p>
<p>たとえばhttp://example.jpで運営しているサイトのデータベースをローカルに落として来た時、画像がリンク切れを起こしたりするんですね。</p>
<p>これはとても困るので、いつもSQL文をデータベースに発行して書き換えたりするんですが、普段あんまりSQLを書かないので、すぐ忘れてしまいます。</p>
<div id="attachment_857" class="wp-caption alignright" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/04/pma.png"><img src="http://takahashifumiki.com/wp-content/uploads/2010/04/pma-300x210.png" alt="phpMyAdminでSQLを発行するには" title="phpMyAdminでSQLを発行するには" width="300" height="210" class="size-medium wp-image-857" /></a><p class="wp-caption-text">phpMyAdminでSQLを発行するには「SQL」ボタンを押す</p></div>
<p>PHPerにはSQLを覚えていない人って結構多いんじゃないですかね。普段の開発ではそんなに書かなくてもなんとかなっちゃいますからね。</p>
<p>というわけで、とりあえず発行しておくといいSQLはこちらです。</p>
<p>http://example.jp でブログを運営している人が、 http://localhost の開発環境にデータを移す場面を想像して書いてみました。</p>
<p>phpMyAdminとかでデータベースを選択したら、「SQL」を押して発行するといいと思います。<br class="clrR" /></p>
<pre class="brush: sql;">
UPDATE `wp_options` SET option_value = REPLACE(option_value, &quot;http://example.jp&quot;,&quot;http://localhost&quot;);
UPDATE `wp_posts` SET post_content = REPLACE(post_content, &quot;http://example.jp&quot;,&quot;http://localhost&quot;), guid = REPLACE(guid, &quot;http://example.jp&quot;,&quot;http://localhost&quot;);
UPDATE `wp_links` SET link_image = REPLACE(link_image, &quot;http://example.jp&quot;,&quot;http://localhost&quot;), link_url = REPLACE(link_url, &quot;http://example.jp&quot;,&quot;http://localhost&quot;);
</pre>
<p>と、紹介しておきながらふと思ったんですが、これって簡単に書けそうですね。</p>
<p>書いてみました。</p>
<pre class="brush: php;">&lt;?php
	require_once dirname(__FILE__).DIRECTORY_SEPARATOR.&quot;wp-load.php&quot;;
	$old_url = get_bloginfo(&quot;url&quot;);
	$new_url = &quot;http://localhost&quot;; //←適宜書き換えてください。末尾のスラッシュの有無に注意！

	$sql = array(
	                    &quot;UPDATE `{$table_prefix}options` SET option_value = REPLACE(option_value, '{$old_url}','{$new_url}')&quot;,
	                    &quot;UPDATE `{$table_prefix}posts` SET post_content = REPLACE(post_content, '{$old_url}','{$new_url}'), guid = REPLACE(guid, '{$old_url}','{$new_url}')&quot;,
	                    &quot;UPDATE `{$table_prefix}links` SET link_image = REPLACE(link_image, '{$old_url}','{$new_url}'), link_url = REPLACE(link_url, '{$old_url}','{$new_url}')&quot;
	                    );
	foreach($sql as $s){
		$wpdb-&gt;query($s);
	}
?&gt;</pre>
<p>上記のファイルをWordPressのルートフォルダに置いて、ブラウザからアクセスするとたぶん置換できると思います。</p>
<p>ただし、完全に思いつきで書いたので、ダメでも苦情はナシでお願いします。基本的にローカルの開発環境を想定していますので、サーバに上げたりして飛んでもないことが起きても知りませんよ。</p>
<p>ところで、最近WordPressでサイトを作っていて思うのは、管理画面をハードにカスタマイズする案件が面倒だなと思います。</p>
<p>ちょっと工夫すれば管理画面ジェネレータを作れそうな気がしてるんですが、需要はあるのかな。</p>
<p>あと、yumとかMacportみたいにプラグイン同士の依存を解決する仕組みも欲しいですね。「このプラグインはプラグインAがインストールされていなければ使用できません。インストールしますか？」みたいな。</p>
<p>破滅派も会社になるので、そういうサービスを提供することを考えておいた方がいいんでしょうか。うーむ。</p>


<p>Related posts:<ol><li><a href='http://takahashifumiki.com/web/programing/659/' rel='bookmark' title='Permanent Link: 複数のWordPressでユーザ情報を共有する'>複数のWordPressでユーザ情報を共有する</a></li>
<li><a href='http://takahashifumiki.com/web/603/' rel='bookmark' title='Permanent Link: WordPressが重くなる理由わかった～結局さくらサーバ移転へ'>WordPressが重くなる理由わかった～結局さくらサーバ移転へ</a></li>
<li><a href='http://takahashifumiki.com/web/22/' rel='bookmark' title='Permanent Link: Wordpressのパスワード認証を別アプリに流用する方法'>Wordpressのパスワード認証を別アプリに流用する方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/856/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/856/" />
	</item>
		<item>
		<title>MooShellでJavascriptのコードをブログに貼って自慢する方法</title>
		<link>http://takahashifumiki.com/web/programing/802/</link>
		<comments>http://takahashifumiki.com/web/programing/802/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 15:30:42 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MooTools]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=802</guid>
		<description><![CDATA[Flashにはカヤックさんが作ったwonderflというWebサービスがあって、自分の書いたコードを公開したり、他人の書いたコードをフォークすることができるというのは、Flasherならもちろん知ってると思います。
この [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_806" class="wp-caption alignleft" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/03/mooshell.png"><img class="size-medium wp-image-806" title="mooshell" src="http://takahashifumiki.com/wp-content/uploads/2010/03/mooshell-300x193.png" alt="Javascritpのコード共有サービス MooShell" width="300" height="193" /></a><p class="wp-caption-text">Javascritpのコード共有サービス MooShell</p></div>
<p>Flashにはカヤックさんが作った<a href="http://wonderfl.net/">wonderfl</a>というWebサービスがあって、自分の書いたコードを公開したり、他人の書いたコードをフォークすることができるというのは、Flasherならもちろん知ってると思います。</p>
<p>このWonderflのいいところは、コードを紹介するときに一々パブリッシュしなくてもYoutubeと同じ用な流儀で自分のブログに貼付けたりできることですね。</p>
<p>Javascrptの場合、ブログの投稿欄にscriptタグを書くことさえ許可されていれば、コードの紹介自体ができるんですが、ちょっと面倒です。</p>
<p>で、実はJavascriptにもWonderflみたいなサービスがあって、それが<a href="http://mootools.net/shell/">MooShell</a>です。</p>
<p>元々はJavascriptライブラリである<a href="http://mootools.net">MooTools</a>のコードを共有するためのものですが、Javascriptであれば動くので、なんだっていいと思います。</p>
<p>書いたコードのページをリンクで共有することもできますし、こんな風に自分のブログに貼ることもできます。（右上の再生ボタンでコード実行）<br class="clrL" /></p>
<p><iframe style="width: 100%; height: 300px" src="http://mootools.net/shell/bkH9X/embedded/"></iframe></p>
<p>どうです、インターフェースがかっこいいでしょ！</p>
<h2>MooShellの使い方</h2>
<p>使い方は簡単です。</p>
<ol>
<li>まずは<a href="http://mootools.net/shell/">MooShell</a>にアクセスします。</li>
<li>ChangeSettingタブをクリックして、TitleとDescriptionを設定します。</li>
<li>もし他のライブラリなどを使っているなら、Add Resourceに追加。この場合、リソースはどっかのサーバに上げておく必要があります。WordPressならアップロードしてそのURLを貼れば簡単ですね。</li>
<li>Choose Versionタブをクリックして、MooToolsのバージョンを選びます。プラグインも使いたいなら選ぶことができます。</li>
<li>Ajaxを使うなら、エンドポイントも提供されています。<a href="http://mootools.net/shell/zalun/nqvLP/">サンプル</a>を見た方がわかりやすいでしょう。</li>
<li>ページ左下にあるiframeタグを使ってブログに貼付けます（WordPressのビジュアルエディタはiframeを消去するので注意！）</li>
</ol>
<p>というわけで、簡単にですが紹介してみました。</p>
<p>ブログでJavascriptを紹介するのって、実行コードと説明用コードサンプルを書かないといけないので、面倒くさくてやりませんでしたが、これからは簡単にできそうです。</p>
<p>ちなみに、jQueryを使いたい方は、<a href="http://code.google.com/intl/ja/apis/ajaxlibs/">Google Ajax Libraries API</a>を使うといいんじゃないでしょうか。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/802/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/802/" />
	</item>
		<item>
		<title>Flashの低帯域ユーザ体験を再現するための低速サーバ構築 on Mac OS X</title>
		<link>http://takahashifumiki.com/web/programing/794/</link>
		<comments>http://takahashifumiki.com/web/programing/794/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 16:23:34 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[サーバ]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=794</guid>
		<description><![CDATA[他人に教える用です。あんまり面白くはないです。
低速サーバを構築する目的
会社のお仕事でFLVをプログレッシブダウンロードで読み込んで再生するFlashプレイヤーを作ったのですが、回線が速すぎて、下記の2つを検証できませ [...]]]></description>
			<content:encoded><![CDATA[<p>他人に教える用です。あんまり面白くはないです。</p>
<h2>低速サーバを構築する目的</h2>
<div id="attachment_795" class="wp-caption alignright" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/02/loading_bar_fast.jpg"><img class="size-medium wp-image-795" title="一瞬でFLVの読み込みが終わる" src="http://takahashifumiki.com/wp-content/uploads/2010/02/loading_bar_fast-300x244.jpg" alt="読み込みが速すぎて検証できないよ.." width="300" height="244" /></a><p class="wp-caption-text">読み込みが速すぎて検証できないよ..</p></div>
<p>会社のお仕事でFLVをプログレッシブダウンロードで読み込んで再生するFlashプレイヤーを作ったのですが、回線が速すぎて、下記の2つを検証できませんでした。</p>
<ul>
<li>ファイル読み込みが完了していない時点まで再生が進んだ場合</li>
<li>せっかちなユーザーがシークバーを読み込みの完了していない部分まで引っ張ってしまった場合</li>
</ul>
<p>本当はYoutubeみたいに途中から再生するやつを作りたかったんですが、面倒くさそうなんで後日。なにやらPHPで動画を切り出して渡すらしい。（参考：<a href="http://www.flashcomguru.com/index.cfm/2005/11/2/Streaming-flv-video-via-PHP-take-two">&#8216;Streaming &#8216; flv via PHP, take two</a>）</p>
<p>なにはともあれ、低帯域の環境を再現する必要があったわけです。</p>
<h2>thttpdに出会うまで</h2>
<p>会社ではFlash CS3をMac OS X 10.5.8で使ってます。</p>
<p>Flashに低速環境を再現するモードがあった気がしたんですが、見つけられず。Device Centralにもそういう機能はなし。</p>
<p>Windowsだと<a href="http://hp.vector.co.jp/authors/VA036210/aboutnegies1.html">NEGIES</a>というソフトがあるようなんですが、Macだったので、ダメ。</p>
<p>さらに付け加えると、いちいちFTPしたくないので、Flashでパブリッシュしたらすぐ確認できるようなローカル環境が望ましい。リモート・サーバに上げるとかは無し。</p>
<p>で、探してみると、こんなエントリーが。</p>
<blockquote><p>thttpdには、設定ファイル「thttpd.throttle」で、ファイルの拡張子毎に使用する帯域を設定できるというとても便利な機能がある。<a href="http://shield.jp/blog/?p=4"><cite>(Flashのテスト用に)低速に振舞うWebサーバを建てる</cite></a></p></blockquote>
<p>これで決まり。</p>
<h2>thttpdをインストールしてから動くまで</h2>
<p>一応、環境はこんな感じです。完全自己責任でお願いします。</p>
<ul>
<li>Mac OS X 10.5.8</li>
<li>MacPortsにていろいろインストール済み</li>
<li>makeしてインストールしたものはほとんどない（気がする）</li>
</ul>
<p>さて、<a href="http://acme.com/software/thttpd/">本家thttpdのサイト</a>を見てみると、./configureしてmakeしてとか書いてある。MacPortsにないかなと探したけどなかった。</p>
<p>しかし、さらにググると、<a href="http://do.homeunix.org/ThttpdOnMacOsX.html?index">Mac OS Xにもパッチをあてれば入る</a>らしいということが判明。</p>
<p>いわれたとおりにパッチを当ててからのインストールを試みる。デフォルトでは/usr/local/sbinにインストールされるとのこと。</p>
<p>ルートユーザになってない人は先頭にsudoを追加してください。</p>
<pre class="brush: bash;">mkdir /usr/local/src #とりあえずダウンロード用のフォルダを作る。
cd /usr/local/src #移動
wget http://www.acme.com/software/thttpd/thttpd-2.25b.tar.gz #ダウンロード
gunzip thttpd-2.25b.tar.gz #解凍
tar xpf thttpd-2.25b.tar
cd thttpd-2.25b #フォルダ内に移動
wget http://do.homeunix.org/pub/thttpd-macosx.patch #パッチをダウンロード
patch thttpd.c &gt; thttpd-macosx.patch #パッチを適用</pre>
<p>これでインストールできるはずだったんですが、./configureでエラー！</p>
<p>ググった情報を参考にしてとりあえずmakeまで終える。</p>
<pre class="brush: bash;">./configure --host=darwin
make</pre>
<p>ここまではオッケー。しかし、make installでまた失敗。</p>
<p><a href="http://www.kurano.jp/tech/promenade.cgi?id=984">手動でインストールした猛者</a>もいるようですが、makeの仕方・仕組みがわからないので別の方法を探す。</p>
<blockquote><p>これはbinというユーザーが存在しないため。<a href="http://karetta.jp/article/blog/oneline/252370"><cite>Mac OS X 10.5でbinユーザーを作成する</cite></a></p></blockquote>
<p>な・る・ほ・ど〜。では、binを作成。</p>
<pre class="brush: bash;">sudo dscl . create /Groups/bin
sudo dscl . create /Users/bin</pre>
<p>これでいいのか？</p>
<pre class="brush: bash;">sudo make install</pre>
<p>できたー！</p>
<p>さて、本家マニュアルにある通り、/etc/thttpd.confを編集しようとするが&#8230;.存在しない！　ここで絶望のズンドコにたたき落とされる。</p>
<p>ここで諦めず、Spotlightで検索。ダウンロードしたソースファイルの中に発見！　これをコピーして使います。</p>
<pre class="brush: bash;">cp /usr/local/src/thttpd-2.25b/contrib/redhat-rpm/thttpd.conf /etc/thttpd.conf</pre>
<p>中身を編集。</p>
<pre class="brush: bash;"># This section overrides defaults
dir=/path/to/document_root
nochroot
user=&lt;ユーザー名&gt;
#default=nobody
logfile=/Users/&lt;ユーザー名&gt;/Library/Logs/thttpd.log
pidfile=/Users/&lt;ユーザー名&gt;/Library/run/thttpd.pid
# This section _documents_ defaults in effect
port=8080
# nosymlink# default = !chroot
# novhost
# nocgipat
throttles=/etc/thttpd.throttles
# host=0.0.0.0
charset=utf-8</pre>
<p>で、重要なのは13行目で指定したthrottlesファイル。これが帯域速度を制限するための設定ファイルです。これを作成します。</p>
<pre class="brush: bash;">sudo vi /etc/thttpd.throttles #ファイルを作成
#Configuration File for thttpd
**.flv  5000 #limit FLV files to 1/30 fo T1 #これでflvの拡張子が5000バイト/秒でしか読み込まれない</pre>
<p>これで準備オーケー！　起動します。</p>
<pre class="brush: bash;">cd /usr/local/sbin/thttpd -C /etc/thttpd.conf #面倒くさかったらパスを通してください。</pre>
<p>http://localhost:8080 にアクセス！　サーバー動いた！　でも画面が真っ黒！</p>
<p>Firebug先生に聞いてみたところ、どうやらFlash埋込み用のJavascriptをHTMLとして解釈しているっぽいです。</p>
<p>ApacheでいうところのAdd type text/javascript が必要っぽい。しかし、ここはHTMLにJavascriptを直書きすることにして回避。</p>
<div id="attachment_796" class="wp-caption alignleft" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/02/loading_bar_late.jpg"><img class="size-medium wp-image-796" title="FLVの読み込みが50kbpsに" src="http://takahashifumiki.com/wp-content/uploads/2010/02/loading_bar_late-300x243.jpg" alt="見よ、この圧倒的な遅さ！" width="300" height="243" /></a><p class="wp-caption-text">見よ、この圧倒的な遅さ！</p></div>
<p>で、ようやっと動きました。いやー、プログレスバーが圧倒的に置き去りにできるようになりました。</p>
<p>ところで、このthttpdははじめっからデーモンで動いているっぽいです。</p>
<p>止め方がわかんなかったので、アクティビティモニタでthttpdを選択して「プロセス終了」終了。これで当初の目的は果たせました。</p>
<h3 class="clrL">thttpdを使ってみての感想</h3>
<p>やっぱりApacheほどは設定が細かくないし、CGIも激遅っぽいのでアレですが、throlltesだけでも使うメリットはありますね。</p>
<p>設定できる機能は他にもいろいろあるみたいなので、あとは<a href="http://acme.com/software/thttpd/thttpd_man.html">マニュアル</a>参照してください。</p>
<p>最近はiPhoneをはじめとする3G端末でもガンガンPCサイト見るので（iPhoneはFlashダメだけど）、帯域のパフォーマンス確認は必要です。</p>
<p>Docomo for PCとか、潰れかけのWillcomとかも3Gですしね。</p>
<p>あと、これからはGoogle先生もサイトのスピードを評価するらしいので、いろんなところで役に立つかも。</p>
<p>というわけで、終わり。</p>


<p>Related posts:<ol><li><a href='http://takahashifumiki.com/web/programing/777/' rel='bookmark' title='Permanent Link: Flex SDK 4のアップデートで色々エラー'>Flex SDK 4のアップデートで色々エラー</a></li>
<li><a href='http://takahashifumiki.com/web/programing/659/' rel='bookmark' title='Permanent Link: 複数のWordPressでユーザ情報を共有する'>複数のWordPressでユーザ情報を共有する</a></li>
<li><a href='http://takahashifumiki.com/web/programing/717/' rel='bookmark' title='Permanent Link: WordPressクラックされちゃった記念、2.8.4にアップデート'>WordPressクラックされちゃった記念、2.8.4にアップデート</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/794/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/794/" />
	</item>
		<item>
		<title>Flex SDK 4のアップデートで色々エラー</title>
		<link>http://takahashifumiki.com/web/programing/777/</link>
		<comments>http://takahashifumiki.com/web/programing/777/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 13:49:46 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[バグ]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=777</guid>
		<description><![CDATA[困りました困りました！　あまりにも困ったので、この苦しみを二度と繰り返さないために書いておきます。
1.Flex SDKをアップデート
現在、Flash Builder β2でアプリケーションを作成しているのですが、Te [...]]]></description>
			<content:encoded><![CDATA[<p>困りました困りました！　あまりにも困ったので、この苦しみを二度と繰り返さないために書いておきます。</p>
<h3>1.Flex SDKをアップデート</h3>
<p>現在、Flash Builder β2でアプリケーションを作成しているのですが、TextLayoutFrameworkで背景色の指定にバグありとの記述を見つけたので、急遽Flex SDKをアップデートすることにしました。</p>
<p>要するに、Flash Builder β2に元々入っていたSDKを4.0.0.10485から最新の安定版リリースである4.0.0.13875へ上げたわけですね。</p>
<p>Adobe Open Sourceの<a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4">ダウンロードページ</a>からSDKをダウンロードして解凍、Flash Builderのフォルダ（今回はWin XPだったので<cite>C:\Program Files\Adobe\Adobe Flash Builder Beta 2\sdks</cite>）にコピー。</p>
<p><cite>プロジェクト＞プロパティ＞Flex コンパイラー</cite>とパネルを開き、「Flex SDKの設定&#8230;」をクリックします。</p>
<p>で、「追加」で新しいSDKを選び、それをデフォルトに設定しました。</p>
<h3>2.mx名前空間で名前解決できてないっぽい</h3>
<p>アップデートといってもマイナーバージョンの変更だからそのまま動くかと思いきや、いきなりエラー！</p>
<div id="attachment_778" class="wp-caption alignleft" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/02/implementation-error.jpg"><img class="size-medium wp-image-778" title="&lt;mx:Text&gt;でエラー" src="http://takahashifumiki.com/wp-content/uploads/2010/02/implementation-error-300x261.jpg" alt="Textひとつ置けないというのか！" width="300" height="261" /></a><p class="wp-caption-text">Textひとつ置けないというのか！</p></div>
<p>パッケージエクスプローラーに赤い×がぽちぽちついています。しかも、新規プロジェクトを作成直後にいきなりエラーを起こしたりと、すごいヤンチャぶり。</p>
<p>最初のエラーはTextコンポーネントを置いただけで起きました。<cite>&lt;mx:Text&gt;をコンポーネントの実装に解決できませんでした</cite>というエラーメッセージ。<br class="clrL" /></p>
<div id="attachment_779" class="wp-caption alignleft" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/02/intellisence-error.jpg"><img class="size-medium wp-image-779" title="Flash Builderインテリセンスエラー" src="http://takahashifumiki.com/wp-content/uploads/2010/02/intellisence-error-300x261.jpg" alt="nsってもしかしてnamespaceの略？" width="300" height="261" /></a><p class="wp-caption-text">nsってもしかしてnamespaceの略？</p></div>
<p>名前空間が変更になったのかと思ってコードヒントを出してみると、これまで&lt;mx:Text&gt;だったのが、&lt;ns:Text&gt;になってる。なにこれ。</p>
<p>入力すると一応動きますが、すべてのmxタグを変更するのはなんかイヤ。</p>
<p>色々ググった結果、Flexにはこれまでもこういう悲しい歴史があったとか、なかったとかいうことがわかりました。<br class="clrL" /></p>
<p>とりあえず現状を確認するため、設定ファイルを確認してみることに。</p>
<div id="attachment_780" class="wp-caption alignleft" style="width: 300px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/02/namespace.jpg"><img class="size-medium wp-image-780" title="flex-config.xml" src="http://takahashifumiki.com/wp-content/uploads/2010/02/namespace-290x300.jpg" alt="Flexの設定ファイル。はじめて開いた。" width="290" height="300" /></a><p class="wp-caption-text">Flexの設定ファイル。はじめて開いた。</p></div>
<p>僕の場合、設定ファイルは<cite>C:\Program Files\Adobe\Adobe Flash Builder Beta 2\sdks\4.0.0.13875\frameworks\flex-config.xml</cite>にありました。</p>
<p>これを確認すると、やっぱり名前空間のURIが変わってます。<br class="clrL" /></p>
<p>デフォルトのアプリケーションコンポーネントは下記のようなコードがMain.mxmlに書かれるので、mxのURIは<cite>library://ns.adobe.com/flex/halo</cite>のはずなんですが。</p>
<pre class="brush: xml;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
   &lt;s:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
   xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
   xmlns:mx=&quot;library://ns.adobe.com/flex/halo&quot;
   minWidth=&quot;1024&quot; minHeight=&quot;768&quot;&gt;
   &lt;fx:Declarations&gt;
      &lt;!-- Place non-visual elements (e.g., services, value objects) here --&gt;
   &lt;/fx:Declarations&gt;
&lt;/s:Application&gt;</pre>
<p>設定ファイルによると、名前空間mxのURIは<cite>library://ns.adobe.com/flex/mx</cite>となっています。</p>
<p>これを変更してみると、名前空間の参照エラー、コードヒントともに直りました</p>
<p>というわけで、アプリケーションやコンポーネントを作成するときはmxの名前空間をちょろっとだけ変えます。</p>
<pre class="brush: xml;">xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot; //haloをmxに</pre>
<p>なんでhaloがボツになったのかはわかりません。ガンダムに出てくるからでしょうか。</p>
<h3>3.コンパイル時にランタイムエラー</h3>
<p>さて、これで直ったわいと左うちわでデバッグしてみたところ、いきなりランタイムエラー！　バカー！</p>
<p><cite>VerifyError: Error #1014: クラス spark.skins::SparkSkin が見つかりません</cite>というメッセージが出ました。</p>
<div id="attachment_781" class="wp-caption alignleft" style="width: 253px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/02/adobe-sdk.jpg"><img class="size-medium wp-image-781" title="adobe-sdk" src="http://takahashifumiki.com/wp-content/uploads/2010/02/adobe-sdk-243x300.jpg" alt="Adobe Open SourceのDLページ" width="243" height="300" /></a><p class="wp-caption-text">Adobe Open SourceのDLページ</p></div>
<p>また見つかんねーのかよ、と思ったところ、この対処法は<a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4">ダウンロードページ</a>に書いてありました。</p>
<p>spark.skin.swcがRSLであるため起きるエラーだとか。ビルド番号13079から起きるようになったらしいです。</p>
<p>なんのこっちゃわかりませんが、公式リリースには直るとのこと。応急処置だけやっておきます。<br class="clrL" /></p>
<div id="attachment_782" class="wp-caption alignleft" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/02/change-property.jpg"><img class="size-medium wp-image-782" title="Flash Builderのプロジェクト設定変更" src="http://takahashifumiki.com/wp-content/uploads/2010/02/change-property-300x273.jpg" alt="用語が統一できてないぞ！" width="300" height="273" /></a><p class="wp-caption-text">用語が統一できてないぞ！</p></div>
<p><cite>プロジェクト＞プロパティ＞Flex ビルドパス</cite>を選択し、「フレームワークのリンク」項目を「SDKのデフォルトを使用する（ランタイム共有ライブラリ）」から「コードにマージされます」に変更する。</p>
<p>同じ選択肢で「ですます」調と「である」調が混在しているのは、β版ならではでしょうか。</p>
<p>ともかく、これでランタイムエラーも消え、これまで通りに動くようになりました。<br class="clrL" /></p>
<h3>4.雑感</h3>
<ul>
<li>AdobeはFlexの名前の付け方にそうとう苦慮している。Flash Professional, Flash Catalyst, Flash Builder, Flex Builder, Flex SDKと、もう何が何だかわからない。Spark、halo、mx、fxも、スキンの名前なのかコンポーネントの名前なのか、「俺がお前でお前が俺で」みたいな状況です。</li>
<li>毎回プロジェクトのデフォルトファイルを書き換えるのは面倒臭い。設定方法を知っている人がいたら教えて下さい。</li>
<li><a href="http://progression.jp/ja/">Progression</a>とFlexのどっちで作ったらいいか、まだまだ悩みはつきない。</li>
</ul>
<h3>追記＠2010/02/07</h3>
<p>この後、インテリセンス（コードヒント）でflashパッケージがすべて出てこなくなる現象に遭遇。</p>
<p>ググったところ、<a href="http://stackoverflow.com/questions/326110/flex-intellisense-forgets-flash">Flex intellisense forgets flash.*</a>という記事に遭遇して、言われたとおりにしたら直りました。</p>
<p><cite>プロジェクト＞プロパティ＞Flex ビルドパス</cite>を選択して、ライブラリパスのタブを選択。</p>
<p>ビルドパスライブラリにplayerglobal.swcを追加。このファイル自体は<cite>C:\Program Files\Adobe\Adobe Flash Builder Beta 2\sdks\4.0.0.13875\frameworks\libs\player</cite>にありました。</p>
<p>うーん、すでにここへのライブラリパスを通ってるっぽいんだけどなあ、と不思議に思っていたところ、理由が判明。</p>
<p>ランタイムエラーを消すために「フレームワークのリンク」を「ランタイム共有ライブラリ（RSL）の使用」から「コードにマージされます」に変更しましたが、これが原因だったっぽいです。</p>
<p><acronym title="ランタイム共有ライブラリ">RSL</acronym>ってのは<a href="http://livedocs.adobe.com/flex/3_jp/html/help.html?content=rsl_01.html">Adobeのヘルプ</a>にありましたが、要するにFlash Playerで使い回す共有のライブラリ（まさにflash.*パッケージ）を埋め込まずに、使い回すことです。</p>
<p>このライブラリはFlash Playerがはじめて使われるときにダウンロードされ、半永続的にキャッシュされるらしいです。それを使い回すので、個々のswfファイルが軽くなるというわけですね。</p>
<p>「コードにマージされます」というのは、RSLを使わずにすべてのライブラリをswfに埋め込むこと。</p>
<p>ってことは、僕がこのページで書いたとおりにすると、swfが重くなることになります。普段は埋め込まないflashパッケージを全部埋め込んでるんだから&#8230;</p>
<p>どうやら、リリースビルドの時はplayerglobal.swcへのライブラリパスを外す必要がありそうです。</p>


<p>Related posts:<ol><li><a href='http://takahashifumiki.com/web/programing/710/' rel='bookmark' title='Permanent Link: TextlayoutFrameworkやFlash.text.engineで埋め込みOpenTypeフォントを使う方法'>TextlayoutFrameworkやFlash.text.engineで埋め込みOpenTypeフォントを使う方法</a></li>
<li><a href='http://takahashifumiki.com/web/programing/449/' rel='bookmark' title='Permanent Link: WordPressとflashでブログ縦書き化計画(3)'>WordPressとflashでブログ縦書き化計画(3)</a></li>
<li><a href='http://takahashifumiki.com/web/programing/468/' rel='bookmark' title='Permanent Link: WordPressとflashでブログ縦書き化計画(4)'>WordPressとflashでブログ縦書き化計画(4)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/777/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/777/" />
	</item>
		<item>
		<title>WordPressとFlashでブログ縦書き化計画(10)</title>
		<link>http://takahashifumiki.com/web/programing/774/</link>
		<comments>http://takahashifumiki.com/web/programing/774/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 20:13:22 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[縦書きブログ]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=774</guid>
		<description><![CDATA[このエントリーをずっと書いていなかったので、何もやっていないと思われたらアレだなと書いてみます。
現在、WordPressとFlashで縦書きを実装するのはすでにできていて、それにルビと改ページを挿入することはできました [...]]]></description>
			<content:encoded><![CDATA[<p>このエントリーをずっと書いていなかったので、何もやっていないと思われたらアレだなと書いてみます。</p>
<p>現在、WordPressとFlashで縦書きを実装するのはすでにできていて、それにルビと改ページを挿入することはできました。</p>
<p>あとはクオリティに目をつぶれば、公開できる段階まで来ました。</p>
<p>当初のリリースに併せて実装したかった機能は少額決済なんですが、選択肢があんまりないですね。</p>
<p>イプシロンなどのクレジットカード決済も安くなったのですが、<a href="http://www.ideaxidea.com/archives/2009/11/more_than_1000_is_ok.html">百式情報によると、1000円以下だととたんに審査が厳しくなる</a>とのこと。</p>
<p>法人化すれば済むのかと思っていましたが、そうでもないみたいですね。</p>
<p>唯一の選択肢としてあるのが、日本での普及率がイマイチな<a href="http://www.paypal.jp/jp/cgi-bin/webscr?cmd=_home">Paypal</a>。</p>
<p>とりあえず、パソコンで電子決済できればよしとして、Paypalが日本の携帯電話に対応するのを気長に待つとします。</p>
<p>なんか本腰入れて参入するみたいですしね。</p>
<p>で、今回の本題なんですが、WordPressとFlashのTextLayoutFrameworkを組み合わせてブログを書いている方を発見しました。</p>
<div id="attachment_775" class="wp-caption alignleft" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2010/01/macromarionette.png"><img class="size-medium wp-image-775" title="macromarionette" src="http://takahashifumiki.com/wp-content/uploads/2010/01/macromarionette-300x203.png" alt="組版が美しいデザインです" width="300" height="203" /></a><p class="wp-caption-text">組版が美しいデザインです</p></div>
<p>佐賀一郎さんという方で、<a href="http://macromarionette.com">macromarionette</a>というのが件のブログです。相当ハイクオリティですね。</p>
<p>経歴を拝見するに、デザインの専門家でいらっしゃるみたいなので、むべなるかな、という感じです。</p>
<p>これはぜひ見習いたいですね。</p>
<p>はじめはFlexで作られていたようですが、このブログは<a href="http://progression.jp/ja/">Progression</a>で作っているみたいです。</p>
<p>やっぱデザイン得意な形はFlash Professionalの方がやりやすいんでしょうか。</p>
<p>というわけで、2月中には破滅派に縦書きを実装して、その後、iPhone対応・携帯対応を急ぎたいと思います。</p>


<p>Related posts:<ol><li><a href='http://takahashifumiki.com/web/programing/449/' rel='bookmark' title='Permanent Link: WordPressとflashでブログ縦書き化計画(3)'>WordPressとflashでブログ縦書き化計画(3)</a></li>
<li><a href='http://takahashifumiki.com/web/programing/597/' rel='bookmark' title='Permanent Link: WordPressとFlashでブログ縦書き化計画(9)'>WordPressとFlashでブログ縦書き化計画(9)</a></li>
<li><a href='http://takahashifumiki.com/web/programing/559/' rel='bookmark' title='Permanent Link: WordPressとflashでブログ縦書き化計画(6)'>WordPressとflashでブログ縦書き化計画(6)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/774/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/774/" />
	</item>
		<item>
		<title>WordPressクラックされちゃった記念、2.8.4にアップデート</title>
		<link>http://takahashifumiki.com/web/programing/717/</link>
		<comments>http://takahashifumiki.com/web/programing/717/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 14:21:13 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[クラック]]></category>
		<category><![CDATA[恥ずかしい話]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=717</guid>
		<description><![CDATA[WordPress公式ブログでも盛んに喧伝されていましたが、WordPress2.8.4以前に致命的な脆弱性が見つかったとのことです。

管理者アカウントを勝手に作られる
パーマリンク構造を勝手に変更されてスパムリンクを [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress公式ブログでも盛んに喧伝されていましたが、<a href="http://ja.wordpress.org/2009/08/12/2-8-4-security-release/">WordPress2.8.4以前に致命的な脆弱性が見つかった</a>とのことです。</p>
<ul>
<li>管理者アカウントを勝手に作られる</li>
<li>パーマリンク構造を勝手に変更されてスパムリンクを仕込まれる</li>
<li>最悪の場合、サイト全体を削除される</li>
</ul>
<p>詳しくは公式ブログをご覧頂ければわかるので割愛しますが、実際に乗っ取られた経験談でも書きたいと思います。</p>
<h3>1.WordPress2.6.5は9月、静かに死んでいった</h3>
<div id="attachment_718" class="wp-caption alignleft" style="width: 310px"><a href="http://takahashifumiki.com/wp-content/uploads/2009/09/CE089_L.jpg"><img class="size-medium wp-image-718" title="これは栗ね。クラッカーの画像なかった" src="http://takahashifumiki.com/wp-content/uploads/2009/09/CE089_L-300x225.jpg" alt="これは栗ね。クラッカーの画像なかった" width="300" height="225" /></a><p class="wp-caption-text">これは栗ね。クラッカーの画像なかった</p></div>
<p>乗っ取られたのは僕が複数運営しているWordPressの一つです。</p>
<p>他のサイトはすぐに2.8.4にしていたのですが、このサイトだけ激しくカスタマイズした上、新規ユーザ登録できるようにして他の使い方をしていたので、ちょっと面倒で後回しにしていたんですね。</p>
<p>兆候が出たのは9月の初旬。</p>
<p>それまでは滅多にユーザ登録などこなかったのですが、9月初旬だけで5人。これはおかしいなと管理画面を覗いてみました。</p>
<p>パーマリンクがデフォルトの「?p=123」に戻っています。「ぬかったわ！」と一括、早速ユーザ画面を見てみると、gmailアカウントで不審なユーザが3名。</p>
<p>「WordPress + メールアドレス」で検索をかけると、海外のつぶやきがヒット。</p>
<blockquote><p>Andrianq running with <strong>pulvillarrac@gmail.com</strong> tried unsuccessfuls hack on 2 Wordpress sites&#8230; must turn off user registration&#8230;<br />
<cite><a href="http://twitter.com/bradyjfrey/statuses/3791545197">@bradyjfrey</a></cite></p></blockquote>
<p>他のアカウントも検索してみたら、またまたブログが2件ヒット。</p>
<blockquote><p>WordPress users, if you have seen the Gmail address: <strong>Pulvillarrac@gmail.com</strong> in your subscribers, you may want to disable or ban the account.  This is the person who registered on my roomies blog through the back door.<br />
<cite><a href="http://mice.org/blog/an-open-note-to-wordpress-spammers-hackers/"> Technical Tidbits</a></cite></p></blockquote>
<blockquote><p>And this is exactly what happened to AC, 7 new users have registered to AC’s WP in the last few days, something that was strange to me, here are their emails:<br />
janson206@Safe-mail.net<br />
<strong> pulvillarrac@gmail.com</strong><br />
<strong> bugbeemershonyhe@gmail.com</strong><br />
obierebelominepyb@gmail.com<br />
<strong> naomyrotenford@gmail.com</strong><br />
<a href="http://arabcrunch.com/2009/09/arabcrunch-and-wordpress-under-attack.html"><cite>ArabCrunch and WordPress Under Attack</cite></a></p></blockquote>
<p>結構大きめのニュースサイトでもやられてしまったようですね。ポイントは「新規ユーザの登録を許可しているかどうか」のようです。</p>
<p>これら3ユーザは管理画面から削除。</p>
<p>それだけでは安心できなくて、データベースを覗いてみると&#8230;メールアカウントを登録していない管理者ユーザが二名追加されていました&#8230;.orz</p>
<p>これは管理画面に現れないため、DBから直接削除しました。</p>
<p>そして、サーバ上の全ファイルを削除して、新規にWordPress2.8.4をインストール。ただし、DBの隅から隅まで見た訳でもないので、しばらく当該サイトを閉鎖して、一から作り直したいと思います。</p>
<h3>2.あったんだかなかったんだかわかんない実害</h3>
<p>今回のクラッキングでは、下記のような症状が出るとのことでした。</p>
<ul>
<blockquote>
<li>パーマリンクやRSSに見慣れない文字列がある。<br />
例：http://example.com/category/%&amp;({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&amp;%/<br />
特徴：eval, base64_decode が含まれている</li>
<li>管理画面のユーザーに見慣れないユーザーの登録がある</li>
<p><a href="http://coliss.com/articles/blog/wordpress/wordpress-info-20090905.html"><cite>コリス</cite></a></p></blockquote>
</ul>
<p>取り急ぎパーマリンクを確認してみると、デフォルトに戻っていました。</p>
<p>攻撃方法としては、パーマリンクを変更してスパムリンクに変えちゃうというものだと思うのですが、なんかミスったんですかね？</p>
<p>スパムリンクは見つかりませんでした。</p>
<p>たしか、パーマリンクを変更したとき、.htaccessへの書き換え権限がないとダメだったような気がするんですが、たまたま利用しているサーバのPHPがモジュール版からCGI版へ移行した時期だったので、apacheからは.htaccessのアクセス権限がなかったのですが、それが不幸中の幸いだったんでしょうか。</p>
<p>取り急ぎ、施した対策を書いておきます。</p>
<ol>
<li>不正なユーザをWordpressの管理画面から消去</li>
<li>管理画面で確認できない不正な管理者をDBから直接消去</li>
<li>デフォルトに変更されていたパーマリンクを元に戻す</li>
<li>管理者パスワード、FTPパスワード、DBパスワードを変更</li>
<li>ファイルの変更日時がユーザ登録日より新しいファイルを検索→なかった</li>
<li>サーバのファイルを全削除</li>
<li>保存してあったローカルコピーをアップロード</li>
<li>WordPressを2.8.4にアップデート</li>
</ol>
<p>クラックの手法などの詳細は<a href="http://sakuratan.biz/archives/1208">ゆっくり…して…イってネ！「現在進行中の WordPress に対する攻撃の詳細と再現」</a>に詳しかったです。</p>
<p>まあ、どっちみち一度クラックされちゃったので、サイトは閉鎖ですわ、閉鎖。</p>
<p>というわけで、とんだ9月初旬のアップデートでした。古いバージョンのまま放置してはいけませんね&#8230;</p>


<p>Related posts:<ol><li><a href='http://takahashifumiki.com/web/programing/659/' rel='bookmark' title='Permanent Link: 複数のWordPressでユーザ情報を共有する'>複数のWordPressでユーザ情報を共有する</a></li>
<li><a href='http://takahashifumiki.com/web/82/' rel='bookmark' title='Permanent Link: WordCamp Tokyo 2008に行ってきました。写真ないけど。'>WordCamp Tokyo 2008に行ってきました。写真ないけど。</a></li>
<li><a href='http://takahashifumiki.com/web/22/' rel='bookmark' title='Permanent Link: Wordpressのパスワード認証を別アプリに流用する方法'>Wordpressのパスワード認証を別アプリに流用する方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/717/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/717/" />
	</item>
		<item>
		<title>TextlayoutFrameworkやFlash.text.engineで埋め込みOpenTypeフォントを使う方法</title>
		<link>http://takahashifumiki.com/web/programing/710/</link>
		<comments>http://takahashifumiki.com/web/programing/710/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 10:02:38 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[フォント]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=710</guid>
		<description><![CDATA[最近気づいたにもかかわらず、日本語情報でこれだというのがないので、書いておきます。
わりと詳しいのはまつにおまかせさんのエントリーですが、その補足という感じです。
CFFフォントとは
Web上で日本語縦書きレイアウトを作 [...]]]></description>
			<content:encoded><![CDATA[<p>最近気づいたにもかかわらず、日本語情報でこれだというのがないので、書いておきます。</p>
<p>わりと詳しいのは<a href="http://isaomatsunami.blogspot.com/2009/05/flex-sdk-on-mac-os.html">まつにおまかせさんのエントリー</a>ですが、その補足という感じです。</p>
<h3><abbr title="Compact Font Format">CFF</abbr>フォントとは</h3>
<p>Web上で日本語縦書きレイアウトを作る方法として有力なのがTextlayoutframeworkとFlash.text.engineなのですが、この2つは従来通りのやり方で埋め込みフォントを使うことができません。</p>
<p>というのは、<abbr title="TextLayoutFramework">TLF</abbr>や<abbr title="flash.text.engine">FTE</abbr>はよりよい文字表現を実現するためなのかなんなのか、<abbr title="Compact Font Format">CFF</abbr>というフォーマットを採用しているようです。これにより、アンチエイリアス処理なんかがきれいになるようなんですが、詳細はよくわかりません。</p>
<p>実際に<a href="http://livedocs.adobe.com/flex/gumbo/langref/">Flex4 Gumboのリファレンス</a>を見てみると、<abbr title="flash.text.engine">FTE</abbr>の<a href="http://livedocs.adobe.com/flex/gumbo/langref/flash/text/engine/FontLookup.html">FontLookupクラス</a>はDEVICEとEMBEDDED_CFF定数しか持っていません。EMBEDDEDというのはないんですね。</p>
<p><abbr title="flash.text.engine">FTE</abbr>を拡張して作られている<abbr title="TextLayoutFramework">TLF</abbr>もしかりです。</p>
<p>普通のTextfieldはembedFontをtrueにすれば埋め込みフォントを使えました。</p>
<p>単にプロパティが異なるだけなら問題ないのですが、困るのは<abbr title="Compact Font Format">CFF</abbr>でのFontクラス作成がちょっと難しいということです。普通にFlash IDEとかで作っても認識してくれません。</p>
<p>よくやる方法としては、フォントを埋め込んだswfを作成して、それを外部から読み込み、内部で定義されているFontクラスを引っこ抜くというものだと思うのですが、これが<abbr title="Compact Font Format">CFF</abbr>で埋め込まれていないとダメなんですね。</p>
<h3><abbr title="Compact Font Format">CFF</abbr>でのフォント埋め込み方法</h3>
<p>簡単に言うと、以下の流れです。FlexならMXML上で直接埋め込むこともできるのですが、Flash IDE(Flash Professionalのこと)で開発している人はそうもいかないと思うので、下記のやり方を覚えるのがいいと思います。</p>
<h4>1.Flash Builder βかFlex SDK4 Gumboをダウンロード</h4>
<p><a href="http://labs.adobe.com/technologies/flashbuilder4/">Flash Builder</a>は必須ではありません。要するに、<a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4">Flex SDK 4</a>以上を使いたいのです。</p>
<p>Flex SDK 3.*系だと、フォントを<abbr title="Compact Font Format">CFF</abbr>でトランスコードするCFFFontManagerが入っていません。（多分）</p>
<p>Flex Builderを買う予定がないという方は我慢してSDKを使った方がいいと思います。以下、Flex SDKを前提に話を進めます。</p>
<h4>2.フォントファイルのコピー</h4>
<p>作業用フォルダ（この場合はHiraginoMincho）にOpenTypeフォントファイルをコピーします。Windowsなら「コントロールパネル＞フォント」フォルダに入ってます。</p>
<h4>3.クラスの作成</h4>
<p>プロジェクトのメインファイル（HiraginoMincho.<del>mxml</del>as）を作成し、下記のドキュメントクラスを定義します。</p>
<pre class="brush: as3;">package {
   import flash.display.*;
   public class HiraginoMincho extends Sprite{
      [Embed(source=&quot;フォントファイルへのパス&quot;, fontName=&quot;HiraginoMincho&quot;, cff=&quot;true&quot;)]
      public static var font:Class;
      public function Mincho() {
      }
   }
}</pre>
<h4>4.コマンドラインでフォルダまで移動してコンパイル。</h4>
<pre class="brush: bash;">cd /path/to/working/directory/HiraginoMincho
mxmlc HiraginoMincho.mxml</pre>
<h4>5.別のswfで読み込んで使う</h4>
<p>できあがったswfを読み込めば使うことができます。やり方は<a href="http://isaomatsunami.blogspot.com/2009/05/flex-sdk-on-mac-os.html">元エントリー</a>に詳しいです。</p>
<p>フォント名が「クラス名_埋め込みClass変数」に変わるのでご注意。この例ではHiraginoMincho_fontになります。</p>
<h3>注意点</h3>
<p>Flex自体はデバイスフォントを埋め込むことができますが、CFFFontManagerはデバイスフォントを受け付けないようです。</p>
<p>したがって、フォントファイル自体をコピーしてEmbedタグのsource属性で指定することになります。</p>
<p>また、ヘルプを見るとこんなことが書いてあります。</p>
<blockquote><p>To get the system font name in Windows, install the Font properties extension. Then right-click the font’s file in Windows Explorer and select the Names tab. Use the value under Font Family Name as the systemFont value.<br />
<cite><a href="http://livedocs.adobe.com/flex/gumbo/html/WS2db454920e96a9e51e63e3d11c0bf69084-7f5f.html">Adobe Flex4 help &#8211; Using embedded fonts </a></cite></p></blockquote>
<p>「Windowsでデバイスフォント名を知りたい場合はフォントプロパティ拡張機能を使え」ということらしいのですが、これがすぐにわからなかったので、リンクを貼っておきます。</p>
<p><a href="http://www.microsoft.com/typography/TrueTypeProperty21.mspx">Microsoft Typography &#8211; Font properties extension, version 2.30</a></p>
<p><a href="http://www.microsoft.com/typography/default.mspx">Microsoft Typograph</a>yなんてサイトがあったんですね。MSはまったくフォントに興味がないと思っていました。</p>
<p>というわけで、以上です。</p>
<h4>追記</h4>
<p>なんか環境を変えたら上手く行かなかったので、上手くいったソースを追記しておきます。</p>
<pre class="brush: as3;">
package{
   import flash.display.Sprite;
   public class main extends Sprite
   {
      [Embed(source=&quot;assets/ipamp.otf&quot;, fontName=&quot;IPAMincho&quot;, embedAsCFF=&quot;true&quot;)] //←ここが変わった
      public static var IPAMincho:Class;
      public function main()
      {
      }
   }
}
</pre>
<p>Embedの属性名が変わったのかな？</p>


<p>Related posts:<ol><li><a href='http://takahashifumiki.com/web/programing/777/' rel='bookmark' title='Permanent Link: Flex SDK 4のアップデートで色々エラー'>Flex SDK 4のアップデートで色々エラー</a></li>
<li><a href='http://takahashifumiki.com/web/programing/475/' rel='bookmark' title='Permanent Link: WordPressとflashでブログ縦書き化計画(5)'>WordPressとflashでブログ縦書き化計画(5)</a></li>
<li><a href='http://takahashifumiki.com/web/programing/468/' rel='bookmark' title='Permanent Link: WordPressとflashでブログ縦書き化計画(4)'>WordPressとflashでブログ縦書き化計画(4)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/710/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/710/" />
	</item>
		<item>
		<title>複数のWordPressでユーザ情報を共有する</title>
		<link>http://takahashifumiki.com/web/programing/659/</link>
		<comments>http://takahashifumiki.com/web/programing/659/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 19:15:37 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[サイト運営]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=659</guid>
		<description><![CDATA[たった今やったらできたので、ご報告です。
WordPressというのは、ほんとうに簡単なCMSなので、ドのつく素人でもすぐに利用することができます。
ところが、WordPressでサイト運営を続けていると、こんな欲望がで [...]]]></description>
			<content:encoded><![CDATA[<p>たった今やったらできたので、ご報告です。</p>
<p>WordPressというのは、ほんとうに簡単なCMSなので、ドのつく素人でもすぐに利用することができます。</p>
<p>ところが、WordPressでサイト運営を続けていると、こんな欲望がでてきます。</p>
<ol>
<li>とりあえず最初のサイトはローンチできたぞ</li>
<li>このサイトでは家計簿のつけかたについて書いてきたけど、料理についても書きたいな</li>
<li>料理と家計簿ではコンテンツの内容がちょっと違うな</li>
<li>レイアウトも変えたいし、もうひとつWordPressをインストールしよう</li>
<li>家計簿サイトはhttp://example.comにWordPressをインストールして作ったから、料理はhttp://cook.example.comにインストールしよう。</li>
</ol>
<p>自分しか更新しないサイトならこれでもまったく問題ないですが、複数のユーザがコンテンツを更新するようなサイトを作っていたりすると、目も当てられません。</p>
<p>「料理のサイトってどうやって更新するんだっけ？」というどうでもいい問い合わせにイラつく日々が訪れます。</p>
<p>しかし、それはあなたが悪いのです。なぜ、XoopsやOpenPNEなどといったユーザ管理のしっかりしたCMSを採用しなかったのですか？　SymfonyやSmartyが面倒臭すぎるからですか？　OpenIDとかの利用は検討しなかったのですか？</p>
<p>Yes, we can. あなたがWordPressにこだわった理由はわかります。なので、作ってみました。</p>
<p>この方法が対象としているのは、データベースが1個しか作れないような共有レンタルサーバで、わからないなりに一生懸命サイトを運営している方です。</p>
<p>あと、バージョンは2.7.1しか試していないので、外のバージョンを利用している方は利用を考え直してください。</p>
<p>また、いやしくもプログラマやDBエンジニアとして口を糊している方は採用しないのが懸命です。もっといい方法があります。</p>
<h3>複数のWordPressでユーザ情報を共有する方法</h3>
<p>この方法を行うには、以下の要件を満たしている必要があります。</p>
<ul>
<li>ユーザ情報を共有するWordPressはすべて同じデータベースに保存されている。（チカッパとかさくらとかを利用している）</li>
<li>インストールされているWordPressのバージョンはすべて同じである</li>
<li>WordPress2.6から採用されたwp-config.php内の「認証用ユニークキー」はまったくいじったことがない。</li>
</ul>
<p>では、説明します。</p>
<p>まず、マスターとなるWordPressを決めてください。そのWordPressで使用しているテーマのfunctions.phpに以下のコードを記入してください。なかったら作ってください。</p>
<p>普通にコピペすると行番号が入るので、それは消してください。</p>
<pre class="brush: php;">$takahashi_copy_user_info_arr = array();
function takahashi_copy_user_info($id){
global $wpdb;
global $table_prefix;
global $takahashi_copy_user_info_arr;
foreach($takahashi_copy_user_info_arr as $prefix):
   $wpdb-&gt;query(&quot;TRUNCATE TABLE &quot;.$prefix.&quot;users&quot;);
   $sql = &quot;INSERT INTO &quot;.$prefix.&quot;users (&quot;.
             &quot;ID,&quot;.
             &quot;user_login,&quot;.
             &quot;user_pass,&quot;.
             &quot;user_nicename,&quot;.
             &quot;user_email,&quot;.
             &quot;user_url,&quot;.
             &quot;user_registered,&quot;.
             &quot;user_activation_key,&quot;.
             &quot;user_status,&quot;.
             &quot;display_name)&quot;.
             &quot;(SELECT ID,&quot;.
             &quot;user_login,&quot;.
             &quot;user_pass,&quot;.
             &quot;user_nicename,&quot;.
             &quot;user_email,&quot;.
             &quot;user_url,&quot;.
             &quot;user_registered,&quot;.
             &quot;user_activation_key,&quot;.
             &quot;user_status,&quot;.
             &quot;display_name FROM &quot;.$table_prefix.&quot;users)&quot;;
   $wpdb-&gt;query($sql);

   $sql = &quot;INSERT INTO &quot;.$prefix.&quot;usermeta (&quot;.
             &quot;umeta_id,&quot;.
             &quot;user_id,&quot;.
             &quot;meta_key,&quot;.
             &quot;meta_value)&quot;.
             &quot;(SELECT umeta_id,&quot;.
             &quot;user_id,&quot;.
             &quot;meta_key,&quot;.
             &quot;meta_value FROM &quot;.$table_prefix.&quot;usermeta)&quot;;
   $wpdb-&gt;query(&quot;TRUNCATE TABLE &quot;.$prefix.&quot;usermeta&quot;);
   $wpdb-&gt;query($sql);
   $sql = &quot;UPDATE &quot;.$prefix.&quot;usermeta SET meta_key=REPLACE(meta_key,'&quot;.$table_prefix.&quot;','&quot;.$prefix.&quot;') WHERE meta_key LIKE '&quot;.$table_prefix.&quot;%'&quot;;
   $wpdb-&gt;query($sql);
endforeach;

add_action('profile_update',&quot;takahashi_copy_user_info&quot;,1000);</pre>
<p>これをfunctions.phpにコピーしたら、$takahashi_copy_user_info_arr = array();という行のarray()のカッコ内にコピー先のWordPressのテーブル接頭辞をカンマ区切りで書いてください。</p>
<pre class="brush: php;">
$takahashi_copy_user_info_arr = array(&quot;wp1_&quot;,&quot;wp2_&quot;,&quot;wp_3&quot;);
</pre>
<p>これでユーザが情報を更新するたびに指定したWordPress内でユーザ情報が共有されると思います。prepareメソッドは泥酔しているので使いませんでした。SQLインジェクションしてくるユーザは即刻村八分にしたほうがいいと思います。</p>
<p>駄目だったらコメント欄に書いていただければお返事します。</p>
<p>だったらWordPress MU使えば?　という声が聞こえてきそうですが、MUは今後に期待ですね。インストール面倒だし。</p>


<p>Related posts:<ol><li><a href='http://takahashifumiki.com/web/programing/856/' rel='bookmark' title='Permanent Link: WordPressのテスト環境と本番環境を同期する時に使えるSQL文'>WordPressのテスト環境と本番環境を同期する時に使えるSQL文</a></li>
<li><a href='http://takahashifumiki.com/web/22/' rel='bookmark' title='Permanent Link: Wordpressのパスワード認証を別アプリに流用する方法'>Wordpressのパスワード認証を別アプリに流用する方法</a></li>
<li><a href='http://takahashifumiki.com/web/programing/717/' rel='bookmark' title='Permanent Link: WordPressクラックされちゃった記念、2.8.4にアップデート'>WordPressクラックされちゃった記念、2.8.4にアップデート</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/659/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/659/" />
	</item>
		<item>
		<title>jQuery vs MooTools（和訳）</title>
		<link>http://takahashifumiki.com/web/programing/642/</link>
		<comments>http://takahashifumiki.com/web/programing/642/#comments</comments>
		<pubDate>Sat, 23 May 2009 14:28:50 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MooTools]]></category>
		<category><![CDATA[論争]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=642</guid>
		<description><![CDATA[MooToolsの開発者がわざわざドメインを取ってまで書いていたので、全訳してみました。コードハイライターは自作なので、インデント付けがまだできてません。そこら辺が読みづらいのはご勘弁を。
jQuery vs MooTo [...]]]></description>
			<content:encoded><![CDATA[<p>MooToolsの開発者がわざわざ<a href="http://jqueryvsmootools.com/">ドメインを取ってまで書いていた</a>ので、全訳してみました。コードハイライターは自作なので、インデント付けがまだできてません。そこら辺が読みづらいのはご勘弁を。</p>
<h2>jQuery vs MooTools</h2>
<p style="text-align: right;">May, 2009 &#8211; <a href="http://www.clientcide.com" target="_blank">Aaron Newton of Clientcide</a></p>
<p>こんにちJavaScriptをはじめる人は生半可ではない問題に直面する。どのライブラリを使用すべきか、そうでなければ少なくとも、どのライブラリから、学び始めるべきか、という問題である。もしあなたが企業に勤めており、その企業ですでに使用するフレームワークが決められているならば、論争の種となりそうな問題だ。もしこの場合にあてはまり、企業で使うのは<a href="http://www.mootools.net">MooTools</a>で、あなたがを使っているのが<a href="http://www.jquery.com">jQuery</a>であるという具合でも、この記事は幾らか役立つだろう。</p>
<p><a href="http://twitter.com/joshink/statuses/1671986611"></a> <a href="http://twitter.com/jezusisstoer/statuses/1642244246"></a> <a href="http://twitter.com/digitalcampaign/statuses/1622094648"></a> <a href="http://twitter.com/jesswma/statuses/1605733380"></a> 私はTwitterで「MooToolsか、jQueryか？」とつぶやくポストを<a href="http://twitter.com/joshink/statuses/1671986611">ま</a>、<a href="http://twitter.com/jezusisstoer/statuses/1642244246">い</a>、<a href="http://twitter.com/digitalcampaign/statuses/1622094648">に</a>、<a href="http://twitter.com/jesswma/statuses/1605733380">ち</a>目にしている。この記事の狙いはその選択の一助となることである。</p>
<h3>免責事項</h3>
<p>私はMooToolsディベロッパーである。MooToolsフレームワークのために働いている。MooToolsに関するブログを書いている。<a href="http://www.mootorial.com">有名なオンラインチュートリアル</a>と<a href="http://www.amazon.com/gp/product/1430209836?ie=UTF8&amp;tag=clientside-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=1430209836">MooToolsの本</a>を書いた。 明らかに私の意見には偏見が含まれている。また、jQueryをほとんど使わないということも明確にしておこう。もしあなたがjQueryディベロッパーであり、間違った表現を見つけたら、コンタクトを取って問題を訂す手助けをしてほしい。私の目的は読者の役に立ち、嘘を言わないことだ。あるフレームワークが他のものより優れていると主張することではない。</p>
<h3>目的</h3>
<p>これら二つのフレームワークから一つを選択するために、私はあなたに対して、その二つがどのように異なっているかを説明する。まずはじめに言っておきたいのが、<strong>どちらを選んでもすばらしい選択をしたことになる</strong>ということだ。この場合、間違った選択をすることはない。どちらのフレームワークも一長一短があり、総合的に見れば、どちらも素晴らしい選択である。同じように詳しく述べる価値のあるフレームワークが他にもある。<a href="http://www.dojotoolkit.org/">Dojo</a>、<a href="http://www.prototypejs.org/">Prototype</a>、<a href="http://developer.yahoo.com/yui/">YUI</a>、<a href="http://extjs.com/">Ext</a>などはすべて素晴らしい選択肢だ。どれを選んでも自分のやり方でできること、成し遂げられることはたくさんある。この記事の目的は、多くの人々が注目している二大フレームワークになりつつあるMooToolsとjQueryに焦点を当てることだ。最後につけくわえると、私はフレームワークを乗り移るよう説得したりはしない。この二つのフレームワークについては興味深い点が多くあり、そこから学ぶことも多い。この記事を書いた理由について、<a href="http://www.clientcide.com/3rd-party-libraries/jquery-vs-mootools-mootools-vs-jquery/">この記事の告知をしたClientcideの私のブログポスト</a>でも読むことができる。</p>
<h3>目次</h3>
<ul>
<li><a href="#mottos">モットーがすべてを語る</a></li>
<li><a href="#learning">学習曲線とコミュニティ</a></li>
<li><a href="#javascript">JavaScriptは何に向いているか</a>
<ul style="margin-bottom: 0px">
<li><a href="#dom">DOMだけよりももっと</a></li>
<li><a href="#inheritance">JavaScriptでの継承</a></li>
<li><a href="#self">自己参照</a></li>
</ul>
</li>
<li><a href="#jsfun">MooToolsはJavaScriptそのものをもっと楽しくする</a></li>
<li><a href="#domfun">jQueryはDOMをもっと楽しくする</a></li>
<li><a href="#cando">あなたのできることを私はもっとよくできる</a></li>
<li><a href="#yourway">MooToolsはあなたにあなたの道を歩ませる</a></li>
<li><a href="#chaining">デザインパターンとしての連鎖</a></li>
<li><a href="#reuse">jQueryでのコード再利用</a></li>
<li><a href="#classes">MooToolsでのコード再利用</a>
<ul>
<li><a href="#mooinheritance">MooToolsと継承</a></li>
<li><a href="#extension">クラスの拡張と実装</a></li>
</ul>
</li>
<li><a href="#conclusion">決断の時</a></li>
</ul>
<h2>数値比較</h2>
<table border="0">
<tbody>
<tr>
<th></th>
<th>jQuery Core</th>
<th>MooTools Core</th>
</tr>
<tr>
<td>ライブラリサイズ</td>
<td>55.9K</td>
<td>64.3K</td>
</tr>
<tr>
<th colspan="3">機能</th>
</tr>
<tr>
<td>ライセンス</td>
<td><a title="MIT License" href="http://en.wikipedia.org/wiki/MIT_License">MIT</a> &amp; <a title="GPL" href="http://en.wikipedia.org/wiki/GPL">GPL</a></td>
<td><a title="MIT License" href="http://en.wikipedia.org/wiki/MIT_License">MIT</a></td>
</tr>
<tr>
<td>DOM 機能</td>
<td>yes</td>
<td>yes</td>
</tr>
<tr>
<td>アニメーション</td>
<td>yes</td>
<td>yes</td>
</tr>
<tr>
<td>イベント操作</td>
<td>yes</td>
<td>yes</td>
</tr>
<tr>
<td>CSS3セレクタ</td>
<td>yes (サブセット)</td>
<td>yes (サブセット)</td>
</tr>
<tr>
<td>Ajax</td>
<td>yes</td>
<td>yes</td>
</tr>
<tr>
<td>ネイティブ拡張 (Elementを除く)</td>
<td>Array、Object、Stringに対して約1ダース</td>
<td>Array、Object、String、Function、Numberに対して約6ダース</td>
</tr>
<tr>
<td>継承</td>
<td>jQueryでは直接サポートされていない</td>
<td><em><a href="http://mootools.net/docs/core/Class/Class">Class</a></em>コンストラクタによって提供されている</td>
</tr>
<tr>
<th colspan="3">その他</th>
</tr>
<tr>
<td>プラグイン</td>
<td>何百もの非公式プラグインが<a href="http://plugins.jquery.com/">plugins.jquery.com</a>にある</td>
<td>約4ダースの公式プラグインが<a href="http://mootools.net/more">mootools.net/more</a>にある。その他、Web上に多数。組織的なカタログはない。</td>
</tr>
<tr>
<td>オフィシャルUI ライブラリ</td>
<td>yes</td>
<td>no</td>
</tr>
</tbody>
</table>
<p class="footnote"><a href="http://jquery.com">jquery.com</a>、<a href="http://mootools.net">mootools.net</a>と<a href="http://en.wikipedia.org/wiki/Comparison_of_JavaScript_frameworks">wikipedia.com</a>からの情報による</p>
<p><a id="mottos"></a></p>
<h2>モットーがすべてを語る</h2>
<p>jQueryサイトに行けば、ページのトップ付近にjQueryとはなんであるかが述べられている:</p>
<blockquote><p>jQueryは高速で簡潔なJavaScriptライブラリです。HTML文書の走査、イベント操作、アニメーション、Ajaxインタラクションをシンプルにして、Webサイト開発を高速にします。jQueryはJavaScriptの書き方を変えるために設計されました。</p></blockquote>
<p>&#8230;そしてMooToolsに行けば、このような文言が見つかるだろう:</p>
<blockquote><p>MooToolsは中級から上級のJavaScript開発者のために設計された軽量で、モジュール化された、オブジェクト志向のJavaScriptフレームワークです。これを使えば、エレガントで、きちんとした裏付けのある、一貫したAPIにより、パワフルに、柔軟に、そしてクロス・ブラウザなコードを書くことができます。</p></blockquote>
<p>これはすばらしい要約だ。もしあなたが私に質問をしたら（これを読んだ、そのすぐ直後だと思うが）、その質問はフレームワークの善し悪しではないだろう。上の中のどれをしたいのか、ということだろう。この二つのフレームワークは同じ事をしようとしているわけではない。提供する機能では重なる部分もあるが、同じ事をしようとしているわけではないのだ。</p>
<p>jQuery自身による説明では、HTML、イベント、アニメーション、Ajax、そしてWeb開発について述べられている。MooToolsはオブジェクト指向とパワフルで柔軟なコードについて説明している。jQueryは「JavaScriptの書き方を変える」ことを目指し、一方でMooToolsは上級のJavaScript開発者にとっての媒介となることを目指している。</p>
<p>この問題はある意味、<em>フレームワーク</em>VS<em>ツールキット</em>という考え方である。MooToolsはJavaScriptをあるべき姿（MooToolsの作者にとって）へと拡張する<em>フレームワーク</em>である。目的はJavaScriptのようなAPIを実装し、すべてを高機能にすることである。DOMだけではない。jQueryはDOMそれ自体がもっと面白くなるように設計された独自システムによって、簡単に使える一連のメソッドを提供する<em>ツールキット</em>である。JavaScriptを書くときに多くの人が注力する部分がDOMであるため、多くの場合において、jQueryが要求を満たす。</p>
<p>MooToolsを使っているとき、あなたの書いたコードはJavaScriptのように見えるだろう。言語としてのJavaScriptに興味が無ければ、MooToolsを学ぶのは退屈な仕事だ。もしJavaScriptに興味があり、どうすれば面白くなるのか、パワフルになるのか、印象的になるのか、という考えているならば、私が思うに、MooToolsはよりよい選択肢である。</p>
<p><a id="learning"></a></p>
<h2>学習曲線とコミュニティ</h2>
<p>まず、jQueryは概して学ぶのが簡単である。ほとんど口語体のスタイルを持っていて、プログラミングのようには見えない。JavaScriptを学習することなしにとっととなにかを動かしたいならば、jQueryは恐らくよい選択だ。MooToolsが同じ事を成し遂げるために役立たないというのではないが、MooToolsがJavaScript初心者にとってコツを掴むのが少し難しいということと、jQueryに関する情報がそこら中にあるということ（少なくともMooToolsに関する情報よりは）という点は認めねばならない。</p>
<p>jQueryコミュニティ(<a href="http://docs.jquery.com/Discussion">ｊQueryの &#8220;Discussion&#8221; ページ</a>) とMooToolsコミュニティ (<a href="irc://irc.freenode.net/#mootools">irc</a>、<a href="http://groups.google.com/group/mootools-users">メーリングリスト</a>そして <a href="http://mooforum.net/">非公式フォーラム</a>)を比べれば、すぐ二つのことに気付くだろう： 1) jQueryコミュニティの方がはるかに大きい（私はこれが上述した簡単に学ぶことができるという点にもっとも寄与していると思うが、同時に&#8230;）。　2) ライブラリの宣伝に熱心である。jQueryとMooToolsを使用人数、Googleの検索数、関連書籍数などの指標で比較すれば、jQueryが大はばにリードしていることがわかるだろう。</p>
<p>MooToolsのことを考慮に入れるべき理由を挙げる前に、私は二つのフレームワークが何を行っているのかについて少し語らねばならないだろう。最終的にどのフレームワークを選ぶべきかという問題は、何を成し遂げ、どのようにプログラミングをしたいのか（少なくともJavaScriptにおいてプログラミングをしたければ）という問題に帰着する。</p>
<p><a id="javascript"></a></p>
<h2>JavaScriptは何に向いているか</h2>
<p>この選択はある意味であなたがJavaScriptでしたいことを教えてくれる。ヴァニラJavaScript——フレームワークなしの、古いプレーンなJavaScript——のことを考えてみよう。JavaScriptはあなたに<a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/String">String</a>、<a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Number">Number</a>、<a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Function">Function</a>、<a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/Array">Array</a>、<a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/Date">Date</a>, <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp">正規表現</a>などの組み込みオブジェクトを提供してくれる。そしてまた、継承のモデル——<a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Inheritance">プロトタイプ型継承</a>（これについては後述する）と呼ばれるいささかな難解なモデル——も提供してくれる。これらの組み込みオブジェクトと継承のコンセプトはすべてのプログラミング言語におけるパンとバターのようなものであり、ブラウザやweb、CSSやHTMLとはまったく関係がない。JavaScriptで何でも書きたいことができるのだ。○×ゲーム、チェス、写真編集、webサーバー、なんでもだ。世にある99%のJavaScriptはブラウザ上で実行されており、ブラウザのためのプログラミング言語だと思ってしまうのはよくあることだが。</p>
<p>ブラウザ、DOMを理解することが、JavaScriptに対して費やす時間のほとんどを占めている。しかし、JavaScriptが実際には堅牢で印象的なプログラミング言語であることを知れば、MooToolsとjQueryの間の違いを理解する手助けになるだろう。</p>
<p><a id="dom"></a></p>
<h3>DOMだけよりももっと</h3>
<p>JavaScriptで成し遂げたいことを「ページに何かを仕込んでおいて、動作させる〔訳注：&#8221;get stuff on the page and do stuff to it&#8221;〕」という観点だけから見るのならば、jQueryがおそらく最良の選択だろう。プログラミングに見えないときさえあるようなやり方だが、ページでの動作をそのまま説明するような印象的なシステムを提供している点においてjQueryは抜きん出ている。JavaScriptの残りの部分を使ってやりたいことを実現できるが、もしもDOMに焦点をあてる——CSSプロパティを変更する、アニメーションさせる、AJAXでコンテンツを取得する——ならば、記述したものの大半はjQueryへと変換され、古めかしいJavaScriptのようには見えないだろう。jQueryはDOMとは関係のないメソッドをいくつか提供している。たとえば、配列への反復処理メカニズム——<em><a href="http://docs.jquery.com/Utilities/jQuery.each">$.each(array, fn)</a></em>——であり、文字列のトリムメソッド——<em><a href="http://docs.jquery.com/Utilities/jQuery.trim">$.trim(str)</a></em>——である。この類いのユーティリティメソッドは多くあるわけではないが、それでいいのだ。なぜなら、あなたがDOMで何かをしようとしているほとんどの場合、DOMに反復処理を行ったり、何らかの方法（htmlの追加、スタイルの変更、クリックやマウスオーバーへのイベントリスナー添付）で変換したりするだけである。それほど多くは必要ないのだ。</p>
<p>しかし、もしもJavaScriptの対象を最大限に広げようと思っているならば、jQueryがDOM以外に焦点を当てていないことに気づくだろう。これはjQueryを簡単に学べる理由の一つであるが、同時にjQueryがJavaScriptを書く助けとなる限界でもある。DOMのためのプログラミングシステム以外のものになろうとはしていないのだ。継承もサポートしないし、JavaScript言語に組み込みの型に基本的なユーティリティを提供することも目指していない。<em>その必要はないのだ</em>。文字列、日付、正規表現、配列、関数などで何かをしたいならば、<em>することはできる</em>。それを手助けするのはjQueryの仕事ではない。言語としてのJavaScriptはあなた次第である。jQueryはDOMをあなたにとっての楽しい遊び場にしてくれるが、JavaScriptの残りの部分に焦点は合っていない。</p>
<p>ここがMooToolsと大きく異なる点である。DOMに焦点を合わせる代わり（後述するが、jQueryが実現できることを全く違った方法で提供する）に、MooToolsは言語全体に焦点を合わせている。jQueryがDOMを遊び場にしてくれるのならば、MooToolsの狙いはJavaScriptを遊び場にすることであり、それこそが学ぶのに難しい一因となっている。</p>
<p><a id="inheritance"></a></p>
<h3>JavaScriptでの継承</h3>
<p>プログラミング言語としてのJavaScriptには驚くべき一面がある。はじめは関数を他のオブジェクトと同じように変数に入れて引き回せる高階オブジェクトとして扱うに<a href="http://en.wikipedia.org/wiki/Functional_programming">関数型言語</a>に見える。こうしたコンセプトの元に設計されており、多くのメソッドや制御構文はそれに従ったコードを書くことでうまく働くのだ。つまり、下記のコードには違いがある:</p>
<pre class="brush: jscript;">for (var i = 0; i &amp;lt; myArray.length; i++) { /* do stuff */ }</pre>
<pre class="brush: jscript;">myArray.forEach(function(item, index) { /* do stuff */ });</pre>
<p>JavaScriptはそれほど独特ではない<a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Inheritance">継承モデル</a>を持っているが、少なくとも他のプログラミング言語には見られないものである。サブクラスを持てるよう定義されたクラスの代わりに、<em><a href="http://en.wikipedia.org/wiki/Prototype-based_programming">プロトタイプ継承</a></em>に従ったオブジェクトを渡すのだ。これはつまり、オブジェクトが他のオブジェクトから直接継承するということである。他のオブジェクトを継承するオブジェクトのプロパティを参照するとき、JavaScriptは子オブジェクトのプロパティを見て、見つからなければ親オブジェクトのプロパティを探しにいく。これがたとえば配列のメソッドが動く仕組みである。このようにタイプしたとしよう:</p>
<pre class="brush: jscript;">[1,2,3].forEach(function(item) { alert(item) }); //まず1をアラート、そして2、3</pre>
<p><a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Objects:Array:forEach">forEach</a>メソッドはあなたが宣言した配列 (<em>[1,2,3]</em>)のプロパティではなく、すべての配列のプロトタイプのプロパティである。このメソッドを参照すると、JavaScriptはあなたの宣言した配列の<em>forEach</em>というメソッドを探し、それがなければ、すべての配列のプロトタイプを調査する。つまり、<em>forEach</em>メソッドはすべての配列の各メモリにはなく、配列のプロトタイプのメモリ内にのみ存在する。これは信じられないほど効果的で、とてつもなくパワフルである。（余談：MooToolsは<em>forEach</em>メソッドのエイリアスとして<em>each</em>を使う）</p>
<p><a id="self"></a></p>
<h3>自己参照</h3>
<p>Javascriptには特別な言葉&#8221;this&#8221;がある。&#8221;this&#8221;がいったいなんであるかを簡潔に定義するのは難しいが、デフォルトだと&#8221;this&#8221;は現在のメソッドが属するオブジェクトを指す。これにより、オブジェクトは自分のメソッドの中で自分を参照することができる。これは子オブジェクトを作り、それが膨大な数のメソッドを持つような場合、重要になる。他にどうやってメソッドがオブジェクト自身を参照するというのだろう。メソッドのコピー実体が親オブジェクトの中に存在し、子オブジェクトの中でない場合、この&#8221;this&#8221;キーワードはこれらのインスタンスが自身の状態を参照できるようにしてくれる。（<a href="http://www.quirksmode.org/js/this.html">&#8220;this&#8221;キーワードに関する詳細</a>と <a href="https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Operators/Special_Operators/This_Operator">Mozillaによるもの</a>）</p>
<p>&#8220;this&#8221;キーワードは他のオブジェクトを継承したオブジェクトが自身を参照することを可能にするが、&#8221;this&#8221;を通して何か他のものを参照したいときもあるだろう。これは<a href="http://alternateidea.com/blog/articles/2007/7/18/javascript-scope-and-binding">バインド</a>と呼ばれ、メソッドに<em>異なった</em>&#8220;this&#8221;を結びつける手法である。配列の&#8221;each&#8221;メソッドは第二引数に特定のオブジェクトを渡すことで、バインドさせることができる。以下が異なる&#8221;this&#8221;を渡す例である:</p>
<pre class="brush: jscript;">var ninja = {
    weapons: ['刀', '手裏剣', '火遁の術'],
    log: function(message) {
        console.log(message);
    },
    logInventory: function() {
        this.weapons.each(function(weapon) {
			//&quot;this&quot;にはninjaを指してほしい...
            this.log('このninjaは' + weapon + 'で殺すことができる');
        }, this); //これで&quot;this&quot; (ninja)をArray.eachに渡せる
    }
};
ninja.logInventory();
//このninjaは刀で殺すことができる
//このninjaは手裏剣で殺すことができる
//このninjaは火遁の術で殺すことができる</pre>
<p>上記の例では、ninjaオブジェクト（<em>logInventory</em>メソッドの中で&#8221;this&#8221;となる）を配列のメソッドにバインドしているので、ninjaのlogプロパティから参照することができる。これをしなければ、&#8221;this&#8221;は<em>window</em>になる。</p>
<p>これらはJavaScriptが提供すべきパワー——継承、自己参照、バインド、プロトタイプ・プロパティ——の例にすぎない。悪い知らせは、ヴァニラJavaScriptがこれらのパワフルな力を使いやすく提供しておらず、MooToolsがはじめた<em></em>ということだ。そのおかげで、これらのパターンは簡単で楽しいものになる。より抽象的なコードを書くことになるが、長い目で見れば、素晴らしくパワフルなことだ。これらのパターンにどれほどの価値があり、どのように使うのかを学ぶのは努力を要するが、その一方であなたの書いたコードは再利用可能でメンテナンスが簡単になる。この二つの事柄について、もうちょっと語らせてもらおう。</p>
<p><a id="jsfun"></a></p>
<h2>MooToolsはJavaScriptそのものをもっと楽しくする</h2>
<p>MooToolsはJavaScriptのAPIをそのものをもっと安定してわかりやすいものにすることを目指しているので、&#8221;JavaScriptの書き方を変える&#8221;ことや、JavaScriptをまったくストレスのないものにすることにはさほど注力していない。MooToolsはJavaScript言語を拡張しようとしている。MooToolsはJavaScriptをあるべき姿にしようとしているのだ。coreライブラリのために費やされた労力のほとんどは、Function、String、Array、Number、Elementその他のプロトタイプを改善するためだった。そして、その他に提供する重要な機能が<em><a href="http://mootools.net/docs/core/Class/Class">Class</a></em>と呼ばれる関数である。</p>
<p>さて、Classは多くの人にとってJavaやPHPで見られるようなクラス型の継承モデルを模倣しようとしているように見えるだろう。しかし、<a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Class-Based_vs._Prototype-Based_Languages">この場合は当てはまらない</a>。Classが行っているのは、JavaScriptのプロトタイプ型継承モデルにアクセスしてその利点を活用することを簡単にすることだ。注意していただきたいのは、このコンセプトがMooToolsに特有のものではなく（他のフレームワークも似たような機能を提供している）、また、これらのコンセプトがjQueryには見られないということである。jQueryは継承システムを提供していないし、組み込みオブジェクト（Function、Stringなど）の拡張も行っていない。これはjQueryの落ち度ではない。jQueryの開発者はこれらの機能を簡単に提供できるからだ。彼らはむしろ、違う目的でツールキットとして設計したのだ。MooToolsがJavaScriptを楽しくすることを目指す一方、jQueryはDOMを楽しくすることを目指し、その設計者はなすべきことの範囲を制限することを選んだのだ。</p>
<p><a id="domfun"></a></p>
<h2>jQueryはDOMをもっと楽しくする</h2>
<p>以上が、jQueryがわかりやすい理由である。JavaScriptの内と外を詳しく学ぶ必要はない。あなたはプロトタイプ型継承や、バインド、&#8221;this&#8221;、そして組み込みプロトタイプの深淵に投げ込まれることはない。<a href="http://docs.jquery.com/Tutorials:How_jQuery_Works">公式チュートリアル</a>にしたがってjQueryを始めれば、以下のようなコードにでくわすだろう:</p>
<pre class="brush: jscript;">window.onload = function() {
    alert(&quot;ようこそ&quot;);
}</pre>
<p>これが三番目である:</p>
<pre class="brush: jscript;">$(document).ready(function() {
    $(&quot;a&quot;).click(function(event) {
        alert(&quot;来てくれてありがとう&quot;);
    });
});</pre>
<p><a href="http://www.amazon.com/gp/product/1430209836?ie=UTF8&amp;tag=clientside-20&amp;link_code=as3&amp;camp=211189&amp;creative=373489&amp;creativeASIN=1430209836">MooToolsの本</a>か<a href="http://www.mootorial.com/wiki">MooToolsのチュートリアル</a>を読めば（両方とも私が書いた）、もっと違ったところから始めているのがわかるだろう。最初を飛ばして、さっさとエフェクトとDOMから学ぶこともできるが、MooToolsを学びたければ、<em>Class</em>などから始める方がいいだろう。そして、もしプログラミングが始めてだったり、JavaScriptのすべてを学ぶ前にサイト上の何かを動かしたかったら、jQueryの方がもっと親切である。</p>
<p>一方、JavaScriptそのものを学びたかったら、MooToolsは素晴らしい選択だ。MooToolsはJavaScriptが持つはずの機能（組み込みオブジェクトを拡張するメソッドのほとんどは<a href="https://developer.mozilla.org/En/New_in_JavaScript_1.8">JavaScript 1.8</a>の仕様に則ってさらにそれを発展させてたものである）を実装している。もしプログラミングに親しんでおり、とりわけオブジェクト指向と関数型プログラミングに慣れていれば、エキサイティングで印象的なデザインパターンを備えているMooToolsはうってつけだろう。</p>
<p><a id="cando"></a></p>
<h2>あなたのできることを私はもっとよくできる</h2>
<p>jQueryができることで、MooToolsにもできることがたくさんある。MooToolsにできることで、jQueryには移植する方法がないものがある。なぜなら、jQueryはDOMに焦点を当てているからだ。MooToolsはjQueryよりも大きな機能を備えているが、それを実現できないかどうかは、jQueryとは関係ない。たとえば、jQueryは継承のシステムを持っていないが、それでいいのだ。もし実現したいなら、MooToolsの<em>Class</em>をjQueryと一緒に使って実現することができる（もしくは、自分で書くか）。<a href="http://code.google.com/p/jquery-inheritance/updates/list">jQueryのための継承プラグイン</a>だってある（私は使っていないが、ほとんど似たような機能を提供するだろう）。</p>
<p>上記のことを、jQueryの例で見てみよう:</p>
<pre class="brush: jscript;">$(document).ready(function() {
    $(&quot;a&quot;).click(function(event) {
        alert(&quot;来てくれてありがとう！&quot;);
    });
});</pre>
<p>これをMooToolsに翻訳すると、こうなる:</p>
<pre class="brush: jscript;">window.addEvent('domready', function() {
    $$('a').addEvent('click', function(event) {
        alert('来てくれてありがとう！');
    });
});</pre>
<p>とてもよく似ていないだろうか？</p>
<p>jQueryのもっと複雑な例を見てみよう:</p>
<pre class="brush: jscript;">$(document).ready(function() {
    $(&quot;#orderedlist li:last&quot;).hover(function() {
        $(this).addClass(&quot;green&quot;);
    },
    function() {
        $(this).removeClass(&quot;green&quot;);
    });
});</pre>
<p>そしてMooTools:</p>
<pre class="brush: jscript;">window.addEvent('domready',function() {
    $$('#orderedlist li:last').addEvents({
        mouseenter: function() {
            this.addClass('green');
        },
        mouseleave: function() {
            this.removeClass('green');
        }
    });
});</pre>
<p>ほら、とても似ている。私はMooTools版がより明白で、口語的だと思う。二つのイベント――一つはマウスエンターでもう一つはマウスリーブ――を添附したコードではMooToolsの方が読みやすい。jQuery版の方はより簡潔である。jQueryの<em><a href="http://docs.jquery.com/Events/hover">hover</a></em>メソッドは二つのメソッドを受け入れる――一つ目がマウスエンターで、二つ目がマウスリーブ。私は個人的に、MooToolsの読みやすいコードが好きだが、これはあくまで主観である。</p>
<p>ときにjQueryは私の趣味に合わず難解である。メソッドは見ただけでは理解できず、解釈するのが難しい。私はMooToolsに慣れ親しんでいるのでおり、MooToolsを読みやすいと思っているので、やや不公平かもしれない。しかし、MooToolsに認める美徳は、ほとんどすべてのものを正しく名付けているということである。メソッドはすべて動詞であり、何をするかについての疑いはほとんどない。すべてのプログラミング言語は書くときにリファレンスを訪れ、構文を参照しなくてはならない――などと言うつもりはない。私が言いたいのは、MooToolsのAPIがとても理解しやすいということである。</p>
<p><a id="yourway"></a></p>
<h2>MooToolsはあなたにあなたの道を歩ませる</h2>
<p>みなさんはjQueryの構文のどこが水なのだろうか？　MooToolsのパワーを示すよい例は、あなたの流儀にMooToolsを従わせることがいかに簡単かということだ。もしjQueryの<em>hover</em>メソッドをMooToolsで実装したかったら、簡単にできる:</p>
<pre class="brush: jscript;">Element.implement{{
    hover : function(enter,leave){
       this.addEvents({ mouseenter : enter, mouseleave : leave });
    }
});

//これでjQuery版と同じよう使うことができる:
$$('#orderlist li:last').hover(function(){
   this.addClass('green');
},
function(){
   this.removeClass('green');
});</pre>
<p>実際、MooToolsにはこれを実現するプラグインがある。<a href="http://github.com/cheeaun/mooj/tree/master">MooToolsにjQuery構文を与える</a>のだ。MooToolsが拡張性に焦点を与えているということは、やりたいことをなんでもできるということである。これはjQueryができないことの一つである。MooToolsはjQueryを真似することができるが、jQueryはMooToolsを真似ることはできない。クラスを書いたり、組み込みのプロトタイプを拡張するようなことがしたければ、MooToolsがそれを可能にしてくれる。自分で書いてもいいのだが。</p>
<p><a id="chaining"></a></p>
<h2>デザインパターンとしての連鎖</h2>
<p>他の例も見てみよう。こちらはjQueryの例だ（jQueryのチュートリアルより）:</p>
<pre class="brush: jscript;">$(document).ready(function() {
    $('#faq').find('dd').hide().end().find('dt').click(function() {
        $(this).next().slideToggle();
    });
});</pre>
<p>これは私が個人的に好きではない例の一つだ。上のコードを見ても、何をしているのかがわからない。もっと言えば、<em>.end</em>とそれにつづく<em>.find</em>が<em>.end</em>のすることにどのように関わっているかが興味深くさえある。そこで、jQueryのリファレンスを参照すると、<em>.end</em>のしていることがわかる（もともとのセレクタの値、この場合は#faqを返す）。しかし、これは非常に奇妙に思える。jQueryを使うとき、なんのメソッドが返ってくるのかがわからないのだ。jQueryを多くの人は喜んで使っているのだから、私以外の人がこれに困らされているということはない。そこで、再び私の個人的な好みにを挙げてみよう。</p>
<p>上のロジックをMooToolsで見てみよう:</p>
<pre class="brush: jscript;">window.addEvent('domready', function() {
    var faq = $('faq');
    faq.getElements('dd').hide();
    faq.getElements('dt').addEvent('click', function() {
        this.getNext().slide('toggle');
    });
});</pre>
<p>またもやMooToolsは少し冗長のようだが、明白である。また、このデザインパターンでもjQueryが<em>.end</em>メソッドで返した#faqへの変数による参照は残っている。MooToolsでも高度に連鎖されたコードを書くことは可能だと付け加えておこう。次の例である:</p>
<pre class="brush: jscript;">item.getElements('input[type=checkbox]')
	.filter(function(box) {
		return box.checked != checked;
	})
	.set('checked', checked)
	.getParent()[(checked) ? 'addClass' : 'removeClass']('checked')
	.fireEvent((checked) ? 'check' : 'uncheck');</pre>
<p>しかし、実際のところ、このようなコード――domreadyステイトメントに多くのロジックが詰まっている――を書くのは、他のフレームワークにおいても、よくない方法だ。ロジックは再利用できる固まりとしてカプセル化した方がはるかにいい。</p>
<p><a id="reuse"></a></p>
<h2>jQueryでのコード再利用</h2>
<p>Webプロジェクトに携わっているとき、このようなコードを書いてしまいがちだ。DOM要素を選択し、隠したり、他の要素を変更させたり、マウスオーバーやクリック用のイベントリスナーを&#8221;設定&#8221;させる、というだけのコードである。このようなやり方でコードを書くのは効果的で、早い。Domreadyステイトメントにすべてのロジックを書くこのやり方に潜む問題は、同じ事を行うコードが色んな場所に生まれてしまうということである。もしFAQパターンを取れば、用語とその定義からなるリストがどこにあろうと、たとえ違うページにあっても、同じロジックを適用することができる。このパターンを適用するとき、毎回同じロジックを繰り返すべきだろうか？</p>
<p>ロジックを再利用可能にする簡単な方法は、それをfunctionで囲み、引数を渡すことである。jQueryではこのようになる:</p>
<pre class="brush: jscript;">function faq(container, terms, definitions) {
    $(container).find(terms).hide().end().find(definitions).click(function() {
        $(this).next().slideToggle();
    });
};
$(document).ready(function() {
    faq('#faq', 'dd', 'dt');
});</pre>
<p>こちらの方が優れているのには、二つの重大な理由がある:</p>
<ol>
<li> もしも明日、これらのリストの挙動を変更（たとえば、クリック追跡ロジックを導入してwebログからクリックされたものを推測したり、定義をAjaxによって取得したり）することになったら、メインとなる<em>faq</em>メソッドを変更するだけで、それを使うすべての場所が変更される。もしくは、新しいバージョンのjQueryがリリースされ、挙動が変わっていたら、そこら中にあるメソッドをすべて直す代わりに、一つのメソッドを更新するだけでよい。私はこれを「アプリケーションのフットプリントを小さく保つ」と言う。アプリケーションが私の書いた汎用的なコードに接する部分が少ないほど、バグフィックス、フレームワークの更新、機能追加、機能変更などが簡単になる。</li>
<li>二つ目の理由は、コードが少ないということである。同じメソッドを何度も再利用することで、私自身は同じ事を繰り返さずに済む。これはすべてのプログラミング環境において価値のあることだ。そしてまた、ユーザがダウンロードしなければならないコードの量も減らしてくれる。</li>
</ol>
<p>jQueryは実際のところ、こうした再利用可能な&#8221;ウィジェット&#8221;を書くための洗練されたシステムを徐々に持つようになっている。上で挙げたようにfunctionの中にコードを入れるのよりも、むしろ<a href="http://docs.jquery.com/Plugins/Authoring">jQueryプラグイン</a>を書くよう勧めている。以下のようなものである:</p>
<pre class="brush: jscript;">jQuery.fn.faq = function(options) {
    var settings = jQuery.extend({
        terms: 'dt',
        definitions: 'dd'
    }, options);
	//&quot;this&quot;は現在のコンテキストである。この場合では、faqレイアウトに変換したい要素となる
    $(this).find(settings.terms).hide().end().find(settings.definitions).click(function() {
        $(this).next().slideToggle();
    });
    return this;
};</pre>
<p>これで、次のように使うことができる:</p>
<pre class="brush: jscript;">$('#faq').faq();</pre>
<p>上の例を見ると、このやり方で<em>faq</em>関数を宣言することと、単独の関数として宣言することには違いがないように見える。幸いなことにグローバル名前空間にはないが、独自の名前空間に追加することは簡単にできる。jQueryに追加することで、他のjqueryメソッドと連鎖させることができるのだ。その他のメリットとして、関数内の&#8221;this&#8221;はjQuery連鎖のどこにいようと、現在のコンテキストを指すということである。このパターンをプラグインに利用することで、プラグインがjQueryの一部であるかのように見せることができるが、その一方、プラグインは基本的に現在のjQueryコンテキストを持ち、コンテキストに対して働きかけ、連鎖上の次のアイテムのためにコンテキストを返す、単一の関数である。複雑なことは特にないため、誰でもjQueryプラグイン――ただの関数――を書くことができる。</p>
<p>jQueryを使って、メソッドと変数をたくさん持った複雑なプラグインを書くこともできる。この類のパターンはjQueryのUIプラグインシステムでサポートされており、基礎的なプラグイン（例に挙げたfaq）と同じ仕組みを用いない。その代わりに、メソッドとプロパティを持ったオブジェクトをjQueryオブジェクトに添附する（例. <em>$.ui.tabs</em>）。このオブジェクトを呼び出すショートカットがある（<em>$(selector).tabs()</em>）ので、faqプラグインと同じように連鎖させることができる。しかし、セレクタにひっかかったアイテムのために作られたタブオブジェクトへの参照を返さないので、もう一度同じセレクタを使ってそのメソッドを呼び出さなくてはならない。<em>myTabInstance.add(url, label, index)</em>を呼び出す代わりに、もう一度同じセレクタを実行し、関数をその名前（文字列として）で呼び出さなくてはならないのだ: <em>$(selector).tabs(&#8216;add&#8217;, url, label, index);</em> これはセレクタを二度起動していることになる（どこかの変数に格納していないかぎり）ので、もはや&#8221;add&#8221;メソッドに対してのポインタはなく、バインドやディレイ（遅延）を行うことができない。この問題はMooToolsとjQueryのcoreに焦点を絞ったものである。jQueryのUIシステムはこの機能を提供するが、デフォルトで備わっているものではない。</p>
<p><a id="classes"></a></p>
<h2>MooToolsでのコード再利用</h2>
<p>MooToolsでパターンを定義するなら、<em><a href="http://mootools.net/docs/core/Class/Class">Class</a></em>か組み込みオブジェクト（たとえばString）へのimplementメソッドを使うのがよいだろう。</p>
<p>JavaScript本来のスタイルと完全に異なる言語を提供するのではなく、MooToolsは自前の構文を定義することとJavaScript独自のデザインパターンを拡張することを選んだ。その一つが、言語とDOMに組み込まれているオブジェクトのプロトタイプを拡張することである。つまり、文字列をトリムするメソッドが必要なら、MooToolsはString自体にtrimメソッド（<em><a href="http://mootools.net/docs/core/Native/String#String:trim">String.trim</a></em>はMooToolsにすでに組み込まれているので、あなたが自分で加える必要はない）を付け加えることであなたを励ましてくれる:</p>
<pre class="brush: jscript;">String.implement({
    trim: function() {
        return this.replace(/^\s+|\s+$/g, '');
    }
});</pre>
<p>これにより、<em>&#8220;終わりにスペースはないよ！ &#8220;.trim()</em>を実行すれば、<em>&#8220;終わりにスペースはないよ！&#8221;</em>が返ってくる。ある人はもとからあるプロトタイプにプロパティを実装することは不適切だというかもしれない。これはMooToolsと<a href="http://www.prototypejs.org/">Prototype.js</a>が一緒に使えない理由でもある。備え付けのプロトタイプを拡張するフレームワークは同時に動かない。もし同じページにおいて<em>String.prototype.foo()</em> を定義し、後から再度同じものを定義したら、最後に来た者が常に勝つ。ある意味、これはグローバルwindow名前空間で直面する問題と似ている。〔しかし、〕これはJavaScriptの仕様である。これは <a href="https://developer.mozilla.org/En/New_in_JavaScript_1.8">JavaScript 1.8</a>が沢山の機能を追加したのと同じやり方である。プロトタイプに様々なものを追加しているのだ。</p>
<p>MooTools開発者は素晴らしいフレームワークを用意し、あなたが独自の機能を拡張しやすくしている。採用したフレームワークだけが使われるのだ。二つのフレームワークをユーザーにダウンロードしてもらうようお願いするのは、野暮なことである。双方のフレームワークをインクルードする場合、その理由はただ一つ、あなたが両方のプラグインを使いたいからである。MooToolsの開発者（私も含む）としては、選択したフレームワーク内に使わない機能があれば、ユーザーにそれをダウンロードしてもらうより、自分の環境に移植する方が適切だと思う。</p>
<p>一度JavaScriptの動き方を知り、組み込みオブジェクトを拡張する力を知ったならば、まったく新しいプログラミングの世界が開ける。ElementやDate、Functionを変更するプラグインが書けるのだ。組み込みのオブジェクトにメソッドを追加するやり方は汚染だという人はいるだろうが、これはJavaScriptが本来想定されている使われ方である。言語の機能としてそう設計されているのだ。組み込みのオブジェクトにメソッドを追加することで、コードを簡潔ではっきり分けられたものにすることができる。jQueryもこれを行っているが、プロトタイプの拡張はjQueryオブジェクトに限られている。</p>
<p>jQueryオブジェクトに対して複数のメソッドを連鎖させることは簡単だが、他のタイプのオブジェクトに対しても同じことをしなければならない。たとえばjQueryにおいて、文字列をトリムして各行に反復処理を行いたい場合、このように書かねばならない:</p>
<pre class="brush: jscript;">$.each( $.trim( $('span.something').html() ).split(&quot;\n&quot;), function(i, line){alert(line);});</pre>
<p>しかし、MooToolsはプロトタイプを拡張しているので、このようにできる:</p>
<pre class="brush: jscript;">$('span.something').get('html').trim().split(&quot;\n&quot;).each(function(line){alert(line);});</pre>
<p>この例を見れば、プロトタイプの修正がいかに強力かがわかるだろう。連鎖が便利なのはDOM要素だけではない。MooToolsはどのオブジェクトに対しても連鎖を可能にし、複数の要素に対して一度にメソッドを実行することもできる。</p>
<p>ここで鍵となるのは、MooToolsフレームワークの心髄は、あなたが何かを達成するためにプログラミングをしているという考えにある。coreに含まれない機能があれば、あなたはそれを拡張し、付け加えることができる。coreに求められるのは、みんなが欲しかった細々とした機能を提供することではなく、あなたが実現したいことを可能にしてくれるツールである。そのほとんどはもとからあるプロトタイプの拡張を簡単にすることと、プロトタイプ型継承の利点を活用することである。これはヴァニラJavaScriptでも可能だが、MooToolsはそれをもっと簡単で楽しいことにしてくれる。</p>
<p><a id="mooinheritance"></a></p>
<h3>MooToolsと継承</h3>
<p>その名前にも関わらず、MooToolsの<em>Class</em>名数は実際にクラスではなく、クラスを生成しない。もっと伝統のあるプログラミング言語のクラスを思い起こさせるが、実のところ<em>Class</em>はオブジェクトとプロトタイプ継承そのものなのである。</p>
<p>クラスを作るには、<em>Class</em>コンストラクタにオブジェクトを渡す:</p>
<pre class="brush: jscript;">var Human = new Class({
    initialize: function(name, age) {
        this.name = name;
        this.age = age;
    },
    isAlive: true,
    energy: 1,
    eat: function() {
        this.energy = this.energy + 1; //this.energy++ に同じ
	}
});</pre>
<p><em>Class</em>にオブジェクトを渡した（上の例では、&#8221;isAlive&#8221;や&#8221;eat&#8221;などのメンバーを持ったオブジェクト）ので、このオブジェクトがこのクラスのすべてのインスタンスのプロトタイプとなる。インスタンスを作るには、このように呼び出せばよい:</p>
<pre class="brush: jscript;">var bob = new Human(&quot;bob&quot;, 20); //ボブの名前は&quot;bob&quot;で、20歳である</pre>
<p>これで<em>Human</em>のインスタンスができた。<em>bob</em>は<em>Human</em>クラスを作ったときに定義したオブジェクトのプロパティを持っている。しかし、重要なのはbobが継承によってこれらのプロパティを持っているということである。<em>bob.eat</em>を参照するとき、<em>bob</em>自体はこのプロパティを持っていない。JavaScriptは<em>bob</em>を調査し、<em>eat</em>メソッドがないことを確認すると、継承の連鎖を辿って<em>Human</em>クラスを作る時に渡したオブジェクトを発見する。これは<em>energy</em>に関しても同様である。一見すると、これは潜在的によくないことに思われるかもしれない。<em>bob</em>が<em>eat</em>したからといって、すべての<em>human</em>インスタンスに<em>enegry</em>を増加されたくはない。理解すべき重要なtねは、一度<em>bob</em>の<em>energy</em>に値を登録すると、彼独自の値を登録したことになり、プロトタイプを探しにいかなくなるのだ。したがって、一度<em>bob</em>が<em>eat</em>すれば、彼独自の<em>energy</em>（2）が定義される。</p>
<pre class="brush: jscript;">bob.eat(); //bob.energy == 2</pre>
<p><em>bob</em>のnameとageは彼独自のものであることに注意してもらいたい。これらの値は<em>initialize</em>メソッドで初期化されたときに登録されている。</p>
<p>こうした事は少し奇妙に思われるかもしれないが、重要なのはパターンに則った機能を定義でき、必要な時にそのインスタンスを生成できるということだ。それぞれのインスタンスは独自の変数を保持している。したがって、別のインスタンスを作ればそれは他のものと独自に存在するが、同じパターンから継承されているのだ:</p>
<pre class="brush: jscript;">var Alice = new Human();
//alice.energy == 1
//bob.energy == 2</pre>
<p>この挙動について理解したいと思うようになると、もっと面白くなる。</p>
<p><a id="extension"></a></p>
<h3>クラスの拡張と実装</h3>
<p>jQueryの<em>faq</em>プラグインをもう一度見てみよう。このプラグインにもっと多くの機能を追加しようとすると、なにが起きるだろうか。サーバから回答を取得するajaxバージョンを作りたいとしたら？　<em>faq</em>プラグインが他の人に作られており、それ自体を全くいじることなく機能を追加したい（くまなく見たくはない）のだ。</p>
<p>現実的な選択肢は、<em>faq</em>プラグインのロジックを完全に複製（単一の関数だということをお忘れなく）するか、関数の内部をくまなく見るか、呼び出してから新たにロジックを付け加えるかだ。与えられた選択肢では、最後のものが一番トラブルが少なそうだ。以下のようになる:</p>
<pre class="brush: jscript;">jQuery.fn.ajaxFaq = function(options) {
    var settings = jQuery.extend({
		//termを要求するurlなどのajax用オプションを指定する
        url: ...definitions: 'dd'
    },
    options);
	//&quot;this&quot;は現在のコンテキスト。この場合はfaqレイアウトを適用したい要素
    $(this).find(settings.definitions).click(function() {
        $(this).load(.....); //用語からその説明を読み込む
    });
    this.faq(); //オリジナルのfaqプラグインを呼び出す
});</pre>
<p>これにはいくつか欠点がある。まず、<em>faq</em>クラスは拡張されているかもしれない定義内容を取得するために、セレクタを繰り返すことになる。取得した定義内容を保存しておく手段も、二度目に必要になる定義を保存しておく手段もない。次に、定義を表示するためのAjaxロジックを<em>faq</em>プラグインが定義内容を表示するロジック自体に追加することができない。もともとのプラグインは<em>slideToggle</em>と呼ばれ、エフェクトを用いて定義内容を展開するものである。このエフェクトはAjaxがロードを終える前に開始される可能性があるので、やや問題がある。<em>faq</em>プラグイン全体を複製せずにこの問題を解決することできない。</p>
<p>ここでMooToolsの<em>Human</em>クラスを思いだそう。これは<em>isAlive</em>や<em>energy</em>のようなプロパティーと<em>eat</em>というメソッドを持っていた。新しいバージョンの<em>Human</em>にプロパティを追加するにはなにをしたらよいだろうか？　MooToolsではクラスを拡張する:</p>
<pre class="brush: jscript;">var Ninja = new Class({
    Extends: Human,
    initialize: function(name, age, side) {
        this.side = side;
        this.parent(name, age);
    },
    energy: 100,
    attack: function(target) {
        this.energy = this.energy - 5;
        target.isAlive = false;
    }
});</pre>
<p>サブクラスにたくさんの機能を追加したのがわかるだろう。このサブクラスは<em>Human</em>の持っていたすべてのプロパティを継承している。<em>Ninja</em>は<em>energy</em>の初期値として100を持っている。<em>Ninja</em>は<em>side</em>を持つ。また、<em>attack</em>メソッドを持ち、他の<em>Human</em>を殺すことができるが、<em>Ninja</em>は<em>energy</em>を5消費する。</p>
<pre class="brush: jscript;">var bob = new Human('Bob', 25);
var blackNinja = new Ninja('ニン テンドー', 'unknown', 'evil');
//blackNinja.isAlive = true
//blackNinja.name = 'ニン テンドー'
blackNinja.attack(bob);
//bobに生き残るチャンスはない</pre>
<p>これをちょっと見てみるだけで、考察に値する興味深いことが幾つかわかる。<em>Ninja</em>クラスに<em>initialize</em>メソッドがあることに注意して欲しい。これは<em>Human</em>クラスの<em>initialize</em>メソッドを上書きしているように見えるが、<em>this.parent</em>を呼び出して親クラスが想定していた引数を渡せば、まだ利用可能であることがわかる。さらに、親クラスを呼び出す前、または後など、自分が付け加えたロジックがいつ発生するのかをコントロールできる。新しい値をプロパティ（<em>energy</em>値のような）に設定したり、新しい機能を登録できる。これがjQueryの<em>faq</em>プラグインでできたら、と想像してほしい。Ajaxを読み込み、それから値をスライドして表示できるようになるのだ。</p>
<p>MooToolsはMixinと呼ばれる別のパターンを持っている。 あるクラスからサブクラスへと拡張するような親子関係ではなく、異なるクラス同士のプロパティを混ぜ合わせたクラスを定義することができる。以下がその例である:</p>
<pre class="brush: jscript;">var Warrior = new Class({
    energy: 100,
    kills: 0,
    attack: function(target) {
        target.isAlive = false;
        this.energy = this.energy - 5;
        this.kills++;
    }
});</pre>
<p>これにより、<em>Ninja</em>が<em>Human</em>と異なっていた性質はなくなり、一つのクラスに統合できる。これで<em>Ninja</em>以外の部分でこのコードを再利用できる。<em>Warrior</em>の性質を持つクラスを作ってみよう:</p>
<pre class="brush: jscript;">var Ninja = new Class({
    Extends: Human,
    Implements: Warrior, //配列にして、複数を指定することも可能
    initialize: function(name, age, side) {
        this.side = side;
        this.parent(name, age);
    }
});</pre>
<p><em>Ninja</em> は以前のように動いているが、<em>Warrior</em>はまだ再利用可能である:</p>
<pre class="brush: jscript;">var Samurai = new Class({
  Extends: Human,
  Implements: Warrior,
  side: 'good'
});</pre>
<p>これで<em>Samurai</em>と<em>Ninja</em>ができた。とを定義するためのコードがどれだけ短いかわかるだろうか？　この二つは戦士の資質をもつ人間として似ているが、侍が常に善である一方、忍者は忠誠心が傾きやすい。<em>Human</em>クラスと<em>Warrior</em>クラスを書く時間をかければ、コードを反復することなく三つのクラスを書くことができ、それらがお互いにどう影響していおり、メソッドが呼び出されるときのコントロールがどのような粒度であるかがわかるので、メンテナンスが用意である。それぞれのインスタンスは独立して存在し、コードは読みやすい。</p>
<p>さて、MooToolsでクラスがどのような働きをするかをざっと見たところで、jQueryで書いた<em>faq</em>クラスに立ち戻り、Ajax機能を追加しながらMooToolsで書いてみよう。</p>
<pre class="brush: jscript;">var FAQ = new Class({
	//OptionsはMooToolsで提供される他のクラスである
	Implements: Options,
	//これはデフォルトのオプション
	options: {
		terms: 'dt',
		definitions: 'dd'
	},
	initialize: function(container, options) {
		//コンテナへの参照を保持
		this.container = $(container);
		//setOptionsはOptionsのmixinによって提供される
		//メソッドで、渡された値を初期値に設定する
		this.setOptions(options);
		//termsとdefinitionsを保持
		this.terms = this.container.getElements(this.options.terms);
		this.definitions = this.container.getElements(this.options.definitions);
		//独自メソッドとしてattachを呼び出す
		//クラスの拡張が容易になる
		this.attach();
	},
	attach: function(){
		//termsをループ処理
		this.terms.each(function(term, index) {
			//それぞれにクリックイベントを添附
			term.addEvent('click', function(){
				//toggleメソッドを現在のindexで呼び出す
				this.toggle(index);
			}, this);
		}, this);
	},
	toggle: function(index){
		//与えられたindexのdefinitionをトグルして開く
		this.definitions[index].slide('toggle');
	}
});</pre>
<p>ワオ。なんて多いコードだ。全部のコメントを削除しても、まだ20行以上ある。すでに上で示したように、jQuery版のコードと同じだけ書いたというのに、骨組みができただけだ。なぜこんなに長くなるのか？　そう、我々はこれをもっと柔軟な形にする必要がある。クラスを使い、このようにコンストラクタを呼び出すのだ:</p>
<pre class="brush: jscript;">var myFAQ = new FAQ(myContainer);
//これでメソッドを呼び出すことができる
myFAQ.toggle(2); //三番目の要素をトグル</pre>
<p>インスタンスのプロパティとメソッドにアクセスできる。しかし、Ajax機能についてはどうしのか？　jQuery版のAjax拡張の問題点は、definitionの展開を読み込み完了まで待たせられないことだった。MooTools版ではこの心配がない:</p>
<pre class="brush: jscript;">var FAQ.Ajax({
	//このクラスはFAQのプロパティを継承している
	Extends: FAQ,
	//その他の初期値に加え、いつくかのオプションを新たに追加
	//一つはtermを送るためのurlがそれである。ここにtermのindexを送る
	//このコードはもっとよくできるが、とりあえずはこれで目的を果たす
	options: {
		url: null;
	},
	//結果をキャッシュし、セクションが二回ヒットされたら、
	//サーバにデータは取りにいかない
	indexesLoaded: [],
	toggle: function(index){
		//definitionをすでに読み込んでいたら
		if (this.indexesLoaded[index]) {
			//親クラスのtoggleを呼び出すだけ
			this.parent(index);
		} else {
			//そうでなかったらサーバへリクエスト
			new Request.HTML({
				update: this.definitions[index],
				url: this.options.url + index,
				//データが読み込まれたら、definitionを展開する
				onComplete: function(){
					this.indexesLoaded[index] = true;
					this.definitions[index].slide('toggle');
				}
			}).send();
		}
	}
});</pre>
<p>これでサーバからdefinitionを取得する<em>FAQ</em>クラスの新しいバージョンができた。サーバから値が戻ってくる<em>まで</em>definitionを展開<em>しない</em>ロジックへと拡張することもできる（jQuery版ではできなかったことだ）。また、新しい機能（Ajax）やその他については、ほとんど記述する必要がなかったことも留意してほしい。この拡張性により、様々な機能を持つプラグイン・ファミリーを作ることができる。つまり、他の人が作ったプラグインを利用して、それをほんの少しカスタマイズし（ソースコードをくまなく見ることなく）、好きなように使うことができるのだ。これは与えられたデザインパターン――デイト・ピッカー、タブ・インターフェースなど――のプラグインがMooToolsには少ししかない理由である。ほとんどのプラグインで問題は解決するか、そうでなければそれをニーズに合わせて拡張すればいいのだ。</p>
<p>最初に指摘したとおり、メソッドと変数を持つ複雑なjQueryウィジェットを書くことは可能である。これでDOMと関係のないロジックに力点を置いたりすると、あなたの書くコードの大半はヴァニラJavaScriptになる。jQueryのモデルはインスタンスをサブクラスへと拡張するシステムを提供しない。簡単な再利用を可能にするmixinも提供してくれない。結果的に、jQueryのプラグインは常にDOM要素と密接に関わっているのだ。もしURLを解析するようなクラスを書きたければ、有用なシステムは存在しない。自分でそれを書かない限りは。</p>
<p><a id="conclusion"></a></p>
<h2>決断の時</h2>
<p>jQueryが印象的であること、素早く簡単にコーディングできること、そして、DOMに焦点を当てる一方、MooToolsは拡張性、継承、読みやすさ、再利用、メンテナンスしやすさなどに重きを置いている。この二つを両極端にすえるならば、jQueryははじめるのも作るのも簡単だが（私の経験では）メンテナンス性と再利用が難しく（しかしそれはあなた次第であり、同様にjQueryの問題でもない）、MooToolsは学ぶのにも完成までに要するコードを書くのにも時間がかかかるが、できあがってしまえば再利用もメンテナンスもしやすい、ということになる。</p>
<p>さら、MooTools CoreはjQueryができるとはとても思えないたくさんの機能を持っている。双方のフレームワークとも、Coreに無駄はなく、プラグインは拡張を書けるようにしてある。Coreの仕事は欲しい機能を提供することではなく、思いつくものを実装するためのツールを提供することである。これがJavaScriptとそのフレームワークのパワーであり、これら二つのフレームワークはその点において優れている。MooToolsはより総合的なアプローチをとり、思いつくことすべてをDOMの範囲を超えて提供するが、急勾配な学習曲線を受け入れなければならない。MooToolsの拡張性と総合的なアプローチはjQueryの機能を超えるものを提供するが、jQueryが焦点を当てているDOM APIはJavaScriptの継承メソッドを使用したり、MooToolsのようなクラスシステムへとは至らない。</p>
<p>二つのフレームワークのどちらを選んでも素晴らしいと私が言ったのは、以上のような理由だ。コードに見る二つのフレームワークの哲学の違いと長所短所を挙げることに注力した。MooToolsに対する贔屓はできるかぎり排除できたのではないかと思っているが、できればこの比較が役に立つよう願っている。どちらのフレームワークを使うことを選んだとしても、その双方についてよく知るようにしてほしい。時間に余裕があるのならば、その二つをそれぞれサイトに実装してみてほしい。そしてそれぞれのレビューを書いてもらえれば、私が見逃したことを救い出してもらえるだろう。</p>
<p>この文書の履歴は<a href="http://github.com/anutron/jquery-vs-mootools/tree/master">githubで見ることができる</a>。</p>
<h2>翻訳者による感想</h2>
<p>僕のJavaScriptライブラリ遍歴はYUI→Spry→MooToolsという、貞淑な乙女の男遍歴のように短いのでよくわかりませんが、MooToolsには非常に期待しています。</p>
<p>ActionScriptがだんだん高機能になって、単なるWebインターフェースの改善から高機能アプリケーション開発ツールへと変貌しつつある現在、MooToolsがJavaScriptにとってそうなってくれると嬉しいですね。</p>
<p>ただ、プラグインの公式リポジトリは欲しいなあ。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/642/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://takahashifumiki.com/web/programing/642/" />
	</item>
	</channel>
</rss>
