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

<channel>
	<title>ピクスログ &#187; プログラム</title>
	<atom:link href="http://picslog.picsmate.net/category/program/feed/" rel="self" type="application/rss+xml" />
	<link>http://picslog.picsmate.net</link>
	<description>みずがめのラクガキはじめました。（あと、写真とか日記とか）</description>
	<lastBuildDate>Thu, 15 Apr 2010 08:30:35 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>PHPクラスの継承でオーバーライドしてしまった値を取得！</title>
		<link>http://picslog.picsmate.net/2009/01/05/657/</link>
		<comments>http://picslog.picsmate.net/2009/01/05/657/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 12:24:04 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[WEB開発]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/?p=657</guid>
		<description><![CDATA[
あけましておめでとうございます(＞_＜)
なんだかんだで、ずるずると公開から２回目の新年を迎えてしまいました！
結構な勢いで更新さぼっちゃいましたが、今年もよろしくお願いいたします！！！
と、本題。
少し前にPHPプロ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2009/01/2009-1-5_php_class_cast.jpg" alt="ソース-オブジェクトをキャスト" rel="lightbox[2009-1-5]" title="ソース-オブジェクトをキャスト"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2009/01/2009-1-5_php_class_cast.thumbnail.jpg" alt="ソース-オブジェクトをキャスト" width="240" height="112" class="attachment wp-att-658 " /></a><br />
あけましておめでとうございます(＞_＜)<br />
なんだかんだで、ずるずると公開から２回目の新年を迎えてしまいました！</p>
<p>結構な勢いで更新さぼっちゃいましたが、今年もよろしくお願いいたします！！！</p>
<p>と、本題。</p>
<p>少し前にPHPプロの質問で、「<a href="http://www.phppro.jp/qa/1722" rel="external">親クラスのメソッドをクラス外から呼びたい</a>」って質問があがっていました。</p>
<p>オブジェクトを配列へキャストするとこうなるんだぁ・・・（￣□￣；）<br />
オーバーライドで上書きしちゃってても、プライベート変数だっても関係ないじゃん・・・っていう話。</p>
<p>質問が解決されてから日が経っちゃってるけど、完全に忘れる前にメモ。</p>
<p>というわけで、自分の中では驚愕の事実だった手法は以下から。<br />
<span id="more-657"></span></p>
<p class="sub">紹介されていたコード</p>
<p>どうやら<a href="http://www.phpunit.de/" rel="external">PHPUnit</a>内の処理を参考にされた模様。</p>
<blockquote cite="http://www.phppro.jp/qa/1722#6994">
<pre><code class="color">&lt;?php 

/**
 * privateな属性の値を参照する。
 * 参考: PHPUnit_Framework_Assert::getObjectAttribute($object, $attributeName)
 */
function get_private_value($obj,$attributeName,$class=false) {
  if( $class===false) {
    $class = get_class($obj);
  }
  $objArray = (array) $obj;
  $privateName = sprintf(" %s %s",$class,$attributeName);
  if( array_key_exists($privateName,$objArray) ) {
    return $objArray[$privateName];
  }
  return null; 

}
  $test=new testClass3(); 

  $ret = get_private_value($test,'a','testClass3');
  var_dump($ret);
  $ret = get_private_value($test,'a','testClass');
  var_dump($ret); 

?&gt;
</code></pre>
</blockquote>
<p>まぁ、これだけだと途中の処理が省略されて、何をやってるのか分からないから、簡単にまとめます。</p>
<p class="sub">まとめ</p>
<p>まずプライベート変数を持った親クラスを作り、オーバーライドさせるために同じ名前のプライベート変数を持たせた子クラスで継承させる。</p>
<pre><code class="color">&lt;?php
//親クラス
class ParentClass {
  private $value = 'ParentClass Value!';
}
//子クラス
class ChildClass extends ParentClass {
  private $value = 'ChildClass Value!';
}
?&gt;
</code></pre>
<p>余計なことは省いて変数を上書きするだけ。</p>
<p>で、オブジェクトを作ってから<strong>配列にキャスト</strong>！(゜∀゜)</p>
<pre><code class="color">&lt;?php
$object = new ChildClass();
var_dump((array)$object);
?&gt;
</code></pre>
<p>ドキドキの結果は・・・。</p>
<pre><code class="color">array(2) {
  ["ChildClass�value"]=>
  string(17) "ChildClass Value!"
  ["ParentClass�value"]=>
  string(18) "ParentClass Value!"
}
</code></pre>
<p>うわーーーー∩(≧∇≦)∩<br />
なにか気持ち悪いものが見えてるけど、各プライベート変数が存在する配列になってるっぽい！</p>
<p>それから元記事で紹介されている</p>
<pre><code class="color">sprintf(" %s %s",$class,$attributeName);</code></pre>
<p>を参考に、質問者の方が回答されている実用的（？）な方法で記述すると。</p>
<pre><code class="color">&lt;?php
$object = new ChildClass();
$arrayObject = (array)$object;

echo "ParentClass Value : ",
  $arrayObject[" ParentClass value"],
  "nChildClass Value : ",
  $arrayObject[" ChildClass value"];
?&gt;</code></pre>
<p>ワクワクの結果は・・・。</p>
<pre><code class="color">ParentClass Value : ParentClass Value!
ChildClass Value : ChildClass Value!
</code></pre>
<p>うはぁ(＞▽＜)／<br />
取り出せたよ！！！</p>
<p>PHPすげぇ(＞_＜);;;<br />
全く使い所がわかんねぇ！！！</p>
<p>すごいんだけど、こういう力技が必要になった時点で設計ミスってる気が・・・。</p>
<p>質問内容もスゴイけど、解決できちゃうところがスゲェ！<br />
・・・そうかぁ、オブジェクトは配列にキャストかぁ(´･ω･`)</p>
<p>PHP4あたりでは<a href="http://www.php.net/manual/ja/function.get-object-vars.php" rel="external">get_object_vars</a>なんかを使って、メンバー変数を確認したりはしたけど、プライベートとか抜き出せないし、まぁメンバー変数を上書きしちゃったら１つの変数だしで、ちょっとどうしようもなかったんだけど。</p>
<p>まだまだPHPには未知の領域が存在しそうです(゜∀゜)</p>
<p>追記（2008-1-5 21：34：12）：<br />
<a href="http://d.hatena.ne.jp/shimooka/searchdiary?word=%2a%5bPHP%5d" rel="external">オブジェクトをarrayにキャストする &#8211; Do You PHP はてな</a><br />
うはぁ、わりと有名なのかな(＞_＜)<br />
いろいろスゲェ。</p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/12/28/652/">JavascriptでindexOfとmatchの速度がちょっと気になった</a><br />
<a href="http://picslog.picsmate.net/2008/12/20/645/">[MDIEスクリプト] select2zip.jsを更新</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2009/01/05/657/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavascriptでindexOfとmatchの速度がちょっと気になった</title>
		<link>http://picslog.picsmate.net/2008/12/28/652/</link>
		<comments>http://picslog.picsmate.net/2008/12/28/652/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 15:26:17 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[メモ]]></category>
		<category><![CDATA[日記]]></category>
		<category><![CDATA[Mozilla Firefox]]></category>
		<category><![CDATA[比較]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/?p=652</guid>
		<description><![CDATA[
まぁ大したことしてないし、どうでもいい記事なんですけどね。
最近Firefox3でindexOfと正規表現（match）による速度測定をしたけど、速度に差がなかったよ・・・的な記事を見かけた。
そんなことはないはず！と [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/12/2008-12-28_js_indexof.jpg" alt="ソース-indexOfとmatchの速度比較" rel="lightbox[2008-12-28]" title="ソース-indexOfとmatchの速度比較"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/12/2008-12-28_js_indexof.thumbnail.jpg" alt="ソース-indexOfとmatchの速度比較" width="240" height="150" class="attachment wp-att-653 " /></a><br />
まぁ大したことしてないし、どうでもいい記事なんですけどね。</p>
<p>最近Firefox3でindexOfと正規表現（match）による速度測定をしたけど、速度に差がなかったよ・・・的な記事を見かけた。</p>
<p>そんなことはないはず！とか思いながらも、ちょっと気になったんで簡単に試してみた。<br />
ちょっと元記事がどこいっちゃったのか、紛失しちゃったんですが・・・(＞_＜);;;<br />
<span id="more-652"></span></p>
<p class="sub">実行コード</p>
<p>というわけで、以下のコードを用意して実行してみた。</p>
<pre><code class="color">(function(){
  var $measure = function() {
    this.compact = /s+/g;
  };

    $measure.prototype.time = function()
    {
      return (new Date()).getTime();
    };

    $measure.prototype.exec = function(func)
    {
      var i=0;
      this.st = this.time();
      for (;i&lt;10000;i++) func();
      this.ft = this.time();
      return this.result = func.toString().replace(this.compact, ' ') +
        ' (' + (this.ft - this.st) + ')';
    };

  var $M = new $measure(),
    text = 'abcdefghijklmnopqrstuvwxyz',
    ward = 'lmn',
    reg  = /lmn/;

  alert($M.exec(function()
  {
    text.indexOf(ward);
  }) + 'n'+ $M.exec(function()
  {
    text.match(/lmn/);
  }) + 'n'+ $M.exec(function()
  {
    text.match(reg);
  }));
})();
</code></pre>
<p>やっつけだったんで、突っ込みどころもあるだろうけど、さておき。</p>
<p>処理自体は文字列「abcdefghijklmnopqrstuvwxyz」の中から、「lmn」を探し出すというだけ。</p>
<p class="sub">結果</p>
<ol>
<li>indexOfは5～6ミリ秒前後。</li>
<li>match使用で正規表現を毎回作成すると27～30ミリ秒前後。</li>
<li>match使用で正規表現を変数から割り当てた場合は26～28ミリ秒前後。</li>
</ol>
<p>というわけで、予想通りうちの環境ではindexOfが速い。</p>
<p>正規表現オブジェクトを変数代入した場合と、毎回作成した場合での結果がたまに気になる（￣□￣；）</p>
<p>基本は変数に入れてる方が速いんだけど、たまに逆転したり。<br />
いろいろなプロセスが動いてる状態でテストしてるから、今回はその辺りの誤差だと勝手に納得することにする。</p>
<p>目的は果たせたし。<br />
記事もやっつけ(゜∀゜)</p>
<p>それにしても元記事どこいったんだろう・・・(´･ω･`)</p>
<p class="sub">実行環境</p>
<ol>
<li>OS: Windows XP SP3</li>
<li>CPU: Pen4 3.2G</li>
<li>メモリー: 3G</li>
<li>Firefox3.0.5</li>
</ol>
<p class="sub">おまけ</p>
<p>せっかくなので、ブックマークレットを載せておきます。<br />
<a href="javascript:(function(){var $measure=function(){this.compact=/s+/g;};$measure.prototype.time=function(){return(new Date()).getTime();};$measure.prototype.exec=function(func){var i=0;this.st=this.time();for(;i&lt;10000;i++)func();this.ft=this.time();return this.result=func.toString().replace(this.compact,' ')+' ('+(this.ft-this.st)+')';};var $M=new $measure(),text='abcdefghijklmnopqrstuvwxyz',ward='lmn',reg=/lmn/;alert($M.exec(function(){text.indexOf(ward);})+'n'+$M.exec(function(){text.match(/lmn/);})+'n'+$M.exec(function(){text.match(reg);}));})();" rel="javascript">indexOfとmatchの速度比較</a></p>
<p class="sub">追記：2009-1-21</p>
<p>正規表現とindexOfを比較するなら、大文字小文字の対応も必要だなと思ってtoLowerCaseを加えた。</p>
<p>正規表現は大文字小文字の区別なし、indexOf()はtoLowerCase()を使用した文字を検索するよう変更。</p>
<p>ほぼ一緒だけど、コードは以下の通り。</p>
<pre><code class="color">(function(){
  var $measure = function() {
    this.compact = /s+/g;
  };

    $measure.prototype.time = function()
    {
      return (new Date()).getTime();
    };

    $measure.prototype.exec = function(func)
    {
      var i=0;
      this.st = this.time();
      for (;i&lt;10000;i++) func();
      this.ft = this.time();
      return this.result = func.toString().replace(this.compact, ' ') +
        ' (' + (this.ft - this.st) + ')';
    };

  var $M = new $measure(),
    text = 'abcdefghijklmnopqrstuvwxyz',
    ward = 'lmn',
    reg  = /lmn/i;

  alert($M.exec(function()
  {
    text.indexOf(ward);
  }) + 'n'+ $M.exec(function()
  {
    text.indexOf(ward.toLowerCase());
  }) + 'n'+ $M.exec(function()
  {
    text.match(/lmn/i);
  }) + 'n'+ $M.exec(function()
  {
    text.match(reg);
  }));
})();
</code></pre>
<p class="sub">結果</p>
<ol>
<li>indexOfでtoLowerCaseなしは6ミリ秒前後。</li>
<li>indexOfでtoLowerCaseありは9ミリ秒前後。</li>
<li>match使用で正規表現の大文字小文字の区別なしを毎回作成すると28ミリ秒前後。</li>
<li>match使用で正規表現の大文字小文字の区別なしを変数から割り当てた場合は28ミリ秒前後。</li>
</ol>
<p>toLowerCaseを加えた分少し遅くなったけど、やっぱり正規表現よりは速いらしい。</p>
<p>こちらも、ブックマークレットを載せておきます。<br />
<a href="javascript:(function(){var $measure=function(){this.compact=/s+/g;};$measure.prototype.time=function(){return(new Date()).getTime();};$measure.prototype.exec=function(func){var i=0;this.st=this.time();for(;i&lt;10000;i++)func();this.ft=this.time();return this.result=func.toString().replace(this.compact,' ')+' ('+(this.ft-this.st)+')';};var $M=new $measure(),text='abcdefghijklmnopqrstuvwxyz',ward='lmn',reg=/lmn/i;alert($M.exec(function(){text.indexOf(ward);})+'n'+$M.exec(function(){text.indexOf(ward.toLowerCase());})+'n'+$M.exec(function(){text.match(/lmn/i);})+'n'+$M.exec(function(){text.match(reg);}));})();" rel="javascript">indexOfとmatchの速度比較（toLowerCase追加、正規表現は大文字小文字の区別なし）</a></p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/12/20/645/">[MDIEスクリプト] select2zip.jsを更新</a><br />
<a href="http://picslog.picsmate.net/2008/12/08/577/">[clipFolder.js] MDIEでクリップボードからサクッとフォルダを作成</a><br />
<a href="http://picslog.picsmate.net/2008/06/03/324/">AIR用のSQLiteライブラリ「AirDB.js」</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/12/28/652/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[MDIEスクリプト] select2zip.jsを更新</title>
		<link>http://picslog.picsmate.net/2008/12/20/645/</link>
		<comments>http://picslog.picsmate.net/2008/12/20/645/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 07:38:10 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[MDIE]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[7z]]></category>
		<category><![CDATA[ソフト]]></category>
		<category><![CDATA[cmd]]></category>
		<category><![CDATA[MDIEスクリプト]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/?p=645</guid>
		<description><![CDATA[
公開せずに放置してたんですが、一段落したとして最新版のselect2zip.jsを公開しておきます。
一度、書き直したのでスクリプト自体は別物になってますが（・∀・）
少し機能が増えました。
というか、1年近くたっちゃ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/12/2008-12-20_mdie_select2zip.jpg" rel="lightbox[2008-12-20]" title="MDIE-select2zip.js"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/12/2008-12-20_mdie_select2zip.thumbnail.jpg" alt="MDIE-select2zip.js" width="240" height="180" class="attachment wp-att-644 " /></a><br />
公開せずに放置してたんですが、一段落したとして最新版のselect2zip.jsを公開しておきます。</p>
<p>一度、書き直したのでスクリプト自体は別物になってますが（・∀・）<br />
少し機能が増えました。</p>
<p>というか、1年近くたっちゃってるね・・・。<br />
<span id="more-645"></span></p>
<p>以下、使い方とか説明です。</p>
<p class="sub">使い方</p>
<p>基本的に使い方自体はいっしょだけど、とりあえず。<br />
ソースコードは<a href="http://picsmate.net/sample/select2zip/" rel="source">ソースコード</a>から。</p>
<ol>
<li>「<a href="http://picsmate.net/sample/select2zip/select2zip.zip" rel="zip">select2zip.zip</a>」をクリックしてダウンロード。</li>
<li>ダウンロードしたZIPファイルを解凍。</li>
<li>解凍してできた「select2zip.v076.js」をMDIEのインストールフォルダにあるscriptフォルダ内に移動(任意のフォルダでもいい)</li>
<li>MDIEを起動してメニューの「ツール」 &gt; 「拡張」 &gt; 「スクリプトに追加」で「select2zip.v076.js」を追加</li>
<li>MDIEのメニューの「ツール」にある「キーボードショートカット」や「マウスジェスチャ」に任意で登録</li>
</ol>
<p class="sub">設定について</p>
<p>解凍した「select2zip.v076.js」をテキストエディタ等で直接編集します。<br />
コメント入れているので大丈夫だと思うけど、ちょっと補足。</p>
<p>まずは環境設定。</p>
<ol>
<li>select2zip.v076.jsをテキストエディタで開いて、21行目以降を確認。
<pre><code class="color">/*
 * システム設定（7-zipの位置とか、ログファイルの場所を指定）
 * $system.exe        : 7zipプログラムのパス
 * $system.logfile    : ログファイルのパス(設定しない場合は、実行したディレクトリ内に自動作成)
 * $system.zipMode    : 圧縮タイプ(デフォルトはzip)
 * $system.skipExt    : 圧縮しないファイル拡張子（$option.skipZipがtrueの場合のみ有効）
 */
$system.exe     = '';
$system.logfile = '';
$system.zipMode = 'zip';
$system.skipExt = ['lzh','zip','cab','rar','7z','gz','bz2','tar'];
</code></pre>
</li>
<li>$system.exeだけは「7zipのパス」を確実に記述。<br />
  ※ここさえ間違ってなければ、とりあえず動くはず。</li>
<li>ログファイルを固定ファイルにしたい場合は「$system.logfile」に任意のパスを記述。</li>
<li>圧縮ファイルの種類を変更する場合は、$system.zipModeのzipを変更。<br />
  サポートしている圧縮タイプは「zip」、「7z」、「tar」、「gzip」、「bzip」で任意のファイルタイプを記述すればいい。<br />
  ※「gzip」、「bzip」は単体ファイルの圧縮しかサポートしてないので、非推奨。</li>
<li>$system.skipExtで圧縮したくないファイルの拡張子を記述。<br />
  ※Array形式での記述（['拡張子１', '拡張子２']）</li>
</ol>
<p>次にオプション設定。<br />
（オプションは「true」か「false」のみで記述）</p>
<ol>
<li>select2zip.v076.jsをテキストエディタで開いて、33行目以降を確認。
<pre><code class="color">/*
 * オプション設定（圧縮対象の設定とか、ログを残すかとか）
 * $option.pressDir   : 選択したフォルダを圧縮するか(圧縮する:true, 圧縮しない:false)
 * $option.pressFile  : 選択したファイルを圧縮するか(圧縮する:true, 圧縮しない:false)
 * $option.saveLog    : 実行ログを記録するか(記録する:true, 記録しない:false)
 * $option.skipZip    : 選択ファイルがZIPの場合、重複圧縮を回避するか(回避する:true, 回避しない:false)
 * $option.removeExt  : ファイル圧縮時に拡張子を外すか(外す:true, 残す:false)
 * $option.keepAction : ユーザによる圧縮中断後、残りの圧縮を継続するか(継続する:true, 継続しない:false)
 * $option.finish     : 終了時のアラート(アラートする:true, アラートしない:false)
 */
$option.pressDir   = true;
$option.pressFile  = true;
$option.saveLog    = true;
$option.skipZip    = true;
$option.removeExt  = true;
$option.keepAction = false;
$option.finish     = false;
</code></pre>
</li>
<li>$option.pressDirで選択中フォルダの圧縮の可否を決定。<br />
  ※フォルダの圧縮を無視したい場合、これをfalseにする。</li>
<li>$option.pressFileで選択中ファイルの圧縮の可否を決定。<br />
  ※ファイルの圧縮を無視したい場合、これをfalseにする。</li>
<li>ユーザが指定した拡張子をもつファイルの場合に、圧縮を無視するのであれば$option.skipZipをtrueにする。<br />
  ※圧縮ファイルの重複圧縮を回避するために作ったけど、圧縮ファイル以外の拡張子も指定できます。</li>
<li>ファイルの圧縮時のファイル名に、元の拡張子を取り外して、圧縮タイプの拡張子を付ける場合は、$option.removeExtをtrueにする。</li>
<li>タスクバーに表示されるコマンドプロンプトが、ユーザによって閉じられた場合に、残りのファイルの圧縮を引き続き行う場合に$option.keepActionをtrueにする。</li>
<li>select2zipの処理終了を通知したい場合に$option.finishをtrueにする。</li>
</ol>
<p>そんな感じ。</p>
<p>基本的に初期値が割り振られるようにしているので、$system.exe以外は削除しても動きます。<br />
※Vistaの場合で、プログラムフォルダに7zipをインストールした場合は、$system.exeも削除しても動くはず。<br />
※XPはシステム変数の展開の都合で、うまく動かないっぽい。</p>
<p class="sub">前回からの変更点</p>
<p>放置期間が長かったので、スクリプトとしては別物かも。</p>
<ul>
<li>処理終了までに、MDIEで選択ファイルを変更すると圧縮するファイルリストまで変わってしまうバグを修正。<br />
  ※とはいっても、前もってリストを確保してるだけなので、ファイルが多い場合にすぐ選択を解除したりなんかするとダメだと思う。</li>
<li>圧縮の種類をzipのみから、7z、tarにも変更できるように変更。<br />
  ※gzipやbzipもできるようにはしてるけど、1ファイル専用</li>
<li>選択ファイルに圧縮ファイルが含まれる場合、重複圧縮を回避できるように設定追加。<br />
  ※ただし、拡張子のみによる判別）</li>
<li>圧縮対象がファイルの場合、拡張子を取り外していたのを、設定により動作を変更できるようにした。</li>
<li>ログで書き出す内容が７ｚのすべてのexit codeに対応。（たぶん）</li>
<li>設定周りの変数名をいろいろ変更。</li>
<li>ログのテキスト情報をいろいろ変更。</li>
<li>ソースコードが膨張したり、キレイになったり、汚くなったり。</li>
<li>コードの切り分けがいま一つだけど、オブジェクトベースにしたので、（自分的に）多少変更が加えやすくなった。</li>
</ul>
<p>前回がバージョンもついてない状態で、いきなり中途半端なバージョンになってるけど・・・。<br />
とりあえず、やりたかったことは一通り実装した感じ。</p>
<p>・・・ソースがいま一つ整理できてないけど(＞_＜)</p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/12/08/577/">[clipFolder.js] MDIEでクリップボードからサクッとフォルダを作成</a><br />
<a href="http://picslog.picsmate.net/2008/01/31/181/">7-zipで選択中のファイル(またはフォルダ)を圧縮するMDIE用スクリプト「select2zip.js」</a><br />
<a href="http://picslog.picsmate.net/2007/10/14/148/">選択フォルダの階層構造をテキストファイルに出力するMDIE用スクリプト</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/12/20/645/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[clipFolder.js] MDIEでクリップボードからサクッとフォルダを作成</title>
		<link>http://picslog.picsmate.net/2008/12/08/577/</link>
		<comments>http://picslog.picsmate.net/2008/12/08/577/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 18:21:58 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[MDIE]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[ソフト]]></category>
		<category><![CDATA[設定]]></category>
		<category><![CDATA[MDIEスクリプト]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/?p=577</guid>
		<description><![CDATA[
新規フォルダを作成するときに、フォルダ名をコピペでつける機会って結構多いんですよね（・∀・）
これって、私だけって事はないはず！
・・・だけ？（　ﾟ Дﾟ）
ともあれ、１アクションで実行したいので、サクッとフォルダ作成 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/12/2008-12-8_mdie_clipfolder.jpg" rel="lightbox[pics-1228673912]" title="MDIE-clipFolder.js"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/12/2008-12-8_mdie_clipfolder.thumbnail.jpg" alt="MDIE-clipFolder.js" width="240" height="180" class="attachment wp-att-576 " /></a><br />
新規フォルダを作成するときに、フォルダ名をコピペでつける機会って結構多いんですよね（・∀・）<br />
これって、私だけって事はないはず！</p>
<p>・・・だけ？（　ﾟ Дﾟ）</p>
<p>ともあれ、１アクションで実行したいので、サクッとフォルダ作成する<a href="http://picslog.picsmate.net/category/mdie/">MDIE用スクリプト</a>を、サクッと書いてみました。</p>
<p>とりあえず、発想が発想なんで既出だったらゴメンナサイ(´･ω･`)<br />
<span id="more-577"></span></p>
<p class="sub">使い方</p>
<p>いつも通り、以下に使う手順を書いときます。</p>
<ol>
<li>「<a href="http://picsmate.net/sample/clipfolder/clipfolder.zip" rel="external">clipfolder.zip</a>」をクリックしてダウンロード。</li>
<li>ダウンロードしたZIPファイルを解凍。</li>
<li>解凍してできた「clipFolder.js」をMDIEのインストールフォルダにあるscriptフォルダ内に移動(任意のフォルダでもいい)</li>
<li>MDIEを起動してメニューの「ツール」 &gt; 「拡張」 &gt; 「スクリプトに追加」で「clipFolder.js」を追加</li>
<li>MDIEのメニューの「ツール」にある「キーボードショートカット」や「マウスジェスチャ」に任意で登録</li>
</ol>
<p>以上で新規フォルダ後にコピペで名前を付けなくても、サクッと１アクションで名前の付いたフォルダが作れます。<br />
そんだけ(＞_＜)</p>
<p>「ctrlキー」＋「kキー」に設定されてる新規フォルダ作成を、「ctrlキー」＋「nキー」に変更してるんだけど、クリップボードをクリアするのがめんどうな時もありそうなので、使い分けのために「ctrlキー」＋「shftキー」＋「nキー」なんかに割り当てています。</p>
<p class="sub">仕様とか</p>
<p>ソースコードを確認する場合は<a href="http://picsmate.net/sample/clipfolder/" rel="external">MDIEスクリプト clipFolder.js ソースコード [ピクスメイト]</a>から。</p>
<p>多少、邪魔に感じるかもしれないおせっかい機能とかもあります。</p>
<ul>
<li>クリップボードから取得した文字列に、フォルダ名として使用できない文字はすべて「-」に変換。<br />
  ※なんかフォルダ作成時に使えない文字としてカンマ「,」が出てるけど、あれって使えるよね？</li>
<li>フォルダ名の重複時は、とりあえずフォルダ名の最後に「(数値)」を付与。<br />
  ・・・個人的にフォルダの大量作成時に便利だから。</li>
<li>クリップボードが文字列でない場合、通常の新規フォルダコマンドを実行。<br />
  ※MDIE.Clipboardはテキストデータしか見ないみたいだから、typeof判定いらなかったかも</li>
<li>フォルダパスとして有効な文字数かどうかのチェックまではやっていません。</li>
</ul>
<p>仕様じゃないんだけど、大したことしてない割に動作が重い気がするよ（　ﾟ Дﾟ）<br />
「Scripting.FileSystemObject」って結構コストがかかる？</p>
<p>それにしても<a href="http://cres.s28.xrea.com/soft/mdie.html" rel="external">MDIE</a>、そろそろ更新されないかなぁ・・・。</p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/01/31/181/">7-zipで選択中のファイル(またはフォルダ)を圧縮するMDIE用スクリプト「select2zip.js」</a><br />
<a href="http://picslog.picsmate.net/2007/10/14/148/">選択フォルダの階層構造をテキストファイルに出力するMDIE用スクリプト</a><br />
<a href="http://picslog.picsmate.net/2007/10/08/146/">拡張子ごとにフォルダ振り分けを行うMDIE用スクリプト</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/12/08/577/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「Aptana Studio」のインストール手順まとめ</title>
		<link>http://picslog.picsmate.net/2008/11/28/522/</link>
		<comments>http://picslog.picsmate.net/2008/11/28/522/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 17:22:14 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[WEB開発]]></category>
		<category><![CDATA[ソフト]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[メモ]]></category>
		<category><![CDATA[日記]]></category>
		<category><![CDATA[Aptana Studio]]></category>
		<category><![CDATA[まとめ]]></category>
		<category><![CDATA[半角スペース]]></category>
		<category><![CDATA[可視化]]></category>
		<category><![CDATA[インデント]]></category>
		<category><![CDATA[インストール]]></category>
		<category><![CDATA[設定]]></category>
		<category><![CDATA[開発環境]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/?p=522</guid>
		<description><![CDATA[
xamppに続いて、Aptana Studioのインストールと、設定についてもまとめ。
JavaScriptの開発には、非常に便利だもんね！(≧∇≦)/

Aptana Studioをインストール

まず「ダウンロード [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_1.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_1.thumbnail.jpg" alt="Aptana Studio" width="240" height="180" class="attachment wp-att-509 " /></a><br />
xamppに続いて、Aptana Studioのインストールと、設定についてもまとめ。</p>
<p>JavaScriptの開発には、非常に便利だもんね！(≧∇≦)/<br />
<span id="more-522"></span></p>
<p class="sub">Aptana Studioをインストール</p>
<ol>
<li>まず「<a href="http://www.aptana.com/studio/download" rel="external">ダウンロードページ</a>」のページから、Aptana Studioをダウンロード。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_2.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-ダウンロード"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_2.thumbnail.jpg" alt="Aptana Studio-ダウンロード" width="240" height="145" class="attachment wp-att-510 " /></a><br />
  インストーラー版でも、zip版でもどっちでもいい。</li>
<li>インストーラー版を使った場合は、表示に従いインストール。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_3.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-インストール"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_3.thumbnail.jpg" alt="Aptana Studio-インストール" width="240" height="186" class="attachment wp-att-511 " /></a><br />
  zip版は解凍するだけなので、実はこっちの方が簡単かも（・∀・）</li>
<li>インストールが終わったから即起動・・・じゃなくて、とりあえず日本語化！（　ﾟ Дﾟ）</li>
</ol>
<p class="sub">Aptana Studioを日本語化</p>
<p>Aptana Studioの初期設定では英語表示なので、Eclipseの言語パック「Pleiades」を利用して日本語化します。</p>
<ol>
<li>まず「<a href="http://mergedoc.sourceforge.jp/" rel="external">Pleiades (プレアデス)</a>」サイトに行って、言語パックをダウンロード。
<p>  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_4.jpg" rel="lightbox[pics-1227804460]" title="Pleiades"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_4.thumbnail.jpg" alt="Pleiades" width="240" height="112" class="attachment wp-att-512 " /></a><br />
  とりあえず「Pleiades」をクリックすると・・・。</p>
<p>  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_5.jpg" rel="lightbox[pics-1227804460]" title="Pleiades-ダウンロード"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_5.thumbnail.jpg" alt="Pleiades-ダウンロード" width="240" height="121" class="attachment wp-att-513 " /></a><br />
  大きいボタンがあるのでついつい押してみたくなるけど、そこはグッ（　ﾟ Дﾟ）・・・とこらえて。<br />
  「<q cite="http://mergedoc.sourceforge.jp/pleiades.html">Pleiades 本体ダウンロード</q>」項目の「安定版 1.2.3（2008-11-28日現在）」のテキストリンクをクリックしてダウンロード。</li>
<li>ダウンロードしたzipファイルを解凍して、出てきた「features」と「plugins」フォルダごと、Aptana Studioのインストールディレクトリに移動。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_6.jpg" rel="lightbox[pics-1227804460]" title="Pleiades-Aptanaフォルダに移動"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_6.thumbnail.jpg" alt="Pleiades-Aptanaフォルダに移動" width="240" height="155" class="attachment wp-att-514 " /></a><br />
  同名ファイルがあるので確認が出るけど、そのまま上書きコピー。</li>
<li>次にAptana Studioのインストールディレクトリにある「AptanaStudio.ini」ファイルをテキストエディタで開き、最終行に以下の記述を追加。
<pre><code class="color">-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar=default.splash</code></pre>
</li>
<li>次に言語パックを反映させるのに、Aptana Studioを「-clean」コマンドで起動させる。
<p>  たまにこの「-clean」コマンドが必要なんだけど、いちいちコマンド起動は面倒！<br />
  なのでPleiadesの中に同梱されているバッチファイルを利用(≧∇≦)/<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_7.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-バッチファイル"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_7.thumbnail.jpg" alt="Aptana Studio-バッチファイル" width="240" height="63" class="attachment wp-att-515 " /></a><br />
  まずファイル名が「eclipse.exe -clean.cmd」なのを、「AptanaStudio.exe -clean.cmd」と変更し、Aptana Studioのインストールディレクトリに移動。</li>
<li>次にテキストエディタで開いて、「start .\eclipse.exe -clean %*」と記述されている行を
<pre><code class="color">start .\AptanaStudio.exe -clean %*</code></pre>
<p>  と変更して保存。</p>
<p>  これで次回から「-clean」コマンドが必要な場合でも、簡単に実行できます。</li>
<li>バッチファイルからAptana Studioを起動させて、日本語化されてれば成功。</li>
</ol>
<p class="sub">JavaScriptのエラー検証を有効化</p>
<p>Aptana Studioの初期設定ではJavaScriptの構文チェックが無効化されているので、チェックを有効化します。<br />
<a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_8.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-初期JavaScriptチェック"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_8.thumbnail.jpg" alt="Aptana Studio-初期JavaScriptチェック" width="240" height="143" class="attachment wp-att-516 " /></a></p>
<ol>
<li>Aptana Studioを起動させて、メニューのウィンドウ &gt; 設定をクリックします。</li>
<li>次に設定画面の左側のツリーからAtpana &gt; エディター &gt; JavaScript &gt; 検証とたどって、バリデーター項目にチェックを入れ設定完了。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_9.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-JavaScriptチェック設定"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_9.thumbnail.jpg" alt="Aptana Studio-JavaScriptチェック設定" width="240" height="232" class="attachment wp-att-517 " /></a></li>
<li>あらめて文法エラーのあるJSファイルを確認。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_10.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-JavaScriptチェック有効化"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_10.thumbnail.jpg" alt="Aptana Studio-JavaScriptチェック有効化" width="240" height="143" class="attachment wp-att-518 " /></a><br />
    構文エラーが出力されるようになったよ！(*°∀°)=3</li>
</ol>
<p class="sub">タブと半角スペースを表示</p>
<p>Aptana Studioの初期設定ではタブと半角スペースが見えないので、可視化します。<br />
<a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_11.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-インデント非表示"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_11.thumbnail.jpg" alt="Aptana Studio-インデント非表示" width="240" height="143" class="attachment wp-att-519 " /></a></p>
<p>今回は説明を省略しますが、全角スペースも可視化する場合は、プラグインの「<a href="http://mergedoc.sourceforge.jp/jstyle.html" rel="external">jStyle</a>」を追加します。</p>
<ol>
<li>Aptana Studioを起動させて、メニューのナビゲートの下あたりにある、なんて言うのかわからないツールボタンをクリックするだけ。<br />
  タブや半角スペース、改行コードまで可視化できます。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_12.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-インデント可視化"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_12.thumbnail.jpg" alt="Aptana Studio-インデント可視化" width="240" height="143" class="attachment wp-att-520 " /></a><br />
  ボタンはキャプチャ画像を参考にしてください(´･ω･`)</li>
<li>ついでに、その横のリストのようなボタンをクリックすると、エディタのピアノキーが有効になって、1行毎に色が変わります。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_13.jpg" rel="lightbox[pics-1227804460]" title="Aptana Studio-ピアノキー有効化"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-28_aptana_13.thumbnail.jpg" alt="Aptana Studio-ピアノキー有効化" width="240" height="143" class="attachment wp-att-521 " /></a><br />
  初期設定のままだから、色が薄くて分かりにくいけど(＞_＜)</li>
</ol>
<p>いくつかプラグインの導入方法も載せようかと思ったけど、以外と長くなったのでここまで。</p>
<p>また気が向いたら載せるかもです( ・ω・)</p>
<p>関連情報：<br />
<a href="http://www.aptana.com/" rel="external">Aptana</a><br />
<a href="http://mergedoc.sourceforge.jp/" rel="external">MergeDoc Project (Eclipse 日本語化)</a><br />
<a href="http://mergedoc.sourceforge.jp/jstyle.html" rel="external">JStyle (Eclipse 改行、タブ、全角空白を表示)</a></p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/11/27/500/">xamppのインストール手順まとめ</a><br />
<a href="http://picslog.picsmate.net/2008/11/26/480/">Windows XPを再インストール中</a><br />
<a href="http://picslog.picsmate.net/2008/11/21/447/">コマンドプロンプトの覚え書き</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/11/28/522/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>xamppのインストール手順まとめ</title>
		<link>http://picslog.picsmate.net/2008/11/27/500/</link>
		<comments>http://picslog.picsmate.net/2008/11/27/500/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 19:18:09 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[WEB開発]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ソフト]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[メモ]]></category>
		<category><![CDATA[まとめ]]></category>
		<category><![CDATA[インストール]]></category>
		<category><![CDATA[環境変数]]></category>
		<category><![CDATA[設定]]></category>
		<category><![CDATA[開発環境]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[xampp]]></category>
		<category><![CDATA[文字コード]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/?p=500</guid>
		<description><![CDATA[
OSの再インストールに伴い、開発環境も再構築中。
まずは「xampp」と「Aptana Studio」をインストール。
いろいろ入れ直すのが面倒なので、いろいろ詰め込まれた「Pleiades All in One パッ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_1.jpg" rel="lightbox[pics-1227725241]" title="xampp-コントロールパネル"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_1.thumbnail.jpg" alt="xampp-コントロールパネル" width="240" height="193" class="attachment wp-att-488 " /></a><br />
<a href="http://picslog.picsmate.net/2008/11/26/480/">OSの再インストール</a>に伴い、開発環境も再構築中。</p>
<p>まずは「xampp」と「Aptana Studio」をインストール。</p>
<p>いろいろ入れ直すのが面倒なので、いろいろ詰め込まれた「<a href="http://mergedoc.sourceforge.jp/" rel="external">Pleiades All in One パッケージ</a>」のEclipseでも入れちゃおうかとも思ったりもしたけど。</p>
<p>とりあえず「xampp」セットアップから、PHP、Mysqlの設定手順についてまとめ。<br />
<span id="more-500"></span></p>
<p class="sub">xamppをインストール</p>
<ol>
<li>今回は「<a href="http://www.apachefriends.org/jp/xampp-windows.html" rel="external">apache friends</a>」からxamppのインストーラー版をダウンロード。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_2.jpg" rel="lightbox[pics500]" title="xampp-ダウンロード"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_2.thumbnail.jpg" alt="xampp-ダウンロード" width="240" height="162" class="attachment wp-att-489 " /></a><br />
  別にzip版でも、そんなに作業内容は変わんないので、好みで( ・ω・)</li>
<li>表示に従って、さくさくインストール。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_3.jpg" rel="lightbox[pics500]" title="xampp-インストール"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_3.thumbnail.jpg" alt="xampp-インストール" width="240" height="149" class="attachment wp-att-490 " /></a></p>
<p>  インストール後に起動確認。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_1.jpg" rel="lightbox[pics-1227725241]" title="xampp-コントロールパネル"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_1.thumbnail.jpg" alt="xampp-コントロールパネル" width="240" height="193" class="attachment wp-att-488 " /></a></li>
<li>今回は業務専用のパソコンでないので、パソコン起動毎にApacheとMysqlを立ち上げる必要はないから、スタートアップを手動に変える。
<p>  コントロールパネル &gt; 管理ツールから、サービスを起動してApacheとMysqlの「スタートアップの種類」を「手動」に変更。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_4.jpg" rel="lightbox[pics500]" title="Apache-スタートアップを手動"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_4.thumbnail.jpg" alt="Apache-スタートアップを手動" width="240" height="219" class="attachment wp-att-491 " /></a></li>
</ol>
<p class="sub">Apacheの設定</p>
<p>「httpd.conf」を書き換えるんだけど、ある程度ファイルを分けてたほうが設定を間違った場合に修正しやすいので、「<a href="http://httpd.apache.org/docs/2.2/ja/mod/core.html#include" rel="external">Include</a>」を使って、自分設定を分けておく方が便利(*°∀°)=3</p>
<ol>
<li>xamppのインストールディレクトリ &gt; apache &gt; confディレクトリに移動。</li>
<li>「httpd.conf」をテキストエディタで開く。<br />
  ついでに「httpd.conf」を別名でバックアップとかしてた方がいいかも(≧∇≦)/</li>
<li>「httpd.conf」の最終行に移動して、
<pre><code class="color">#自分設定 (2008-11-26更新)
Include "C:\自分のconfを置くディレクトリ\*.conf"</code></pre>
<p>  みたいに記述しておき保存。</p>
<p>  あとは自分設定の保存予定地に、ファイル名.confの要領で好きなだけ設定を追加する。</p>
<p>  Apacheが動かなくなった時は、拡張子をtxtなんかにでも書き換えれば、どれが不具合起してるのか見つけやすくていいよ(゜∀゜)</li>
<li>最後にApacheサービスを再起動して、ブラウザで「http://locslhost/」を叩いて、お約束の確認。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_5.jpg" rel="lightbox[pics500]" title="xampp-スタートページ"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_5.thumbnail.jpg" alt="xampp-スタートページ" width="240" height="110" class="attachment wp-att-492 " /></a></li>
</ol>
<p class="sub">PHPとMysqlのパスを通す</p>
<p>コマンドラインからサクッと実行できるように、PHPとMysqlのパスを通しておきます（・∀・）</p>
<p>Mysqlはサービスを起動しないと実行できないけど、PHPはパスさえ通しておけば実行できるので簡単便利。<br />
（php.iniのパスを渡してやらないと設定が違ってたりするけどね）</p>
<ol>
<li>コントロールパネル &gt; システム &gt; 詳細設定から、環境変数をクリック。</li>
<li>システム環境変数の新規ボタンをクリックし、とりあえずxamppのパスを変数登録してあげる。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_6.jpg" rel="lightbox[pics500]" title="xampp-パスを環境変数に登録"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_6.thumbnail.jpg" alt="xampp-パスを環境変数に登録" width="240" height="82" class="attachment wp-att-493 " /></a><br />
  ※画像はCドライブ直下にxamppをインストールした場合。</p>
<p>  必須じゃないけど、パスを通した時に少しでも見通しを良くするための俺仕様(^_^;)</li>
<li>システム変数の「Path」をダブルクリックしてパスを通す。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_7.jpg" rel="lightbox[pics500]" title="php、mysqlのパスを通す"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_xampp_7.thumbnail.jpg" alt="php、mysqlのパスを通す" width="240" height="200" class="attachment wp-att-494 " /></a></p>
<p>  今回はxamppのパスを登録しているので、Path変数の最後に</p>
<pre><code class="color">;%XAMPP%\php;%XAMPP%\mysql\bin</code></pre>
<p>  を追加。</p>
<p>  ちょっと読みやすくなった！・・・よね？(＞_＜)</li>
<li>変数が通ったか確認するのに、コマンドラインからPHPを実行。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_php_1.jpg" rel="lightbox[pics500]" title="PHP-コマンドプロンプトで確認"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_php_1.thumbnail.jpg" alt="PHP-コマンドプロンプトで確認" width="240" height="175" class="attachment wp-att-495 " /></a><br />
  問題なし！(*°∀°)=3</p>
<p>  コピペ用にコードも載せておきます。</p>
<pre><code class="color">php -r "echo phpversion();";</code></pre>
</li>
</ol>
<p class="sub">PHPの設定</p>
<p>これは好きにすればいいんだけど、とりあえずxamppバンドルのphp.iniは「magic_quotes_gpc」がOnになってるので、とりあえずこれだけ修正。</p>
<ol>
<li>xamppのインストールディレクトリ &gt; apache &gt; binディレクトリに移動。<br />
  ※xamppの場合、phpディレクトリのphp.iniはダミーなので注意！(＞_＜)</li>
<li>「php.ini」をテキストエディタで開く。<br />
  Apache設定同様に別名でバックアップとかしてた方がいいかもね！</li>
<li>テキストファイルから「magic_quotes_gpc」を検索。</li>
<li>「On」から「Off」に書き換える。</li>
</ol>
<p class="sub">Mysqlの設定</p>
<p>基本UTF-8で使ってるので、とりあえず文字コードをUTF-8に統一。</p>
<ol>
<li>xamppのインストールディレクトリ &gt; mysql &gt; binディレクトリに移動</li>
<li>「my」と見えている短縮ダイヤルファイルヽ（´ー｀）┌<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_mysql_1.jpg" rel="lightbox[pics500]" title="mysql-設定ファイル"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_mysql_1.thumbnail.jpg" alt="mysql-設定ファイル" width="240" height="133" class="attachment wp-att-496 " /></a><br />
  これがMysqlの設定ファイルなので、テキストエディタで開く。<br />
  必要ならバックアップ（・∀・）</p>
<p>  windowsでは「cnf」拡張子が短縮ダイヤルファイルとして設定されてるんだね( ・ω・)</li>
<li>[mysqld]項目の直後に以下の記述を追加。
<pre><code class="color">default-character-set = utf8
skip-character-set-client-handshake </code></pre>
</li>
<li>mysqlを起動し確認。<br />
  だけど、このまま書くと読みにくいので、いったん切り上げます(゜∀゜)</li>
</ol>
<p class="sub">Mysqlの文字コードを確認</p>
<ol>
<li>xamppコントロールパネルなどから、Mysqlサービスを起動。</li>
<li>コマンドプロンプトでMysqlに接続するのに、以下コード実行。
<pre><code class="color">mysql -u root</code></pre>
<p>  ※最初はMysqlのroot権限にパスワードがないので、この後でパスワード設定に移ります。</li>
<li>次にデータベースの文字コードを列挙させる。
<pre><code class="color">show variables like "char%";</code></pre>
</li>
<li>filesystem項目以外がUTF-8になっていることを確認して終了。<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_mysql_2.jpg" rel="lightbox[pics500]" title="mysql-文字コード確認"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_mysql_2.thumbnail.jpg" alt="mysql-文字コード確認" width="240" height="175" class="attachment wp-att-497 " /></a></li>
</ol>
<p class="sub">Mysqlにパスワードを設定</p>
<p>Mysqlのインストール直後は、rootユーザにパスワードが設定されてない(*°∀°)=3<br />
このまま放置するわけにいかないので、パスワードを設定。</p>
<ol>
<li>xamppコントロールパネルなどから、Mysqlサービスを起動。</li>
<li>コマンドプロンプトでmysqladminを使って、パスワードを設定。
<pre><code class="color">mysqladmin -u root -p パスワードに設定する文字列</code></pre>
</li>
<li>パスワード設定後に、そのパスワードを使ってログイン。
<pre><code class="color">mysqladmin -u root -p</code></pre>
</li>
<li>実行後、パスワードを聞いてくるので、設定したパスワードを入力<br />
  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_mysql_3.jpg" rel="lightbox[pics500]" title="mysql-パスワード設定"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_mysql_3.thumbnail.jpg" alt="mysql-パスワード設定" width="240" height="175" class="attachment wp-att-498 " /></a><br />
  ログインできれば成功。</li>
</ol>
<p class="sub">Mysqlにパスワードを設定２</p>
<p>一度パスワードを設定してしまうと、mysqladminから前に使ったコマンドでパスワードを再設定できないので、通常のパスワード設定方法も紹介。</p>
<ol>
<li>xamppコントロールパネルなどから、Mysqlサービスを起動。</li>
<li>コマンドプロンプトから、とりあえずmysqlにログイン。
<pre><code class="color">mysql -u root</code></pre>
<p>  すでにパスワードを設定している場合は、「-p」コマンドも付け加えてパスワードも入力。</li>
<li>ログイン後、以下コマンドを実行。
<pre><code class="color">set password for root@localhost=password('設定するパスワード');</code></pre>
<p>  <a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_mysql_4.jpg" rel="lightbox[pics500]" title="mysql-パスワード設定2"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/11/2008-11-27_mysql_4.thumbnail.jpg" alt="mysql-パスワード設定2" width="240" height="175" class="attachment wp-att-499 " /></a><br />
  こっちだと何度でも再設定できる。</li>
</ol>
<p>ちょっと1ページに詰め込みすぎたかもしれない。</p>
<p>明日、<a href="http://picslog.picsmate.net/2008/11/28/522/">「Aptana」の初期設定方法</a>も書く予定。</p>
<p>関連情報：<br />
<a href="http://www.apachefriends.org/jp/xampp-windows.html" rel="external">apache friends &#8211; xampp for windows</a></p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/11/26/480/">Windows XPを再インストール中</a><br />
<a href="http://picslog.picsmate.net/2008/11/21/447/">コマンドプロンプトの覚え書き</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/11/27/500/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AIR用のSQLiteライブラリ「AirDB.js」</title>
		<link>http://picslog.picsmate.net/2008/06/03/324/</link>
		<comments>http://picslog.picsmate.net/2008/06/03/324/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 17:11:28 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[WEB開発]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/2008/06/03/324/</guid>
		<description><![CDATA[
AIRでSQLiteをもう少し簡単に使えるように、叩き台用にライブラリ化してみた。
久しぶりのプログラム記事かもしれない。。。（゜◇゜）
AS(Action Script)ではなく、JS(Java Script)用なの [...]]]></description>
			<content:encoded><![CDATA[<div class="imageframe" style="width:320px;"><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/06/20080602_airdbjs.jpg" rel="lightbox[pics-1212414840]" title="AirDB.js"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/06/20080602_airdbjs.thumbnail.jpg" width="320" height="240" alt="AirDB.js" /></a></div>
<p>AIRでSQLiteをもう少し簡単に使えるように、叩き台用にライブラリ化してみた。<br />
久しぶりのプログラム記事かもしれない。。。（゜◇゜）</p>
<p>AS(Action Script)ではなく、JS(Java Script)用なので注意。</p>
<p>とりあえず、使い方とかを紹介。<br />
<span id="more-324"></span></p>
<p class="sub">ファイルの入手</p>
<p><a href="http://picsmate.net/sample/AirDB/AirDB.v010.zip" rel="zip">AirDB.v010.zip</a>からjsファイルを入手。</p>
<p>内容は以下の通り。</p>
<ul>
<li>AirDB.v010.js （オリジナルファイル）</li>
<li>AirDB.v010.pack.js （pack圧縮ファイル）</li>
</ul>
<p>ソースコードは「<a href="http://picsmate.net/sample/AirDB/" rel="external">AIR SQLiteライブラリ AirDB.js ソースコード [ピクスメイト]</a>」で確認できます。</p>
<p class="sub">まずは読み込む</p>
<p>AIRプロジェクトのhtmlファイルのヘッダー要素に以下を追加。</p>
<pre><code class="color">&lt;script type="text/javascript" src="AIRAliases.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="AirDB.v010.js"&gt;&lt;/script&gt;
</code></pre>
<p>AIRのJS用のアクションスクリプトエイリアス群を使うので、「AIRAliases.js」も読み込みます。</p>
<p class="sub">使う準備をする</p>
<p>AirDBオブジェクトを読み込む。今回は「$DB」という変数で初期化することとします。</p>
<pre><code class="color">var $DB = new AirDB;
window.addEventListener('unload', $DB.close);
</code></pre>
<p>例としてAIRが閉じられるときに、一応データベースを閉じるようにイベントを登録したけど、多分いらない。</p>
<p class="sub">データベースをファイルから読み込んで、テーブルを作成</p>
<p>AirDB.connectでファイルからSQLiteに接続、AirDB.createでテーブルを作成します。</p>
<pre><code class="color">try {
  $DB.connect("app:sample.db");
  $DB.create("test", {
    id: 'INTEGER PRIMARY KEY',
    message: 'TEXT'
  });
} catch (error) {
  alert(error.toString());
}
</code></pre>
<p>$DB.createでは常にテーブルの存在を確認する「CREATE TABLE IF NOT EXISTS ～」の文法でSQLを組み立てます。</p>
<p>上記の例では結果が返ってくるまで待つ「同期」状態でSQLiteに接続していますが、非同期で接続する場合はAirDB.connectの第2引数にtrueを与えます。</p>
<p>また、AirDB.connectの第3引数には接続直後に実行する関数を与えることができます。</p>
<p>具体的には以下のような感じ。</p>
<pre><code class="color">try {
  $DB.connect("app:sample.db",true, function(){
    $DB.create("test", {
      id: 'INTEGER PRIMARY KEY',
      message: 'TEXT'
    });
  });
} catch (error) {
  alert(error.toString());
}
</code></pre>
<p>個人的に長い関数名を打ち込むのがめんどくさいので、AirDB.connectはAirDB.con、AirDB.createはAirDB.creのように短い関数名のエイリアスを張っています。</p>
<p>エイリアスについては、AirDB.v010.jsか<a href="http://picsmate.net/sample/AirDB/" rel="external">ソースコード</a>の終わりのほうを見てください（投げやり）</p>
<p class="sub">データの挿入とか更新</p>
<p>同期か非同期で、エラーイベントとかの取得とかのタイミングが変わるので、ここからは同期で接続した場合の例です。</p>
<p>データ入力の例</p>
<pre><code class="color">function insertData()
{
  try {
    $DB.insert('test', {
      message : 'message'
    });
  } catch(error) {
    alert(error.toString());
  }
}
</code></pre>
<p>こんな感じ。</p>
<p>AirDB.insert(テーブル名:string,インサートデータ:object)で使えます。</p>
<p>トランザクション処理を入れる場合は、AirDB.begin()、AirDB.commit()、AirDB.rollback()が利用できます。</p>
<p>データ更新の例</p>
<pre><code class="color">function updateData()
{
  try {
    $DB.update('test', {
        message : 'update message'
      },
      "WHERE" +
      "  id = '1'"
    );
  } catch(error) {
    alert(error.toString());
  }
}
</code></pre>
<p>AirDB.update(テーブル名:string,アップデートデータ:object,絞込条件とか:string)で使えます。</p>
<p>同じ要領で、AirDB.Delete(テーブル名:string,絞込条件とか:string)でデータの削除ができます。<br />
(関数名がdeleteではなくDeleteになってるのは間違いではなく、jsのdeleteと被るから)</p>
<p>とりあえず、AirDB.insertとAirDB.updateは、内部でパラメータを登録してプリペアードで実行するようにしています。<br />
（ただし、AirDB.updateの絞込みとかのWHERE句とかはそのまま）</p>
<p class="sub">登録データの取得</p>
<p>データ取得の例</p>
<pre><code class="color">function selectData()
{
  try {
    $DB.select('test',
      ['id','message'],
      "WHERE" +
      "  message not NULL"
    );
  } catch(error) {
    alert(error.toString());
  }

  //ここから結果の表示処理
  result = $DB.getRows();
  if (result != null) {
    var data = new String();
    for (row in result) {
      data += "[" + row + "] " +
              "id: \"" + result[row].id + "\" " +
              "message: \"" + result[row].message + "\"\n";
    }
    alert(data);
  } else {
    alert('データが見つかりません！');
  }
}
</code></pre>
<p>こんな感じ。</p>
<p>AirDB.select(テーブル名:string,取得対象カラム:string or array,絞込条件とか:string)で使えます。</p>
<p class="sub">まとめ</p>
<p>いろいろ解説サイトとか見て思ったけど、ローカルで扱うのを前提としているためか、意外とプリペアードクエリもエスケープもやってないもの多いね。</p>
<p>一応、エスケープ用にAirDB.escapeも作ったものの、プリペアードの方が便利な気もするし、大雑把にしか対応させてない。<br />
バイナリセーフとか、JSでどうやってるんだろう。</p>
<p>あと、AIRのSQLStatement.textの中にバックスラッシュ(￥)が入ったSQL文を入れた場合、SQLStatement.textを確認するとバックスラッシュが改行になっちゃうのはなぜなんだろう・・・バグ？（￣□￣；）</p>
<p>おかげで、LIKE文用のワイルドカード（%と_）のエスケープができねぇ。</p>
<p>ものすごくハマった上、解決してないんだけど。<br />
・・・そもそもやり方が間違ってる？</p>
<p>そんなわけなんで、AirDB.escapePatternって関数を今のところ残してるんだけど、まったく役に立ちません！</p>
<p>作っててずーっと思ってたけど、やっぱりSQLStatement周りは、中途半端なのでどうにかしないと。</p>
<pre><code class="color">var select = new $DB.select('table', '*');
  select.where(条件);
  select.or(条件);
  select.order(条件);
  select.param('name', 'value');
  select.query();
</code></pre>
<p>みたいに操作できるように、個別にオブジェクト化しておきたい。</p>
<p>・・・とりあえず、めんどくさいので。<br />
更新する気になったら、大幅に改造するかも・・・くらいの。</p>
<p>ワイルドカードもパラメータ登録にすれば、どうにかなるかしら？</p>
<p>それにしても、思ったよりAIRの解説サイトって少ないね。<br />
最初はもっと流行るかなと思ってたのに。</p>
<p>お世話になったサイト：<br />
<a href="http://www.hakkaku.net/series/api-%e3%81%a7%e8%a6%9a%e3%81%88%e3%82%8b-adobe-air" rel="external">八角研究所  : Series: API で覚える Adobe AIR &laquo;</a><br />
<a href="http://www.atmarkit.co.jp/fwcr/rensai/air02/air02_1.html" rel="external">AIRとSQLiteで学ぶ ローカルDB操作の基本 （1/3） ─ ＠IT</a></p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/04/02/223/" rel="external">GMapをXMLで初期化するjQueryプラグイン「jquery.xmap.js」</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/06/03/324/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>モバゲータウンのフレームワーク「MobaSiF」がオープンソース化</title>
		<link>http://picslog.picsmate.net/2008/05/19/318/</link>
		<comments>http://picslog.picsmate.net/2008/05/19/318/#comments</comments>
		<pubDate>Mon, 19 May 2008 07:09:44 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[WEB開発]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/2008/05/19/318/</guid>
		<description><![CDATA[
モバゲータウンで使用されているフレームワーク「MobaSiF」がDeNAから公開されたようです。
同時期に「TypePadの絵文字アイコン画像と、携帯コンテンツ表示モジュールをフリー（自由）ライセンスで公開」のようなこ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/05/20080519.jpg" rel="lightbox[pics-1211180357]" title="モバゲータウン"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/05/20080519.thumbnail.jpg" width="320" height="240" alt="モバゲータウン" class="imageframe" /></a><br />
<a href="http://www.mbga.jp/" rel="external">モバゲータウン</a>で使用されているフレームワーク「MobaSiF」が<a href="http://www.dena.jp/" rel="external">DeNA</a>から公開されたようです。</p>
<p>同時期に「<a href="http://start.typepad.jp/typecast/" rel="external">TypePadの絵文字アイコン画像と、携帯コンテンツ表示モジュールをフリー（自由）ライセンスで公開</a>」のようなことがあったり、一気に携帯向けのツールがそろいだした感じですね。</p>
<p>どちらもperlベースですが。<br />
<span id="more-318"></span></p>
<p>「MobaSiF」は「SourceForge.JP」で公開されているようです。<br />
<a href="http://sourceforge.jp/projects/moba" rel="external">SourceForge.JP- Project Info &#8211; MobaSiF (Moba-Mobile Simple Framework)</a></p>
<p>とりあえず、特徴としては早いらしい。</p>
<p>組み込まれているテンプレートエンジン「MTemplate」は、「Template Toolkit」よりも22倍早くて、絵文字変換も「Encode::JP::Mobile」より3倍早いらしい。</p>
<p>まだ公開されたばかりなので、資料がなくて、どんな使い方なのかなぁ・・・と思ってたら、SourceForgeからダウンロードした「moba-0.9.0.tar.gz」の中のdocsフォルダの中に、使い方の書いてあるドキュメントが入っています。</p>
<p class="sub">いろいろと書いてありますが、使う前に注意しないといけないところ</p>
<ul>
<li>セキュリティー対策関連のコードは抜いてある</li>
</ul>
<p>とあるので、当然ながらこのフレームワークを使ったからといって、モバゲータウンと同等のセキュリティを確保することができない。</p>
<p>仕様もあるだろうし、必要な対策は各自しろってことですね。</p>
<p class="sub">対応端末</p>
<ul>
<li>docomo : FOMA 90x,70x</li>
<li>au : WIN</li>
<li>softbank : 3GC 型</li>
</ul>
<p>比較的新しい端末ってことですね。</p>
<p>モバイルでネットするユーザがターゲットだから、この辺りは問題なさそう。</p>
<p class="sub">文字コードなど</p>
<ul>
<li>ソース : euc</li>
<li>テンプレ : sjis</li>
<li>DB : sjis</li>
</ul>
<p>文字コードがソースとテンプレで違うのがちょっと気になるけど、無駄に変換するタイミングを増やさない方が安心ってことか。</p>
<p>携帯向けってのが一番大きい理由なんだろうけど。<br />
場合よってはクエリチェックがめんどくさそう。</p>
<p>テンプレートエンジンとかは比較的使いやすそうなので、携帯サイトを作るときは利用してみてもいいかもしれない。<br />
とりあえず、もう少し運用サイトが出てくるまで待ってみて、反応を見たいところ。</p>
<p>なんにしても実績のある企業から、フレームワークをオープンソースとして出してくれるのはありがたい。</p>
<p>また時間があれば、じっくり中身を覗いてみよう。</p>
<p>関連情報：<br />
<a href="http://codezine.jp/a/article/aid/2528.aspx" rel="external">【YAPC&#8211;Asia 2008】モバゲータウンのフレームワーク「MobaSiF」公開：CodeZine</a><br />
<a href="http://builder.japan.zdnet.com/news/story/0,3800079086,20373375,00.htm" rel="external">DeNA、「モバゲー」のウェブアプリフレームワークをオープンソースとして公開 &#8211; builder by ZDNet Japan</a></p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/05/14/299/">YouTubeを簡単に表示できるwordpressプラグイン「EasyTube」</a><br />
<a href="http://picslog.picsmate.net/2008/05/02/298/">CSSとテキストを駆使して描画された「ザ・シンプソンズ」のホーマー</a><br />
<a href="http://picslog.picsmate.net/2008/04/02/223/">GMapをXMLで初期化するjQueryプラグイン「jquery.xmap.js」</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/05/19/318/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GMapをXMLで初期化するjQueryプラグイン「jquery.xmap.js」</title>
		<link>http://picslog.picsmate.net/2008/04/02/223/</link>
		<comments>http://picslog.picsmate.net/2008/04/02/223/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 01:39:53 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[WEB開発]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/2008/04/02/223/</guid>
		<description><![CDATA[
GMapを使うのって結構、設定が結構めんどくさかったりするんですよね。
なんで表示用の設定を書き込んだXMLを読み込むだけで、GMapを初期化できるjQuery用のプラグインを作ってみました。
開発をしやすいようにjQ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/2008/04/20080402.jpg" rel="lightbox[pics-1207084029]" title="jquery.xmap.js デモ"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/2008/04/20080402.thumbnail.jpg" width="320" height="240" alt="jquery.xmap.js デモ" class="imageframe" /></a></p>
<p>GMapを使うのって結構、設定が結構めんどくさかったりするんですよね。</p>
<p>なんで表示用の設定を書き込んだXMLを読み込むだけで、GMapを初期化できるjQuery用のプラグインを作ってみました。</p>
<p>開発をしやすいようにjQueryを使っただけなので、それほどjQueryの恩恵は感じられないプラグインですが・・・(^^;<br />
まぁ、GMapの設定を簡単にするためのものなんで・・・(^^;;;<br />
<span id="more-223"></span></p>
<p class="sub">XMapでできること</p>
<p>XMLファイルを使って、簡単にGMapが初期化できます。</p>
<p>具体的には、以下がXMLで設定できます。</p>
<ul>
<li>GMap座標の設定とマップ中央に表示し続けるアイコンを設定</li>
<li>表示するGMapコントローラーの設定</li>
<li>アイコンとマーカーの表示設定</li>
</ul>
<p>以下、jquery.xmap.jsを使ったデモページです。<br />
<a href="http://picsmate.net/sample/xmap/">デモページ</a></p>
<p class="sub">まず、jQueryとxmapを準備する。</p>
<p>使うためにですが、まず<a href="http://jquery.com/" rel="external">jQuery本家</a>で、jQueryをダウンロードしてきます。<br />
<a href="http://code.jquery.com/jquery-latest.js" rel="external">最新版のjQuery</a>(<a href="http://jquery.com/src/jquery-latest.pack.js" rel="external">Packed版</a>)</p>
<p>次に、<strong>jquery.xmap.js</strong>をダウンロードします。<br />
<a href="http://picsmate.net/sample/xmap/jquery.xmap.zip">ダウンロード</a><br />
（ZIP圧縮していますので、ダウンロード後、解凍してお使いください。）</p>
<p>あと当然ながら、<strong>GMap</strong>を利用しますので、利用登録をする必要があります。<br />
<a href="http://code.google.com/intl/ja/apis/maps/index.html" rel="external">Google マップ API</a>のサイトからGoogleアカウントを使って、APIキーを取得する必要があります。<br />
<a href="http://code.google.com/intl/ja/apis/maps/signup.html" rel="external">Google マップ API 登録ページ</a></p>
<p>この３つが揃ったら、後は簡単。<br />
設定用のXMLと、ほんの少しスクリプトを書くだけです。</p>
<p class="sub">GMapやjQueryをページに読み込む。</p>
<pre><code class="color">&lt;script src=&quot;http://maps.google.com/maps?file=api&amp;amp;v=2&amp;amp;key=[API Key]&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery-latest.js&quot; charset=&quot;shift_jis&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.xmap.js&quot;&gt;&lt;/script&gt;
</code></pre>
<p>のような感じで、GMapを利用するページでJSファイルを読み込む。</p>
<p class="sub">XMapを開始するためのJSスクリプトをページに書く</p>
<p>本当は先に設定ファイルの書き方を説明するべきだけど、スクリプトの方が簡単で短くすみそうなので、とりあえずこっちから説明します。</p>
<pre><code class="color">&lt;div id=&quot;map&quot;&gt;
    ここにGMapを表示する予定。
&lt;/div&gt;</code></pre>
<p>みたいな「map」っていうIDのDIVタグ内に、「setting.xml」というXMLファイルで初期化した、GMapを表示させる場合を想定して、スクリプトを書くとこうなる。</p>
<pre><code class="color">&lt;script type=&quot;text/javascript&quot;&gt;
    jQuery(function() { jQuery(&quot;#map&quot;).XMap(&quot;setting.xml&quot;); });
&lt;/script&gt;</code></pre>
<p>これだけ。</p>
<p>「map」っていうIDだったので、jQuery(&#8220;#map&#8221;)と書いてるけど、「map」っていうclassの場合はもちろんjQuery(&#8220;.map&#8221;)のようになる。<br />
（ただし、IDやclassに一致するすべての要素に対して、GMapを挿入する仕様）</p>
<p>XMap()には設定ファイルとなるXMLのパスを渡すだけです。</p>
<p class="sub">GMapの設定用XMLを書く</p>
<p>まずは、設定できるすべての項目を書いたXMLだと以下のような感じになります。</p>
<pre style="height:300px"><code class="color">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;data&gt;
    &lt;show&gt;
        &lt;center lat=&quot;34.701909&quot; lng=&quot;135.494977&quot; zoom=&quot;16&quot; address=&quot;大阪駅&quot;&gt;
            &lt;img src=&quot;./module/center.png&quot; width=&quot;30&quot; height=&quot;30&quot; /&gt;
            &lt;shadow src=&quot;./module/center-shadow.png&quot; width=&quot;30&quot; height=&quot;30&quot; /&gt;
        &lt;/center&gt;
        &lt;control&gt;
            &lt;large value=&quot;true&quot; /&gt;
            &lt;small value=&quot;false&quot; /&gt;
            &lt;zoom value=&quot;false&quot; /&gt;
            &lt;type value=&quot;true&quot; /&gt;
            &lt;overview value=&quot;true&quot; /&gt;
            &lt;scale value=&quot;true&quot; /&gt;
        &lt;/control&gt;
        &lt;option&gt;
            &lt;wheelZoom value=&quot;true&quot; /&gt;
        &lt;/option&gt;
    &lt;/show&gt;
    &lt;icons&gt;
        &lt;icon name=&quot;icon-1&quot;&gt;
            &lt;img src=&quot;./module/icon-1.png&quot; width=&quot;18&quot; height=&quot;30&quot; /&gt;
            &lt;shadow src=&quot;./module/shadow-1.png &quot; width=&quot;34&quot; height=&quot;30&quot; /&gt;
        &lt;/icon&gt;
        &lt;icon name=&quot;icon-2&quot;&gt;
            &lt;img src=&quot;./module/icon-2.png&quot; width=&quot;18&quot; height=&quot;30&quot; /&gt;
        &lt;/icon&gt;
    &lt;/icons&gt;
    &lt;markers&gt;
        &lt;marker name=&quot;marker-1&quot; lat=&quot;34.701909&quot; lng=&quot;135.494977&quot; address=&quot;大阪駅&quot;&gt;
            &lt;option&gt;
                &lt;icon name=&quot;icon-1&quot; /&gt;
                &lt;drag value=&quot;true&quot; /&gt;
                &lt;title&gt;大阪駅&lt;/title&gt;
            &lt;/option&gt;
            &lt;html&gt;
                &amp;lt;h3 style=&quot;color:red&quot;&amp;gt;icon sample1&amp;lt;/h3&amp;gt;
                &amp;lt;ul&amp;gt;
                    &amp;lt;li&amp;gt;list1&amp;lt;/li&amp;gt;
                    &amp;lt;li&amp;gt;list2&amp;lt;/li&amp;gt;
                    &amp;lt;li&amp;gt;list3&amp;lt;/li&amp;gt;
                &amp;lt;/ul&amp;gt;
            &lt;/html&gt;
        &lt;/marker&gt;
        &lt;marker name=&quot;marker-2&quot; address=&quot;大阪府高津&quot;&gt;
            &lt;option&gt;
                &lt;icon name=&quot;icon-2&quot; /&gt;
                &lt;title&gt;大阪府高津&lt;/title&gt;
            &lt;/option&gt;
        &lt;/marker&gt;
    &lt;/markers&gt;
&lt;/data&gt;
</code></pre>
<p>そこそこ設定できるようにしているので、割とややこしく見えるかもしれないですが、順に説明します。</p>
<p>とりあえずXML宣言部分と、一番外のdataタグは説明を省きますが、利用する場合はこういうものだと割り切って記述するようにしてください(^^;</p>
<p>dataタグ内は大きく分類すると、show要素、icons要素、markers要素と３つに分かれています。<br />
全部一度だとわかりにくいと思うので、３つの要素を以下で順に説明します。</p>
<p class="sub">show要素内の設定について</p>
<p>「show」要素内はGmapの表示位置やコントローラーの表示など、GMapの基本的な表示に関する設定です。</p>
<p>「show」要素内の「center」要素は、GMapで表示する中心座標やズームレベルなどを設定します。</p>
<pre><code class="color">&lt;center lat=&quot;緯度&quot; lng=&quot;経度&quot; zoom=&quot;GMapのズームレベル&quot; address=&quot;地図の中心座標を住所や駅名から検索&quot;&gt;
    &lt;img src=&quot;地図の中心に表示するアイコン画像を指定&quot; width=&quot;画像の横サイズ（数値）&quot; height=&quot;画像の縦サイズ（数値）&quot; /&gt;
    &lt;shadow src=&quot;アイコンの影画像を指定&quot; width=&quot;画像の横サイズ（数値）&quot; height=&quot;画像の縦サイズ（数値）&quot; /&gt;
&lt;/center&gt;
</code></pre>
<p>中身の設定はざっとこんな感じです。</p>
<p>「center」タグ内の「address」に住所などを書くと便利ですが、見つからない場合や、検索まで時間がかかるときがあるので、緯度や経度も設定して置く方が無難です。</p>
<p>もし、緯度や経度を設定していない場合で、検索した住所の座標が見つからなかった場合は、GMapの登録を済ませたときに参考ソースでもらえる座標が、デフォルトとして適用されるようにしているので、アメリカの地図が出ます。</p>
<p>ズームレベルは「0～19」までの数値を入れてください。設定しなかった場合は、デフォルトとして「13」に設定されます。<br />
「0」に近づくほど地図をひいて（0は世界地図のようになる）、「19」に近づくほど寄っていきます。</p>
<p>「center」内にあるimgタグとshadowタグは、地図の中央にアイコンを表示する場合のみ記述します。<br />
中央にアイコンを表示したいときだけなので、「img」と「shadow」いずれか、もしくは両方のタグは省略可能です。</p>
<p>「show」要素内の「control」要素は、GMapを操作する各コントローラーを表示するかどうかを設定できます。</p>
<pre><code class="color">&lt;control&gt;
    &lt;large value=&quot;ここにtrueを書いた場合、GMapに大きいコントローラー（GLargeMapControl）を表示する&quot; /&gt;
    &lt;small value=&quot;ここにtrueを書いた場合、GMapに小さいコントローラー（GSmallMapControl）を表示する&quot; /&gt;
    &lt;zoom value=&quot;ここにtrueを書いた場合、GMapにズームのみのコントローラー（GSmallZoomControl）を表示する&quot; /&gt;
    &lt;type value=&quot;ここにtrueを書いた場合、GMapにマップ切り替え用のコントローラー（GMapTypeControl）を表示する&quot; /&gt;
    &lt;overview value=&quot;ここにtrueを書いた場合、GMapにオーバービューコントローラー（GOverviewMapControl）を表示する&quot; /&gt;
    &lt;scale value=&quot;ここにtrueを書いた場合、GMapにスケールコントローラー（GScaleControl）を表示する&quot; /&gt;
&lt;/control&gt;
</code></pre>
<p>説明するより、試してもらった方が早い気もしますが、１点だけ。</p>
<p>表示する場合はコントローラー用のタグの「value」の値を「true」にして記述する必要がありますが、非表示の場合はタグ自体を省略してもいいです。</p>
<p>「show」要素内の「option」要素は、XMapによる拡張機能です。</p>
<pre><code class="color">&lt;option&gt;
    &lt;wheelZoom value=&quot;ここにtrueを書いた場合、GMapをマウスホイールでズームレベルを操作できるようにする&quot; /&gt;
&lt;/option&gt;
</code></pre>
<p>拡張といっても、今のところマウスホイールによるズーム操作しかありません。</p>
<p>さらに実験的なものなので、もしかしたら不具合があるかもです。</p>
<p>不要な場合は「option」タグごと省略可能です。</p>
<p class="sub">iconsタグ内の設定について</p>
<p>「icons」要素内は、GMapで利用するアイコンを作成するための設定です。</p>
<p>独自アイコンを使用しない場合は、中の「icon」要素ごと「icons」タグを省略することができます。</p>
<pre><code class="color">&lt;icon name=&quot;アイコンの名前&quot;&gt;
    &lt;img src=&quot;アイコンに使用する画像のパス&quot; width=&quot;画像の横サイズ（数値）&quot; height=&quot;画像の縦サイズ（数値）&quot; /&gt;
    &lt;shadow src=&quot;アイコンの影に使用する画像のパス&quot; width=&quot;画像の横サイズ（数値）&quot; height=&quot;画像の縦サイズ（数値）&quot; /&gt;
&lt;/icon&gt;
</code></pre>
<p>「icons」タグ内で「icon」タグを繰り返し記述することで、複数のアイコンを作成することができます。</p>
<p>次の「marker」要素で、作成したアイコンを利用してGMapにアイコンを表示することができます。</p>
<p>作成したアイコンは、以下のようにスクリプトを書くと取得できます。</p>
<pre><code class="color">//すべてのアイコンを取得
var icons = jQuery('#map').XMap().$getIcon();
//アイコンを指定して取得
var icon = jQuery('#map').XMap().$getIcon('アイコンの名前');
</code></pre>
<p class="sub">markersタグ内の設定について</p>
<p>「markers」要素内は、GMapにアイコンを設置するための設定です。</p>
<p>各「marker」要素で設定した座標にアイコンを表示します。</p>
<p>GMapにアイコンを設置しない場合は、「markers」要素ごと省略が可能です。</p>
<pre><code class="color">&lt;marker name=&quot;マーカーの名前&quot; lat=&quot;緯度&quot; lng=&quot;経度&quot; address=&quot;表示する住所や駅名を指定&quot;&gt;
    &lt;option&gt;
        &lt;icon name=&quot;icons内で作成したアイコンの名前&quot; /&gt;
        &lt;drag value=&quot;ここにtrueを書いた場合、アイコンをドラッグ＆ドロップで移動できるようになる&quot; /&gt;
        &lt;title&gt;アイコンの上にマウスが来たときに、ここに書いた文字がツールチップとして表示させる&lt;/title&gt;
    &lt;/option&gt;
    &lt;html&gt;
        アイコンをクリックしたときに吹き出しが出るようになる。
        （HTMLタグが利用できるけど、「&lt;」は「&amp;lt;」に、「&gt;」は「&amp;gt;」に、「&amp;」は「&amp;amp;」に変換する必要がある）
    &lt;/html&gt;
&lt;/marker&gt;;
</code></pre>
<p>「icons」タグと同じく、「markers」タグ内で「marker」タグを繰り返し記述することで、複数のアイコンを作成することができます。</p>
<p>「marker」要素の「lat」や「lng」、「address」などの使い方は、GMapの中心を決めるために指定した「center」要素の時と基本的に同じです。</p>
<p>ちょっとだけ違うのは、「lat」、「lng」を指定せずに「address」を指定した場合、検索した住所の座標が見つからないと、GMapにアイコンを追加しません。</p>
<p>アイコンの表示が必須の場合は、検索よりも緯度や経度を直接設定する方が確実ということです。</p>
<p>「marker」要素内の「option」で表示するアイコンなどの細かな設定が行えます。<br />
アイコンの設定が不要な場合は省略可能です。</p>
<p>「option」要素の「icon」は、「icons」要素内で作成したアイコンの名前を指定することで、表示するアイコンに独自に作成したアイコンを使用できます。</p>
<p>「option」要素の「drag」は、「value」に「true」を記述することで、配置したアイコンをドラッグ＆ドロップで移動させることができるようになります。</p>
<p>「option」要素の「title」は、アイコンにマウスが乗ったときに、ツールチップを表示させる文章を記述します。<br />
「title」にはHTMLタグは利用できません。</p>
<p>「option」要素内の「icon」、「drag」、「title」の各要素も省略可能です。</p>
<p>「marker」要素内の「html」を設定すると、アイコンのクリック時に噴出しを表示することができます。<br />
HTMLタグが利用できるので、「option」要素の「title」で指定したツールチップよりも、詳細な情報を表示させることができます。</p>
<p>「html」要素も省略することができます。</p>
<p>作成したマーカーは、以下のようにスクリプトを書くと取得できます。</p>
<pre><code class="color">//すべてのマーカーを取得
var markers = jQuery('#map').XMap().$getMarker();
//マーカーを指定して取得
var marker = jQuery('#map').XMap().$getMarker('マーカーの名前');
</code></pre>
<p class="sub">その他</p>
<p>後でGMapオブジェクトを利用したいときは、以下のようにスクリプトを書くと取得できます。</p>
<pre><code class="color">var gmap = jQuery('#map')._GMap2();
</code></pre>
<p>実際、jQuery(&#8216;#map&#8217;)で一番最初に見つかったエレメントに対するGMapオブジェクトを返すので、適用したGMapオブジェクトが複数ある場合には</p>
<pre><code class="color">var gmaps = [];
jQuery('.map').each(function(i)
{
    gmaps[i] = jQuery(this)._GMap2();
});
</code></pre>
<p>のようにするといいかも。</p>
<p>GClientGeocoderを利用する場合は、</p>
<pre><code class="color">var geo = jQuery("#map")._Geo();
geo.getLatLng(text, function(){});
</code></pre>
<p>のように利用することもできます。</p>
<p>いまのところ、Geocoderはオブジェクト毎に作ってしまうので、ここは修正しないといけないかな・・・。</p>
<p>最後に、GMapのコントロールの表示／非表示を切り替える（表示されている場合は非表示に、非表示の場合は表示する）関数をXMap内に持たせていますので、利用いただける場合は、利用してください。</p>
<pre><code class="color">//大きいコントロールの表示切替
jQuery("#map").XMap().$switchControl('large');
//大きいコントロールとスケールの表示切替
jQuery("#map").XMap().$switchControl(['large','scale']);
</code></pre>
<p class="sub">最後に</p>
<p>一応、ライセンスについてはjQueryに合わせてGPLライセンスとします。</p>
<p>このスクリプトを利用して発生した損害につきまして、一切責任は負いません。<br />
いつもどおり、自己責任でお使いください。</p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2008/01/07/174/">UTF-8以外の文字コードで作成したページでGmapを利用する</a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/04/02/223/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpの文字、数値の比較関連、実行結果をずらっと一覧にした。</title>
		<link>http://picslog.picsmate.net/2008/03/07/206/</link>
		<comments>http://picslog.picsmate.net/2008/03/07/206/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 13:57:41 +0000</pubDate>
		<dc:creator>Mizugame</dc:creator>
				<category><![CDATA[WEB開発]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[メモ]]></category>

		<guid isPermaLink="false">http://picslog.picsmate.net/2008/03/07/206/</guid>
		<description><![CDATA[
字列や数値の比較で検索して、このサイトへ来られる方が多いんですね。
説明ベタなために、非常に読みにくくて申し訳ないので、実行した時の結果を一覧・・・でもないけどずらっと並べてみました。
多少、説明も入れたけど・・・。
 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://picslog.picsmate.net/wp/wp-content/uploads/20080307.jpg" rel="lightbox[pics-1204897340]" title="20080307.jpg"><img src="http://picslog.picsmate.net/wp/wp-content/uploads/20080307.thumbnail.jpg" width="329" height="239" alt="20080307.jpg" class="imageframe" /></a><br />
字列や数値の比較で検索して、このサイトへ来られる方が多いんですね。<br />
説明ベタなために、非常に読みにくくて申し訳ないので、実行した時の結果を一覧・・・でもないけどずらっと並べてみました。</p>
<p>多少、説明も入れたけど・・・。<br />
<span id="more-206"></span></p>
<p>以下、実行内容と結果いろいろ（「//～」のコメント部分が実行結果）</p>
<p class="sub">通常の比較（==）を使った場合。</p>
<pre><code class="color">var_dump('string' == 0); // bool(true)
var_dump('string' == '0'); // bool(false)
var_dump('string' == 1); // bool(false)
var_dump('string' == '1'); // bool(false)
var_dump('1string' == 1); // bool(true)
var_dump('1string' == '1'); // bool(false)
</code></pre>
<p>通常の比較だとどちらか一方に数値が入ると、強制的にもう一方の値もint型にキャストされます。<br />
文字列は0、もしくは先頭から連続している数値になる。<br />
結果が「ture」になっているものが想定外。</p>
<p class="sub">通常の比較（==）を使って、ちょっと意地悪をしてみる。</p>
<pre><code class="color">var_dump('string' == -1); // bool(false)
var_dump('string' == '-1'); // bool(false)
var_dump('-1string' == -1); // bool(true)
var_dump('-1string' == '-1'); // bool(false)
</code></pre>
<p>「-1」など負の数値と比較する場合、文字列の先頭に「-」が付いていると負の数値に変換されるため、たまに結果がおかしくなる。<br />
これも「ture」になっているものは想定外。</p>
<p class="sub">同型比較（===）を使った場合。</p>
<pre><code class="color">var_dump('string' === 0); // bool(false)
var_dump('string' === '0'); // bool(false)
var_dump('string' === 1); // bool(false)
var_dump('string' === '1'); // bool(false)
var_dump('1string' === 1); // bool(false)
var_dump('1string' === '1'); // bool(false)
</code></pre>
<p>同型比較を使うと自動的に方変換を行わなくなるので、比較結果は意図した通りになる。</p>
<p class="sub">同型比較（===）では、意地悪できない。</p>
<pre><code class="color">var_dump('string' === -1); // bool(false)
var_dump('string' === '-1'); // bool(false)
var_dump('-1string' === -1); // bool(false)
var_dump('-1string' === '-1'); // bool(false)
</code></pre>
<p>型変換が行われないので、ちょっと値に変化をつけてみても、当然正常に比較される。</p>
<p class="sub">strcmp関数（文字列の比較）を使った場合。</p>
<pre><code class="color">var_dump(0 == strcmp('string', 0)); // bool(false)
var_dump(0 == strcmp('string', '0')); // bool(false)
var_dump(0 == strcmp('string', 1)); // bool(false)
var_dump(0 == strcmp('string', '1')); // bool(false)
</code></pre>
<p>strcmp()は文字列を比較する関数なので、両方の値を文字列にキャストする。<br />
一方の値が数値であっても、数値は文字列に変換されるので「string」が「0」になったり、「1string」が「1」になるような事はないので、結果は正常。<br />
（strcmpは比較した文字列の大きさを返すので、0を返した場合に同一の値と判断する。<br />
なので、同じ値であることを確認する場合は「0==strcmp(A,B)」などのように書く）</p>
<p class="sub">strcmp関数（文字列の比較）に論理型 (boolean)を入れてみた場合。</p>
<pre><code class="color">var_dump(0 == strcmp(0, false)); // bool(false)
var_dump(0 == strcmp(0, true)); // bool(false)
var_dump(0 == strcmp(1, false)); // bool(false)
var_dump(0 == strcmp(1, true)); // bool(true)
</code></pre>
<p>論理型が文字列にキャストされるため、結果はちょっとおかしくなる。<br />
でも、外部から論理型の値が来ることはないだろうから、プログラマサイドで解決できる問題かな。<br />
（falseはint型に変換すると「0」で、文字列にすると空文字「&#8221;"」）</p>
<p>やはり4番目の「ture」になっているものが想定外だが、もともと文字列を比較する関数だから仕方がない。</p>
<p class="sub">オーバーフローする値の数値文字列の比較。</p>
<pre><code class="color">var_dump('11111111111111111' == '11111111111111112'); // bool(true)
var_dump('11111111111111111' === '11111111111111112'); // bool(false)
var_dump(0 == strcmp('11111111111111111', '11111111111111112')); // bool(false)
</code></pre>
<p>通常の比較（==）の場合、どっちも文字列っぽいけど、キャストが行われるので注意。<br />
なので、1つ目の結果が「ture」になっているものは想定外。</p>
<p>文字列の比較はできるだけstrcmp関数を使えってことですね。</p>
<p class="sub">キャストによる値の変化。</p>
<pre style="height:300px"><code class="color">// NULL
$value = null;
var_dump(
    (int)$value, // int(0)
    (string)$value, // string(0) ""
    (float)$value // float(0)
);
// 論理型
$value = false;
var_dump(
    (int)$value, // int(0)
    (string)$value, // string(0) ""
    (float)$value // float(0)
);
$value = true;
var_dump(
    (int)$value, // int(1)
    (string)$value, // string(1) "1"
    (float)$value // float(1)
);
// 文字列
$value = 'string';
var_dump(
    (int)$value, // int(0)
    (string)$value, // string(6) "string"
    (float)$value // float(0)
);
$value = '1string';
var_dump(
    (int)$value, // int(1)
    (string)$value, // string(7) "1string"
    (float)$value // float(1)
);
$value = '-1string';
var_dump(
    (int)$value, // int(-1)
    (string)$value, // string(7) "-1string"
    (float)$value // float(-1)
);
</code></pre>
<p class="sub">論理型への型変換。</p>
<pre><code class="color">var_dump(
    (boolean)0, // bool(false)
    (boolean)1, // bool(true)
    (boolean)-1, // bool(true)
    (boolean)null, // bool(false)
    (boolean)"", // bool(false)
    (boolean)" ", // bool(true)
    (boolean)'string', // bool(true)
    (boolean)'string', // bool(true)
);
</code></pre>
<p class="sub">数値型ではオーバフローする値の文字列の型変換</p>
<pre><code class="color">$value = '11111111111111111';
var_dump(
    $value, // string(17) "11111111111111111"
    (int)$value, // int(2147483647)
    (float)$value // float(1.11111111111E+16)
);
$value = '11111111111111112';
var_dump(
    $value, // string(17) "1111111111111112"
    (int)$value, // int(2147483647)
    (float)$value // float(1.11111111111E+16)
);
</code></pre>
<p>型変換が加わると、「11111111111111111」も「11111111111111112」も値が詰められるので、同じ内容になってしまいます。</p>
<p class="sub">ついでに、ちょっと危うそうな事例</p>
<p>in_array関数を使って配列の中に値が存在するか確かめる。</p>
<pre><code class="color">$value = 'string';
$array = array(0, 1, 2);
var_dump(in_array($value, $array)); // bool(true)
</code></pre>
<p>え、配列もやばいんだ・・・。</p>
<p>in_arrayはあんまり使ったことがないんだけど、これも問題あるんだね。<br />
もちろんarray_searchも一緒！<br />
（これもやっぱり仕様です。）</p>
<pre><code class="color">// 配列に最初から文字列を入れようか。
$value = 'string';
$array = array('0', '1', '2');
var_dump(in_array($value, $array)); // bool(false)
// もしくは検索前に文字列に戻す。
$value = 'string';
$array = array(0, 1, 2);
var_dump(in_array($value, array_map('strval', $array))); // bool(false)
</code></pre>
<p>ここまでしないととダメ？</p>
<p>と、大体こんなものだろうか？<br />
前回の記事見たく、ぐだぐだ書いているよりはわかりやすい気もするんだけど・・・。</p>
<p>内容に補足や誤りがあれば、ぜひコメントください。</p>
<p>気を抜いたら、ちょっとまずいプログラムになりそうだけど・・・。<br />
それでも大好きですよ！PHP！(>▽< )ノ</p>
<p>PHP6からマルチバイトが標準化されるんだっけ？<br />
今回の記事にまったく関係ないけど(^^;</p>
<p>参考情報：<br />
<a href="http://php.benscom.com/manual/ja/types.comparisons.php" rel="external">PHP- PHP 型の比較表 &#8211; Manual　</p>
<p>関連記事：<br />
<a href="http://picslog.picsmate.net/2007/09/13/131/">[続] PHPで文字列比較を行う場合の注意と、一応数値も抑えておいたほうが・・・</a><br />
<a href="http://picslog.picsmate.net/2007/08/25/106/">PHPで文字列の比較を行う場合の注意 </a></p>
]]></content:encoded>
			<wfw:commentRss>http://picslog.picsmate.net/2008/03/07/206/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
