<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>S-MEMO（エスメモ）</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/" />
    <link rel="self" type="application/atom+xml" href="http://www.s-memo.net/blog/atom.xml" />
   <id>tag:www.s-memo.net,2008:/blog//3</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3" title="S-MEMO（エスメモ）" />
    <updated>2007-05-29T22:13:38Z</updated>
    <subtitle>WEB技術に関する情報ブログ</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type  3.2-ja-2</generator>
 
<entry>
    <title>web creators 7月号が発売されました</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/05/web_creators_7_1.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=41" title="web creators 7月号が発売されました" />
    <id>tag:www.s-memo.net,2007:/blog//3.41</id>
    
    <published>2007-05-29T21:43:34Z</published>
    <updated>2007-05-29T22:13:38Z</updated>
    
    <summary> 大変ありがたいことに株式会社エイチツーオー・スペース様のご協力の下、web c...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="メモ帳" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        <![CDATA[<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=smemo07-22&o=9&p=8&l=as1&asins=B000QGE9BO&fc1=000000&IS2=1&lt1=_blank&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px; padding:10px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" align="right"></iframe>

大変ありがたいことに<a href="http://h2o-space.com/" target="_blank">株式会社エイチツーオー・スペース</a>様のご協力の下、web creators 7月号に執筆させて頂きました。
私が担当させて頂いた部分はガジェット・ウィジェット特集のYahoo!ウィジェット「CPUチェッカー」「インターネット写真立て」の２つです。CPUチェッカーはCPU使用率をリアルタイムで表示するというオードソックスなウィジェット制作方法を紹介しています。インターネット写真立てはWeb上にある写真をウィジェットで表示させる方法を紹介しています。
Yahoo!ウィジェット以外にもVistaのサイドバーガジェットやGoogleガジェット等の紹介もしているので、ウィジェットやガジェットに興味のある方は買って損はないです。
是非、参考にしてみてください。全国書店やAmazonで購入できます。

余談）以前（2月号）にも執筆させて頂いたのですが、書き忘れてました。。。



]]>
        
    </content>
</entry>
<entry>
    <title>WindowsでApolloをインストールしてみよう（開発環境を作ってみよう）</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/04/apollo.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=40" title="WindowsでApolloをインストールしてみよう（開発環境を作ってみよう）" />
    <id>tag:www.s-memo.net,2007:/blog//3.40</id>
    
    <published>2007-04-13T16:10:13Z</published>
    <updated>2007-04-13T16:24:03Z</updated>
    
    <summary>GoogleガジェットやYahooウィジェットの勉強をしているのですが、もう一つ...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="ガジェット・ウィジェット" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        GoogleガジェットやYahooウィジェットの勉強をしているのですが、もう一つ興味があるのはApollo。いろいろな噂があったものの不明な点も多数ありましたが、遂に2007年3月19日にApolloのAlpha版がリリースされました。Apolloの情報を見てみると色々なことができるので私も含めてプログラマーの方々は興味津々だと思います。
HTML版ではテキスト入力で日本語が使えないなどまだまだこれからかなぁっと感じますが、FlashやPDFとの連携ができるみたいなのでこれからが楽しみです。
ということで、今日はApolloのインストール（開発環境の作り方）を紹介します。

        <![CDATA[「Adobe Labs」から必要なデータをダウンロードします。（ダウンロードする為にはメンバー登録が必要です）

・<a href="http://labs.adobe.com/wiki/index.php/Apollo" target="_blank">Adobe Labs（英語）</a>
上記のURLに移動して、「Downloads」の「now available to download」リンクをクリックすると、ログインページが表示されますのでアカウントを持っている方はログインをしてください。アカウントを持っていない方は、「No, I will create one now. 」のラジオボタンを選択してメンバー登録を行ってください。
私もそうでしたが、アカウントを持っていない方はダウンロードページに移動するまで以外と大変だったりします＾＾；
Apolloのダウンロードページの内容を軽く紹介します。
<blockquote><strong>・Apollo SDK</strong>
　テキストエディタ等で作ったApolloスクリプトをApollo用の「air」ファイルに変換する機能です。（今回はこれのインストールに関して紹介します）
<strong>・Apollo Runtime</strong>
　Apolloを動かす為のソフトウェアです。FlashでいうFlash Playerのようなものです。
　Apollo Runtimeをインストールすると、拡張子が「air」のファイルをApolloとして認識してくれるようになります。
<strong>・Documentations and Samples</strong>
　Apolloを作る為のドキュメントやサンプルプログラムをダウンロードできます。
　英語ですが、一通り読めば基本的なことは分かります。
<strong>・Apollo Extension for Adobe Flex Builder 2.0.1</strong>
　Apollo用のFlex Bulider 2版だと思います。（まだインストールしていません＾＾；）
　Flex Bulider 2はEclipseをベースとしたFlex2の総合開発環境です。</blockquote>
全くApolloを使ったことのない方は、「Apollo Runtime」をインストールしてサンプル等を動かしてみてください。何となくApolloが分かってくると思います。
以下のURLからサンプルをインストールできます。拡張子「.air」のリンクをクリックすると、各アプリケーションのインストール画面が出てきますので指示に従ってインストールをしてください。
<a href="http://labs.adobe.com/wiki/index.php/Apollo:Applications:Samples" target="_blank">Apollo:Applications:Samples</a>

前置きが非常に長くなりましたがそろそろ本題のApollo SDKを自分のPCにインストールする方法を紹介します。
HTML版のみをインストールする場合、以下の手順でインストールします。

<strong>１．</strong>「Apollo Labs」から「Apollo SDK」の圧縮ファイルをダウンロードします。

<strong>２．</strong>ダウンロードした圧縮ファイルを解凍します。解凍したディレクトリは以下のようなディレクトリ構造になります。
<blockquote>apollo_sdk_alpha1_031907
	├─bin
	├─frameworks
	├─lib
	├─runtime
	├─samples
	└─src</blockquote>
<strong>３．</strong>「C:\ApolloSDK」空ディレクトリを作ります。

<strong>４．</strong>「C:\ApolloSDK」直下に解凍したファイルを以下のように設置します。
<blockquote>C:\ApolloSDK
	├─bin
	├─frameworks
	├─lib
	├─runtime
	├─samples
	└─src</blockquote>
<strong>５．</strong>次にパスを通します。まずは「マイコンピュータ」を右クリックして「プロパティ」を選択します。

<strong>６．</strong>「詳細設定」の「環境変数」をクリックします。

<strong>７．</strong>「システム環境変数」内にある「Path」をクリックして「編集」ボタンをクリックします。

<strong>８．</strong>別ウィンドウ内の「変数値」の一番後ろに「C:\ApolloSDK\bin\;」を追加します。追加をしたら「OK」ボタンをクリックします。
「変数値」に「C:\java\bin\」と記述されている場合は「C:\java\bin\;C:\ApolloSDK\bin\;」としてください。
<blockquote>C:\java\bin\;
　↓
C:\java\bin\;<font color="#FF0000">C:\ApolloSDK\bin\;</font></blockquote>

<strong>９．</strong>「スタート」→「プログラム」→「アクセサリ」→「コマンド　プロンプト」でコマンドプロンプトを起動します。
「スタート」→「ファイル名を指定して実行」→名前に「cmd」→「OK」でも起動可能です。

<strong>１０．</strong>コマンドプロンプトで「adt」と記述してEnterを押します。
<blockquote>C:\> adt</blockquote>
以下のメッセージが表示されればインストール成功です。
<blockquote>Too few arguments.
Usage: adt -package air_file app_xml [ file_or_dir | -C dir file_or_dir ... ] ...</blockquote>

Flex2も使いたい場合、まずは「Flex 2 SDK」をインストールします。
「Flex 2 SDK」のインストールに関しては以下のサイトをご参照ください。

<a href="http://www.adobe.com/support/documentation/jp/flex/2/install.html#installingflex2sdk" target="_blank">Flex 2 SDKのインストール方法</a>

Flex 2 SDKをインストールした後はHTML版のインストールとほとんど同じです。
Flex 2 SDKを「C:\flex2SDK」にインストールしていた場合、「Apollo SDK」を「C:\flex2SDK」に上書きすればインストールできます。

インストールが完了したところで早速Apolloでアプリケーションを作りたいとこですが、今日はここまで。次回はApollo（HTML版）の作り方を紹介しようと思います。]]>
    </content>
</entry>
<entry>
    <title>PEAR::Mail_Mimeを使ってHTMLメールを送ってみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/pearmail_mimehtml.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=39" title="PEAR::Mail_Mimeを使ってHTMLメールを送ってみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.39</id>
    
    <published>2007-03-25T07:50:45Z</published>
    <updated>2007-03-25T07:58:54Z</updated>
    
    <summary>前回「PEAR::Mailを使ってメールを送信してみよう」でメールの送信について...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="PHP - PEAR" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        <![CDATA[前回「<a href="http://www.s-memo.net/blog/2007/03/pearmail_1.php">PEAR::Mailを使ってメールを送信してみよう</a>」でメールの送信について紹介しました。これだけでも結構助かるのですが、便利になると更に欲が出るもので「ファイルを添付したメールを送信できないか？」「HTMLメールを簡単に作れないか？」などを考えます。そんなときにPEAR::MailをサポートしてくれるPEAR::Mail_Mimeという便利な拡張機能があります。
PEAR::Mail_Mimeは添付メールやHTMLメールを簡単に実現できます。
今日はPEAR::Mail_Mimeを紹介します。
]]>
        <![CDATA[インストールについて知りたい方は、過去の記事をご参照ください。
<a href="http://www.s-memo.net/blog/2005/12/pear_1.php">レンタルサーバーでPEARを使う方法</a>
<a href="http://www.s-memo.net/blog/2006/12/pear.php">WindowsでPEARを自動インストールしてみよう</a>

今回はPEAR::Mailの拡張機能になりますのでPEAR::Mailの使い方を知ってることが前提です。
もし使い方を知らない方は前回のエントリー「<a href="http://www.s-memo.net/blog/2007/03/pearmail_1.php">PEAR::Mailを使ってメールを送信してみよう</a>」をご参照ください。

まずは添付メールの紹介です。
テキストメールで「sample.php」「sample.jpg」「sample.xls」の３つのファイルを添付する場合、以下のように記述します。尚、赤色の部分は前回のエントリーからの追加・編集した部分です。
<blockquote>require_once("Mail.php");
<font color="#FF0000">require_once("Mail/mime.php");</font>

$header['From'] = "ピヨヒコ&lt;piyopiyo@s-memo.net&gt;";
$header['To'] = "To様&lt;to@s-memo.net&gt;";
$header['Subject'] = "メールのタイトル";

<font color="#FF0000">$html_param['head_charset'] = "ISO-2022-JP";
$html_param['text_encoding'] = "ISO-2022-JP";
$html_param['text_charset'] = "SJIS";

$mime = new Mail_mime();
$mime-&gt;setTxtBody("メール本文");
$mime-&gt;addAttachment("./sample.jpg", "image/jpeg");
$mime-&gt;addAttachment("./sample.php", "text/plain");
$mime-&gt;addAttachment("./sample.xls");

$body = $mime-&gt;get($html_param);
$header = $mime-&gt;headers($header);</font>

$mail = Mail::factory("smtp");
$ret = $mail-&gt;send("to@s-memo.net", $header, $body);
if(PEAR::isError($ret)) {
&nbsp;&nbsp;die("エラーメッセージ：".$ret-&gt;getMessage());
}</blockquote>
まずはPEAR::MailとPEAR::Mail_Mimeをインクルードします。
PEAR::Mail_Mime自身はメールの送信は一切行いません。あくまでPEAR::Mailをサポートする為のクラスですので、PEAR::Mailも必ずインクルードします。
<blockquote>require_once("Mail.php");
require_once("Mail/mime.php");</blockquote>
次に文字コードを連想配列にセットします。head_charsetはメールヘッダの文字コード、text_encodingはメールの文字コード（テキストメール専用）、text_charsetは変換前の文字コードです。
<font color="#FF0000">文字化けが発生した場合、この部分を間違えている可能性が高いです。</font>mb_convert_encodingなどで文字コードを変更する前に以下の連想配列を変えてみることをお勧めします。
<blockquote>$html_param['head_charset'] = "ISO-2022-JP";
$html_param['text_encoding'] = "ISO-2022-JP";
$html_param['text_charset'] = "SJIS";</blockquote>
次にPEAR::Mail_mimeを宣言して、メール本文をセットします。テキストメールを送信する場合、setTxtBodyメソッドを使用します。
<blockquote>$mime = new Mail_mime();
$mime-&gt;setTxtBody("メール本文");</blockquote>
いよいよ添付処理です。添付はAttachmentメソッドを使用します。
第1引数にファイルパス又はデータを直接書きます。第2引数にContent-Typeを指定します。
Content-Typeが不明な場合は、省略しても大丈夫でした。でも、出来る限り指定してあげたほうがよさそうです。
<blockquote>$mime-&gt;addAttachment("./sample.jpg", "image/jpeg");
$mime-&gt;addAttachment("./sample.php", "text/plain");
$mime-&gt;addAttachment("./sample.xls");</blockquote>
getメソッドでメール用に変換したデータを$body変数に格納しています。
ヘッダ情報もheadersメソッドで変換したデータを$header変数に格納しています。
<blockquote>$body = $mime-&gt;get($html_param);
$header = $mime-&gt;headers($header);</blockquote>
$body変数はそのままメール本文で使用して、$header変数もそのままメールヘッダとしてPEAR::Mailにセットしてメールを送信します。
<blockquote>$mail = Mail::factory("smtp");
$ret = $mail-&gt;send("to@s-memo.net", $header, $body);</blockquote>
これでスクリプトを起動させると添付メールが届くと思います。

次はHTMLメールを作って見ます。HTMLメールには
・画像ファイルはサーバーに設置して、パスをhttpから記述する方法
・画像ファイルを添付してパスを相対パスで記述する方法
の2種類あります。
PEAR::Mail_Mimeを使うと両方とも実現できます。まずは、HTTPから記述する方法を紹介します。
「http://www.s-memo.net/img/sample.jpg」に画像があると過程します。
<blockquote>require_once("Mail.php");
require_once("Mail/mime.php");

$header['From'] = "ピヨヒコ&lt;piyopiyo@s-memo.net&gt;";
$header['To'] = "To様&lt;to@s-memo.net&gt;";
$header['Subject'] = "メールのタイトル";

$html_param['head_charset'] = "ISO-2022-JP";
<font color="#FF0000">$html_param['html_encoding'] = "ISO-2022-JP";
$html_param['html_charset'] = "SJIS";</font>

<font color="#FF0000">$html = &lt;&lt;&lt;HTML
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=shift_jis"&gt;
&lt;title&gt;HTMLメール送信テスト&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;font color="#0000FF"&gt;HTMLメールのテストです&lt;/font&gt;&lt;br&gt;
&lt;img src="http://www.s-memo.net/img/sample.jpg"&gt;
&lt;/body&gt;
&lt;/html&gt;
HTML;</font>

$mime = new Mail_mime();
<font color="#FF0000">$mime-&gt;setHTMLBody($html);</font>

$body = $mime-&gt;get($html_param);
$header = $mime-&gt;headers($header);

$mail = Mail::factory("smtp");
$ret = $mail-&gt;send("to@s-memo.net", $header, $body);
if(PEAR::isError($ret)) {
&nbsp;&nbsp;die("エラーメッセージ：".$ret-&gt;getMessage());
}</blockquote>
text_encodingとtext_charsetはテキストメール用ですが、HTMLメールの場合はhtml_encodingとhtml_charsetを使用します。
・テキストメールの場合
<blockquote>$html_param['head_charset'] = "ISO-2022-JP";
$html_param['<font color="#FF0000">text_encoding</font>'] = "ISO-2022-JP";
$html_param['<font color="#FF0000">text_charset</font>'] = "SJIS";</blockquote>
・HTMLメールの場合
<blockquote>$html_param['head_charset'] = "ISO-2022-JP";
$html_param['<font color="#FF0000">html_encoding</font>'] = "ISO-2022-JP";
$html_param['<font color="#FF0000">html_charset</font>'] = "SJIS";</blockquote>
次に$html変数にHTMLを挿入して、setHTMLBodyメソッドにセットします。
<blockquote>$mime->setTxtBody($html);</blockquote>
後は先ほどを全く同じです。これでHTMLメールが送信できると思います。

最後に画像ファイルを添付してパスを相対パスで記述する方法を紹介します。
<blockquote>require_once("Mail.php");
require_once("Mail/mime.php");

$header['From'] = "ピヨヒコ&lt;piyopiyo@s-memo.net&gt;";
$header['To'] = "To様&lt;to@s-memo.net&gt;";
$header['Subject'] = "メールのタイトル";

$html_param['head_charset'] = "ISO-2022-JP";
$html_param['html_encoding'] = "ISO-2022-JP";
$html_param['html_charset'] = "SJIS";

$html = &lt;&lt;&lt;HTML
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=shift_jis"&gt;
&lt;title&gt;HTMLメール送信テスト&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;font color="#0000FF"&gt;HTMLメールのテストです&lt;/font&gt;&lt;br&gt;
<font color="#FF0000">&lt;img src="./sample.jpg"&gt;</font>
&lt;/body&gt;
&lt;/html&gt;
HTML;

$mime = new Mail_mime();
$mime-&gt;setTxtBody($html);
<font color="#FF0000">$mime-&gt;addHTMLImage("./sample.jpg", "image/jpeg");</font>

$body = $mime-&gt;get($html_param);
$header = $mime-&gt;headers($header);

$mail = Mail::factory("smtp");
$ret = $mail-&gt;send("to@s-memo.net", $header, $body);
if(PEAR::isError($ret)) {
&nbsp;&nbsp;die("エラーメッセージ：".$ret-&gt;getMessage());
}</blockquote>
imgタグのsrc属性を相対パスに変更します。
<blockquote>&lt;img src="./sample.jpg"&gt;</blockquote>
画像をHTMLメールに埋め込みたい場合には、addHTMLImageメソッドを使います。
第1引数には画像パス、第2引数にはContent-Typeを指定します。
<blockquote>$mime-&gt;addHTMLImage("./sample.jpg", "image/jpeg");</blockquote>
これで画像付のHTMLメールが送信できます。
画像を添付で送りたい場合はaddAttachmentメソッドを使って、画像をHTMLメールに埋め込みたい場合はaddHTMLImageメソッドを使います。状況によって使い分けてください。

2回に分けてメールに関するPEARを紹介してきましたがいかがだったでしょうか。
私はPEAR::Mailに切り替えてからメール関係で文字化けに悩むことが大分減りました。
メール関係だけでもまだまだ別のライブラリがありますので、機会があれば紹介したいなと思います。

[関連記事]
・<a href="http://www.s-memo.net/blog/2007/03/pearmail_1.php">PEAR::Mailを使ってメールを送信してみよう</a>
]]>
    </content>
</entry>
<entry>
    <title>PEAR::Mailを使ってメールを送信してみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/pearmail_1.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=38" title="PEAR::Mailを使ってメールを送信してみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.38</id>
    
    <published>2007-03-24T05:06:06Z</published>
    <updated>2007-03-25T08:03:02Z</updated>
    
    <summary>PHPにはmb_send_mail()関数という日本語を含めたメールを送信する機...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="PHP - PEAR" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        PHPにはmb_send_mail()関数という日本語を含めたメールを送信する機能がありますがよく文字化けします。PHPの自動エンコーディング機能がうまくいかずに文字化けをするのですが、設定がシビアなので使ってません。例えば、同じサーバーを使っている場合は制作時に気をつければ問題ありませんが、サーバーを移行するようなことがあると新しいサーバーでメールが文字化けしたり結構大変だったりします。
結局send()関数を使うのですが、これで日本語のメールを送信する為には追加メールヘッダを記述する必要があります。mb_send_mail()関数よりはマシですが、これもこれで設定に左右されるので意外と大変。メール送信用の自作関数を作ったものの完璧ではありませんでした。
最終的に落ち着いたのは、PEARのMailです。記述がシンプルな上に自由に設定できて便利。
ということで今回はPEAR::Mailを紹介します。

        <![CDATA[インストールについて知りたい方は、過去の記事をご参照ください。
<a href="http://www.s-memo.net/blog/2005/12/pear_1.php">レンタルサーバーでPEARを使う方法</a>
<a href="http://www.s-memo.net/blog/2006/12/pear.php">WindowsでPEARを自動インストールしてみよう</a>

まずは、基本から以下のソースを見てください。
<blockquote>require_once("Mail.php");

$header['From'] = "piyo@s-memo.net";

$mail = Mail::factory("sendmail");
$ret = $mail-&gt;send("to@s-memo.net", $header, "メール本文");
if(PEAR::isError($ret)) {
&nbsp;&nbsp;die("エラーメッセージ：".$ret-&gt;getMessage());
}</blockquote>
これはタイトルも宛先も空白の必須項目のみを記述したサンプルです。
PEAR::Mailで、必要なのは「From（送信者）」「To（送信先）」「メール本文」の３つです。

1行目はいつも通りMail.phpをインクルードしています。
<blockquote>require_once("Mail.php");</blockquote>
3行目では「From（送信者）」を配列にセットしています。
<blockquote>$header['From'] = "piyo@s-memo.net";</blockquote>
5行目でMail::factory()メーラインスタンスを作成しています。
<blockquote>$mail = Mail::factory("sendmail");</blockquote>
7行目でメールを送信しています。第２引数に3行目で作ったFromをセットしている配列を指定しています。
<blockquote>$ret = $mail-&gt;send("to@s-memo.net", $header, "メール本文");</blockquote>
8～10行目はメール送信に失敗した場合に、エラーメッセージを表示させます。
<blockquote>if(PEAR::isError($ret)) {
&nbsp;&nbsp;die("エラーメッセージ：".$ret-&gt;getMessage());
}</blockquote>

メールを受信してみると分かるのですが、宛先も件名も空っぽになっています＾＾；
これだけだと使い道がないので、もう少し実用的なものを作ってみます。
先ほどのスクリプトに赤の部分を追加・修正してください。（メールアドレスは適当に変えてください）
<blockquote>require_once("Mail.php");

<font color="#FF0000">$header['From'] = "ピヨヒコ&lt;piyo@s-memo.net&gt;";
$header['To'] = "To様&lt;to@s-memo.net&gt;";
$header['Cc'] = "Cc様&lt;cc@s-memo.net&gt;";
$header['Bcc'] = "Bcc様&lt;bcc@s-memo.net&gt;";
$header['Reply-To'] = "piyopiyo@s-memo.net";
$header['Subject'] = "メールのタイトル";

$address = array("to@s-memo.net", "cc@s-memo.net", "bcc@s-memo.net");</font>

$mail = Mail::factory("sendmail");
$ret = $mail-&gt;send(<font color="#FF0000">$address</font>, $header, "メール本文");
if(PEAR::isError($ret)) {
&nbsp;&nbsp;die("エラーメッセージ：".$ret-&gt;getMessage());
}</blockquote>
$headerの連想配列を追加しました。この連想配列にメールアドレスをセットしても指定のアドレスにはメールは送信されません。この配列はメールを受信した時に表示されるテキストです。（上記の例だとメールを受信した時に送信者に「ピヨヒコ」、宛先に「To様」、Ccに「Cc様」と表示されます）
メールを送信先はsend()メソッドで指定します。最初の例のように直接記述することもできますが、複数のアドレスに送信する場合、配列又はカンマ区切りで指定します。
以下のように配列を作って、
<blockquote>$address = array("to@s-memo.net", "cc@s-memo.net", "bcc@s-memo.net");</blockquote>
send()メソッドから複数アドレスに送信します。
<blockquote>$mail-&gt;send(<font color="#FF0000">$address</font>, $header, "メール本文");</blockquote>
[ちょっと余談]
以下の「Reply-To」というのはメールの返信先です。
<blockquote>$header['Reply-To'] = "piyopiyo@s-memo.net";</blockquote>
Fromは「piyo@s-memo.net」ですが、メーラーから返信をすると宛先に「piyopiyo@s-memo.net」が指定されます。Fromと返信先を変えたい時に使いましょう。

最後にSMTPからメールを送信してみましょう。
SMTPを使用すれば外部のメールアドレスからメールを送信することができます。
先ほどのスクリプトを修正します。赤の部分を追加・修正してください。
<blockquote>require_once("Mail.php");

<font color="#FF0000">$param['host'] = "smtp.s-memo.net";
$param['port'] = 25;
$param['auth'] = TRUE;
$param['username'] = "piyohiko";
$param['password'] = "password";</font>

$header['From'] = "ピヨヒコ&lt;piyo@s-memo.net&gt;";
$header['To'] = "To様&lt;to@s-memo.net&gt;";
$header['Cc'] = "Cc様&lt;cc@s-memo.net&gt;";
$header['Bcc'] = "Bcc様&lt;bcc@s-memo.net&gt;";
$header['Reply-To'] = "piyopiyo@s-memo.net";
$header['Subject'] = "メールのタイトル";

$address = array("to@s-memo.net", "cc@s-memo.net", "bcc@s-memo.net");

$mail = Mail::factory(<font color="#FF0000">"smtp"</font>, <font color="#FF0000">$param</font>);
$ret = $mail-&gt;send($address, $header, "メール本文");
if(PEAR::isError($ret)) {
&nbsp;&nbsp;die("エラーメッセージ：".$ret-&gt;getMessage());
}</blockquote>
ホスト名やポート番号等を連想配列を追加しています。
<blockquote>$param['host'] = "smtp.s-memo.net";
$param['port'] = 25;
$param['auth'] = TRUE;
$param['username'] = "piyohiko";
$param['password'] = "password";</blockquote>
「auth」はSMTP認証を使用するかどうかを指定します。TRUEでSMTP認証を使用し、FALSEでSMTP認証を使用しません。
ユーザ名やパスワードはSMTP認証に使用するユーザ名とパスワードを挿入します。

次に制作した連想配列を以下にセットします。
<blockquote>$mail = Mail::factory(<font color="#FF0000">"smtp"</font>, <font color="#FF0000">$param</font>);</blockquote>
後はsend()メソッドでメールを送信すれば完了です。
SMTPは外部サーバーのメールを使用できますが、ポートを開いてもらう必要がありますのでご注意ください。
予想以上に長くなりましたが今日はここまで。
と思いましたが、せっかくなのでMailクラスのリファレンスも残しておきます。

Mailクラスのfactoryメソッドのリァレンスは以下の通り
<blockquote>factory($backend, [, $param]);
$backend：「mail」「smtp」「sendmail」のいずれか
$param：パラメータの連想配列（FromやToなど）以下を参照</blockquote>
factoryメソッドの第2引数のパラメータは以下の通り
<blockquote>[「sendmail」の場合]
$p['sendmail_path']：sendmailへのファイルパス　/usr/bin/sendmail等
$p['sendmail_args']：sendmailに渡す追加パラメータ
[「smtp」の場合]
$p['host']：SMTPを利用するドメイン又はIP名（デフォルト：localhost）
$p['port']：接続ポート番号（デフォルト：25）
$p['auth']：SMTP認証を使用するかどうか（デフォルト：FALSE）
$p['username'}：SMTP認証のユーザ名
$p['password'}：SMTP認証のパスワード</blockquote>

Mailクラスのsendメソッドのリファレンスは以下の通り
<blockquote>send($address, $header, $msg);
$address：メールアドレス（複数送信は配列又はカンマ区切り）
$header：追加ヘッダの連想配列。詳細は以下を参照
$msg：メール本文</blockquote>
sendメソッドの第2引数のパラメータは以下の通り
<blockquote>$h['From']：送信者
$h['To']：送信先（To）
$h['Cc']：送信先（Cc）
$h['Bcc']：送信先（Bcc）
$h['Reply-To']：メールの返信先
$h['Subject']：メールタイトル</blockquote>
send()メソッドの第2引数に「To」や「Cc」を追加しても実際には送信されません。これはメール受信者の表示用の為の記述です。
実際に送信したい場合は、第1引数に同じアドレスを記述してください。

[関連記事]
・<a href="http://www.s-memo.net/blog/2007/03/pearmail_mimehtml.php">PEAR::Mail_Mimeを使ってHTMLメールを送ってみよう</a>

【雑談】
やっと昼型に戻りました！まあ、いつまでもつか分かりませんが、、、＾＾；]]>
    </content>
</entry>
<entry>
    <title>PEARを使ってディレクトリの中身を全削除する</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/pear_3.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=37" title="PEARを使ってディレクトリの中身を全削除する" />
    <id>tag:www.s-memo.net,2007:/blog//3.37</id>
    
    <published>2007-03-19T01:41:52Z</published>
    <updated>2007-03-19T01:51:55Z</updated>
    
    <summary>先週の木・金曜日あたりからずっと貧血気味で調子が悪く、夜型の生活が影響しているの...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="PHP - PEAR" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        先週の木・金曜日あたりからずっと貧血気味で調子が悪く、夜型の生活が影響しているのかと思っていたのですがそれだけではありませんでした。原因は野菜不足。。。
最近は自炊する時間もなく外食が多かったのですが、肉ばっかり食べてたもんだから体調を崩したようです＾＾；当たり前だけど野菜はちゃんと食べよう。
さて、そろそろ本題に移ります。
PHPには「rmdir」というディレクトリを削除する関数がありますが、「空ディレクトリ」のみしか削除できずディレクトリ内にファイルが存在した場合、削除することができません。
PHPの標準機能だけを使った場合、再帰処理を使って全てのファイルを「unlink」で削除した後に「rmdir」を実行する必要があります。
今回はPEAR::Systemを使ってディレクトリを完全削除する簡単な方法を紹介します。

        <![CDATA[今回の「PEAR::System」はPEARの標準機能です。
インストールについて知りたい方は、過去の記事をご参照ください。
<a href="http://www.s-memo.net/blog/2005/12/pear_1.php">レンタルサーバーでPEARを使う方法</a>
<a href="http://www.s-memo.net/blog/2006/12/pear.php">WindowsでPEARを自動インストールしてみよう</a>

では早速作ってみましょう。
以下の構成だと仮定します。
<blockquote>[home]
　└─[ sample]
　└─rm.php</blockquote>
rm.phpは削除用のPHPファイル、sampleディレクトリは削除するディレクトリです。

rm.phpに削除用のスクリプトを記述します。
<blockquote>require_once("System.php");
System::rm("-r sample");</blockquote>これだけです＾＾；問題なく削除できた場合はTRUE、削除に失敗した場合はFALSEが返ってきます。
ディレクトリ内にファイルがあっても再帰処理で全部削除してくれます。

HTTPからrm.phpにアクセスすれば、sampleディレクトリ及びディレクトリ内の全てのファイルを削除してくれます。
当然ですが、権限のないファイル・ディレクトリは削除はできません。
もし、権限のないファイルと権限のあるファイルが混ざっていた場合、権限ありのみのファイルが削除されて戻り値はFALSEが返ってきます。
権限のないファイルを削除したい場合は、属性を「777」にすれば削除できます。
<blockquote>require_once("System.php");
if(System::rm("-r sample")) {
&nbsp;&nbsp;echo "削除が成功しました";
} else {
&nbsp;&nbsp;echo "削除に失敗しました";
}</blockquote>

ちなみに
<blockquote>System::rm("samle.txt");</blockquote>
と記述すると、指定のファイルを削除してくれます。

ローカル上でテストしてみたのですが、500MBの容量（ファイル数：約30,000）でも問題なく削除できました。処理には約10～15秒かかりましたが、、、
一時保存ディレクトリを作った場合、削除処理がうまくいかずに困ることがありましたが、これからは大丈夫そうです。

]]>
    </content>
</entry>
<entry>
    <title>Movable TypeでSitemaps（サイトマッププロトコル）を作ってみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/movable_typesitemaps.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=36" title="Movable TypeでSitemaps（サイトマッププロトコル）を作ってみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.36</id>
    
    <published>2007-03-15T00:20:38Z</published>
    <updated>2007-03-15T00:30:58Z</updated>
    
    <summary>このブログは気が向いたときに書いているのですが、現時点で今月は過去最高のエントリ...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="Google情報" />
            <category term="メモ帳" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        <![CDATA[このブログは気が向いたときに書いているのですが、現時点で今月は過去最高のエントリー数になってます。このまま1週間に2,3回は書いていけたらいいなと思ってます。質が落ちてる気がしないでもないのですが、、、
何故、更新頻度が上がったかと言うとアクセスが増えて更新が楽しくなってきたことと、更にアクセス数を「もっと増やしたいなぁ」っと考えたときに更新頻度を上げるのがベストだと思ったからです＾＾；
とは言っても本腰でアクセス数を増やすならもっと情報をPEAR、Ajax等に絞ったほうが良さそうですが、「勉強したことをメモ程度に記録する」というこのサイトの本質から外れるのでしばらくはこのまま行きます。

さてそろそろ本題に入ります。以前に「<a href="http://www.s-memo.net/blog/2006/11/googlesitemaps_1.php">GoogleのSitemaps（サイトマッププロトコル）</a>」の制作方法を紹介しましたが、今回はMovable Typeのテンプレートに記述する方法を紹介します。これを使えば、サイトを更新するたびに自動でSitemapsを作ってくれます。
]]>
        <![CDATA[Movable Typeにログインをして、「テンプレート」→「インデックス」→「テンプレートの新規作成」をクリックします。
テンプレートの新規登録ページに移動しますので「テンプレート名」には「Google Sitemaps」など自由に名前をつけます。続いて「出力ファイル名」には「sitemap.xml」と入力します。
後は「再構築オプション」の「インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する」にチェックを入れます。

「テンプレートの内容」にサイトマッププロトコルを記述していきます。
まずはお決まり通りXMLの宣言とurlsetタグを記述します。
<blockquote>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;urlset xmlns="http://www.google.com/schemas/sitemap/0.84"&gt;

&lt;/urlset&gt;</blockquote>
urlsetタグの中にトップページやエントリーのURLを記述していきます。
トップページの記述は以下のように記述します。
<blockquote>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;urlset xmlns="http://www.google.com/schemas/sitemap/0.84"&gt;
<font color="#FF0000">&nbsp;&nbsp;&lt;url&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;loc&gt;&lt;$MTBlogURL encode_xml="1"$&gt;&lt;/loc&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;changefreq&gt;monthly&lt;/changefreq&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;priority&gt;1.0&lt;/priority&gt;
&nbsp;&nbsp;&lt;/url&gt;</font>
&lt;/urlset&gt;</blockquote>
「$MTBlogURL」にはその名の通り、ブログのトップページURLが呼び出されます。

更にその下に各エントリーのURLと最終更新日を記述します。
<blockquote>&lt;MTEntries lastn="9999"&gt;
&lt;url&gt;
&nbsp;&nbsp;&lt;loc&gt;&lt;$MTEntryPermalink encode_xml="1"$&gt;&lt;/loc&gt;
&nbsp;&nbsp;&lt;lastmod&gt;&lt;$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$&gt;&lt;/lastmod&gt;
&lt;/url&gt;
&lt;/MTEntries&gt;</blockquote>
「MTEntries」はエントリーを挿入する際に使用します。
「MTEntries lasten="9999"」は最初のエントリーから9999個のエントリーを順番に呼び出しなさいという指示になります。エントリーが9999個以下の場合は、全てのエントリーが呼び出された時点で終了します。尚、「lasten="9999"」を入れなかった場合、最新の一部のエントリーしか表示されませんのでご注意ください。
「$MTEntryPermalink」はURLを、「$MTEntryModifiedDate」は最終更新日を呼び出しています。

次にエントリーの下にカテゴリを入れます。
<blockquote>&lt;MTCategories&gt;
&lt;url&gt;
&nbsp;&nbsp;&lt;loc&gt;&lt;$MTCategoryArchiveLink encode_xml="1"$&gt;&lt;/loc&gt;
&nbsp;&nbsp;&lt;lastmod&gt;&lt;$MTDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$&gt;&lt;/lastmod&gt;
&lt;/url&gt;
&lt;/MTCategories&gt;</blockquote>
「MTCategories」は各カテゴリを順次呼び出します。
「$MTCategoryArchiveLink」はURLを、「$MTDate」は構築日を呼び出しています。構築日よりも「カテゴリ内の最新エントリーデータの更新日」がセットできればベストだと思ったのですが、リファレンスを見ても都合の良いのがありませんでした＾＾；

カテゴリの下に月別（アーカイブ）のリンクを記述します。
<blockquote>&lt;MTArchiveList archive_type="Monthly"&gt;
&lt;url&gt;
&nbsp;&nbsp;&lt;loc&gt;&lt;$MTArchiveLink encode_xml="1"$&gt;&lt;/loc&gt;
&nbsp;&nbsp;&lt;lastmod&gt;&lt;$MTArchiveDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$&gt;&lt;/lastmod&gt;
&lt;/url&gt;
&lt;/MTArchiveList&gt;</blockquote>
「MTArchiveList」 type="Monthly"」で月別（アーカイブ）を順番に呼び出します。
「$MTArchiveLink」でURLを、「$MTArchiveDate」でその月の1日の日付が呼び出されます。「$MTArchiveDate」を「$MTArchiveDateEnd」に書き換えてもいいかもしれませんが、最新月のデータの更新日に未来の日付が入るので辞めたほうが無難かと思います。

最終的には以下のようになります。
<blockquote>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;urlset xmlns="http://www.google.com/schemas/sitemap/0.84"&gt;
&nbsp;&nbsp;&lt;url&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;loc&gt;&lt;$MTBlogURL encode_xml="1"$&gt;&lt;/loc&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;changefreq&gt;monthly&lt;/changefreq&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;priority&gt;1.0&lt;/priority&gt;
&nbsp;&nbsp;&lt;/url&gt;

&nbsp;&nbsp;&lt;MTEntries lastn="9999"&gt;
&nbsp;&nbsp;&lt;url&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;loc&gt;&lt;$MTEntryPermalink encode_xml="1"$&gt;&lt;/loc&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;lastmod&gt;&lt;$MTEntryModifiedDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$&gt;&lt;/lastmod&gt;
&nbsp;&nbsp;&lt;/url&gt;
&nbsp;&nbsp;&lt;/MTEntries&gt;

&nbsp;&nbsp;&lt;MTCategories&gt;
&nbsp;&nbsp;&lt;url&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;loc&gt;&lt;$MTCategoryArchiveLink encode_xml="1"$&gt;&lt;/loc&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;lastmod&gt;&lt;$MTDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$&gt;&lt;/lastmod&gt;
&nbsp;&nbsp;&lt;/url&gt;
&nbsp;&nbsp;&lt;/MTCategories&gt;

&nbsp;&nbsp;&lt;MTArchiveList archive_type="Monthly"&gt;
&nbsp;&nbsp;&lt;url&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;loc&gt;&lt;$MTArchiveLink encode_xml="1"$&gt;&lt;/loc&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;lastmod&gt;&lt;$MTArchiveDate utc="1" format="%Y-%m-%dT%H:%M:%SZ"$&gt;&lt;/lastmod&gt;
&nbsp;&nbsp;&lt;/url&gt;
&nbsp;&nbsp;&lt;/MTArchiveList&gt;
&lt;/urlset&gt;</blockquote>

URLはバッティングしないので問題ないとは思いますが、上記のテンプレートを使うことで検索エンジンの順位が下がったりインデックスが削除されても本サイトでは責任を負えませんので予めご了承ください。

・関連記事
<a href="http://www.s-memo.net/blog/2006/11/googlesitemaps_1.php">GoogleのSitemaps（サイトマッププロトコル）を作ろう</a>]]>
    </content>
</entry>
<entry>
    <title>MySQLの暗号化をやってみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/mysql_1.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=35" title="MySQLの暗号化をやってみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.35</id>
    
    <published>2007-03-13T19:20:14Z</published>
    <updated>2008-06-12T08:59:39Z</updated>
    
    <summary>ここ2週間ぐらい昼と夜が逆転してます。今も夜勤（？）中です。 私の場合、なぜか昼...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="MySQL" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        ここ2週間ぐらい昼と夜が逆転してます。今も夜勤（？）中です。
私の場合、なぜか昼より夜のほうが調子が良いのです。今に始まったことではなく一番古い記憶だと小学校5年生のときには夜型人間だと自覚していて、昔働いていた工場でも夜勤が楽しみで仕方なかった。なぜだろう？
そんな私に友人から一言「確実に体は蝕まれているので気をつけろ」と＾＾；
はい。気をつけます。。。
全く関係のない話から入りましたが、そろそろ本題に入ります。
今日はMySQLの暗号化を紹介します。

        <![CDATA[MySQLのPASSWORD関数は非推奨の為、出来る限り使用されないようにお願いします。
（2008.06.12 追加）

<s>
MySQLでパスワードを認証を行う場合、PASSWORD関数を使用します。
下記のように簡単なテーブルを作成してます。
<blockquote>CREATE TABLE users_table(
&nbsp;&nbsp;account TEXT NOT NULL,
&nbsp;&nbsp;pass_word TEXT NOT NULL
);</blockquote>
INSERTのときに「pass_word」フィールドを「PASSWORD」関数を使ってINSERTします。
<blockquote>INSERT INTO users_table (account, pass_word)
 values("staff", PASSWORD('pass'));</blockquote>
認証は以下のように行います。
<blockquote>SELECT * FROM users_table
 WHERE account='staff' AND pass_word=PASSWORD('pass');</blockquote>
PASSWORD関数は復元できないため、暗号化したパスワードを参照することはできません。
[PASSWORD関数の注意点]
MySQL4.0以前とMySQL4.1以降では仕様が変わっています。
MySQL4.0以前からMySQL4.1以降にアップグレードすると認証が使えなく可能性があります。
詳細は<a href="http://dev.mysql.com/doc/refman/4.1/ja/password-hashing.html" target="_blank">MySQLのリファレンス</a>をご参照ください。

暗号化・復元の両方を行いたい場合はAES_ENCRYPT関数とAES_DECRYPT関数を使用します。
AES_ENCRYPT関数で暗号化をして、AES_DECRYPT関数で復元をします。
暗号化は以下のように行います。
<blockquote>INSERT INTO users_table (str)
 values(AES_ENCRYPT('暗号化する文字列', 'password'));</blockquote>
復元は以下の通りです。
<blockquote>SELECT FROM AES_DECRYPT(str, 'password') FROM users_table</blockquote>
各関数の仕様は以下の通りです。
<blockquote>AES_ENCRYPT(str, key)
str：暗号化する文字列
key：暗号化用のパスワード</blockquote><blockquote>AES_DECRYPT(str, key)
str：復元するフィールド名
key：暗号化用のパスワード</blockquote>
</s>
]]>
    </content>
</entry>
<entry>
    <title>住所を都道府県・市区郡・それ以下に分けてみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/post_2.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=34" title="住所を都道府県・市区郡・それ以下に分けてみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.34</id>
    
    <published>2007-03-10T21:18:42Z</published>
    <updated>2007-03-10T21:57:22Z</updated>
    
    <summary>1年程前に「CSVデータをデータベースに一括登録する」をやりました。 その時のお...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="メモ帳" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        <![CDATA[1年程前に「CSVデータをデータベースに一括登録する」をやりました。
その時のお客さんの要望の中に「都道府県」「市区郡」それぞれで検索ができるようにしたいというのがあったのですが、元データが「○○県○○市○○1-2-3」と１つになっていました。
そのままデータベースの中に入れても「都道府県」「市区郡」別に検索することはできそうだったのですが、ほぼ間違いなく動作が重くなるのでデータを分けて登録することにしました。
で、その時に作った関数が以下の通り。
後ほど詳しく書きますが<font color="#FF0000">この関数は完璧ではありません。</font>
また、文字コードはSJISのみです。
<blockquote>/***
 * 住所を都道府県　市区郡　以下住所の３つに分ける
 * SJIS用
 */
function prefCityAddressSplit($value) {
&nbsp;&nbsp;$ret = array();
&nbsp;&nbsp;$search = "^([\x81\x3F-\xFF\xFF]{2,3}[\x93\x73|\x93\xB9|\x95\x7B|\x8C\xA7]{1})"; // 都道府県
&nbsp;&nbsp;$search .= "([\x81\x3F-\xFF\xFF]+[\x8B\xE6|\x8E\x73|\x8C\x53]{1})"; // 市区郡
&nbsp;&nbsp;$search .= "([\x81\x3F-\xFF\xFF|0-9a-zA-Z\-]*)"; // それ以下
&nbsp;&nbsp;if(mb_ereg($search, $value, $string)) {
&nbsp;&nbsp;&nbsp;&nbsp;$ret['pref'] = $string[1]; // 都道府県
&nbsp;&nbsp;&nbsp;&nbsp;$ret['city'] = $string[2]; // 市区郡
&nbsp;&nbsp;&nbsp;&nbsp;$ret['address'] = $string[3];
&nbsp;&nbsp;}
&nbsp;&nbsp;if(count($ret) &lt; 3) return $value;
&nbsp;&nbsp;return $ret;
}</blockquote>
「○○県○○市○○町1-2-3」をprefCityAddressSplit()の中に入れると配列で返してくれます。
住所以外のデータを入れると文字列がそのまま返ってきます。
<blockquote>$address = "○○県○○市○○町1-2-3";
prefCityAddressSplit($address);</blockquote><blockquote>array(3) {
&nbsp;&nbsp;["pref"]=>
&nbsp;&nbsp;string(6) "○○県"
&nbsp;&nbsp;["city"]=>
&nbsp;&nbsp;string(6) "○○市"
&nbsp;&nbsp;["address"]=>
&nbsp;&nbsp;string(11) "○○町1-2-3"
}</blockquote>
データの内容が首都圏内だけのデータでしたのでその時は問題なかったのですが、改めて見てみるとバグ発見。。。
「宮崎県都城市○○○1-2-3」で上記の関数を使うと「<font color="#FF0000">宮崎県</font>」ではなく「<font color="#FF0000">宮崎県都</font>」「城市」「○○○1-2-3」となります＾＾；
せっかくなので、Blogに掲載することにしたのですが、この問題を発見し格闘すること数時間、まだ解決できません。
うーむ、正規表現は便利だけど難しいなぁ。

]]>
        
    </content>
</entry>
<entry>
    <title>PHPでBasic認証のパスワードを作ってみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/phpbasic.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=33" title="PHPでBasic認証のパスワードを作ってみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.33</id>
    
    <published>2007-03-09T20:00:00Z</published>
    <updated>2007-03-11T19:38:56Z</updated>
    
    <summary>認証と言えば、Basic認証。今はレンタルサーバーで管理画面などから設置できることがほとんどですが、管理画面から設置できなかったり設置数に制限があったりすることもあります。そこで自分で作って設置するのですが、Basic認証（.htaccess）を設置するには.htaccessにパスワードの設置場所をサーバのルートパスから位置を記述したり、パスワードを自分で作る必要があります。今回はそんなときに役立つPHPの関数を紹介します。</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="PHP - 基本情報" />
            <category term="htaccess" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        <![CDATA[認証と言えば、Basic認証。
.htaccessと.htpasswdを設置するだけで認証をかけられる手軽さが最大のメリットです。
多分、この記事を見てる方も使ったことのない方はいないのではないでしょうか？
セキュリティは高くないものの「関係者以外に見られても構わないけどURL叩くだけで表示されるのはちょっと。。。」という場合に多く使用します。
今はレンタルサーバーで管理画面などから設置できることがほとんどですが、管理画面から設置できなかったり設置数に制限があったりすることもあります。
そこで自分で作って設置するのですが、Basic認証（.htaccess）を設置するには.htaccessにパスワードの設置場所をサーバのルートパスから位置を記述したり、パスワードを自分で作る必要があります。
今回はそんなときに役立つPHPの関数を紹介します。

[追記 2007/03/11]
Basic認証作成プログラムを作りました。htaccessを丸ごと作ったりパスワードだけを作ったりするBasic認証作成の支援プログラムです。ご自由にお使いください。
<a href="http://www.s-memo.net/sample/htaccess/index.php">Basic認証作成プログラム</a>]]>
        <![CDATA[まずは本題のPHPでパスワードを作る方法です。
Basic認証のパスワードは以下のような記述になります。
<blockquote>staff:mlAVmSW3gMmpk</blockquote>
「：（コロン）」でアカウントとパスワードが分かれています。
この場合は「staff」がアカウントになります。
パスワードの作り方は非常に簡単でcrypt()関数を使うだけです。
以下のスクリプトを記述してブラウザでプレビューすれば暗号化してくれます。
<blockquote>echo crypt("password", 'mc');</blockquote>
crypt関数のリファレンスは以下の通り
<blockquote>string crypt ( string str, string [salt] )
crypt("暗号化する文字列", "任意の２文字");</blockquote>
saltを指定しなかった場合、デフォルトではMD5で暗号化を行います。Basic認証のパスワードはDES暗号なので第二引数には半角英数記号で2文字記述します。
<blockquote>echo crypt("password", '1a');</blockquote>
と記述しても
<blockquote>echo crypt("password", 'zr');</blockquote>
と記述してもどちらでも認証可能です。
で、生成した文字列をコピーして「アカウント：パスワード」と記述すればBasic認証のパスワードが簡単に作れます。

次はサーバパスの調査方法です。
以下のようにphpinfo()を設置してブラウザで表示します。
phpinfo()の中に「DOCUMENT_ROOT」という部分があるのですが、それがドキュメントルートのサーバパスになります。
<blockquote>phpinfo();</blockquote>
phpinfo()が使えなかったりphpinfo()の中にパスを確認できなかった場合、以下のスクリプトで確認する方法もあります。
<blockquote>echo $_SERVER['DOCUMENT_ROOT'];
echo __FILE__; // 現在のファイルのパス</blockquote>
ドキュメントルートが「/home/www」でパスワードのファイル名が「.htpasswd」で「site」ディレクトリに認証をかけたい場合、.htaccessには「/home/www/site/.htpasswd」と記述します。

最後に、Basic認証の設置方法を簡単に紹介します。
最初に「.htaccess」というファイルを作ります。Windowsの場合、「.（ドット）」から始まるファイルは作れませんので、「htaccess.txt」など別の名前を仮に付けておきます。
「.htaccess」をテキストエディタで開いて
<blockquote>AuthUserFile <font color="#FF0000">/home/www/site/.htpasswd</font>
AuthGroupFile /dev/null
AuthName "<font color="#FF0000">STAFF PAGE</font>"
AuthType Basic
require valid-user</blockquote>
赤テキスト部分以外は毎回固定です。
<font color="#FF0000">/home/www/site/.htpasswd</font>の部分にはパスワードを設置するファイルパスを記述します。（サイトのドキュメントルートからのパスではなく、サーバのパスですのでご注意ください）
<font color="#FF0000">STAFF PAGE</font>の部分には認証の際にダイアログに表示されるテキストを記述します。日本語でも大丈夫ですが、文字化けの可能性が高いので使わないほうがいいでしょう。
今回は「/home/www/site」ディレクトリの中の「.htpasswd」ファイルにパスワードが設置されていると仮定しています。
次に「.htpasswd」を作ります。「.htaccess」と同じようにWindowsでは「.（ドット）」から始まるファイルは作れませんので、「htpasswd.txt」など別の名前を仮に付けておきます。
<blockquote>staff:mlAVmSW3gMmpk</blockquote>
アカウントを複数作る場合は以下のように１行につき１アカウント作ります。
<blockquote>staff:mlAVmSW3gMmpk
s-memo:mcguYfwbSHFR2</blockquote>
これで準備完了です。後はFTPで認証を掛けたいディレクトリに「.htaccess」を/home/www/siteに「.htpasswd」を設置します。名前を変えて作っていた場合はファイル名を「htaccess.txt」を「.htaccess」に「htpasswd.txt」を「.htpasswd」に変更します。
「.htaccess」の名前は固定ですが（ただしApacheの設定で変更可能）、「.htpasswd」は「.password」など自由にファイル名前をつけられます。
FTPでアップロードする場合、両方とも「アスキー」モードでアップロードしてください。

と、気が付けばPHPのことよりBasic認証の設置方法のほうがスペース食っちゃった。。。
最近は何か基本的な技術紹介が多いのですが、メモ書きとして残しておこうかと考えました。
たまーにしか使用せず記述方法をよく忘れますので、、、(´Д｀)
]]>
    </content>
</entry>
<entry>
    <title>JavaScriptでGETを取得する</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/javascriptget_1.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=32" title="JavaScriptでGETを取得する" />
    <id>tag:www.s-memo.net,2007:/blog//3.32</id>
    
    <published>2007-03-09T14:50:48Z</published>
    <updated>2007-03-09T15:39:57Z</updated>
    
    <summary>プログラムでURLの引数（GET）を取得する場合、PHPでは「$_GET」や「$...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="JavaScript - AJAX" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        プログラムでURLの引数（GET）を取得する場合、PHPでは「$_GET」や「$_REQUEST」を使いますがJavaScriptではGETを取得する機能はありません。
PHPやPerlなどが使えるサーバであればいいのですが使えない場合、JavaScriptでGETを取得するにはどうしたらよいのでしょうか？
今日はJavaScriptでGETを取得する方法を紹介します。やり方は非常にシンプルでJavaScriptでは「location.search」というURLの「?」以下を取得できるプロパティがあり、それを分解するだけで簡単に使えます。
ただし、URLエンコードされたままなので半角英数以外は使えません。
と、自分で書いて思うのですがあまり使い道はなさそうだなぁ。。。
なぜ書いたかと言うと実際に仕事で使いましたので、次回からすぐに調べられるようにメモ書き程度に書くことにしました＾＾；

        <![CDATA[以下のスクリプトを追加して
<blockquote>function getRequest(){
&nbsp;&nbsp;if(location.search.length &gt; 1) {
&nbsp;&nbsp;&nbsp;&nbsp;var get = new Object();
&nbsp;&nbsp;&nbsp;&nbsp;var ret = location.search.substr(1).split("&");
&nbsp;&nbsp;&nbsp;&nbsp;for(var i = 0; i &lt; ret.length; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var r = ret[i].split("=");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get[r[0]] = r[1];
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return get;
&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;return false;
&nbsp;&nbsp;}
}</blockquote>
最後に
<blockquote>var get = getRequest();</blockquote>
と記述すればOKです。
もし「http://xxxxxxx/xxx.html?id=3&code=test」というURLでアクセスした場合、
<blockquote>get['id'];     // 「3」
get['code']; // 「test」</blockquote>
で、各GETを扱えます。先に述べたように日本語は使えません。
日本語を使う場合はURLデコードしなきゃいけないので、これはちょっと大変そうだなぁ＾＾；

]]>
    </content>
</entry>
<entry>
    <title>マイブーム</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/post.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=31" title="マイブーム" />
    <id>tag:www.s-memo.net,2007:/blog//3.31</id>
    
    <published>2007-03-03T20:17:02Z</published>
    <updated>2007-03-03T20:41:59Z</updated>
    
    <summary>1週間ほど前に本屋で技術の本を探していたら「Googleガジェット-プログラミン...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="メモ帳" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        <![CDATA[1週間ほど前に本屋で技術の本を探していたら「Googleガジェット-プログラミング入門」という文字が目に入ってきました。
以前からGoogleガジェットやYahoo!ウィジェット等を気にはしていたもののほったらかし状態でした。
何気に手にしたら最後。ハマりました。そのまま衝動買い。
「ガジェット=ミニソフトウェア」とか思っていて、ソフトウェア開発は難しいものだと思い込んでいたのですが、本を見る限りHTMLとJavaScriptの知識があれば問題なさそうです。（実際はそんなに甘くはないのだろうけど＾＾；）
自分のパソコンを自由にカスタマイズできる辺りプログラマ魂に火がつきそうです。
「オリジナルのガジェット作るぞぉぉぉ！」と意気込んでおります。
さて、仕事がおろそかにならないように気をつけなければ、、、

・<a href="http://desktop.google.com/plugins?hl=ja" target="_blank">Googleガジェット</a>
・<a href="http://widgets.yahoo.co.jp/" target="_blank">Yahoo!ウィジェット</a>
]]>
        
    </content>
</entry>
<entry>
    <title>Yahoo! UIのイベントリスナー（addListener）を使ってみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/03/yahoo_uiaddlistener.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=30" title="Yahoo! UIのイベントリスナー（addListener）を使ってみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.30</id>
    
    <published>2007-03-03T19:40:41Z</published>
    <updated>2007-03-04T10:37:23Z</updated>
    
    <summary>つい先日Yahoo! UI Libraryが正式リリースされました。 バージョン...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="JavaScript - AJAX" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        <![CDATA[つい先日Yahoo! UI Libraryが正式リリースされました。
バージョン0.2からバージョン1.0ではなく、いきなりバージョン2.2に。何故2.2なんだろう。
prototype.jsやjQueryだと機能が物足りない、、、と感じていたのですが正式リリースされたことと私の師匠の勧めもあり、YUIを使ってみました。で、使ってみたら、、、Yahoo! UI Libraryにはまりつつあります＾＾；ほとんどの機能はYahoo! UI Libraryでまかなえます。私はしばらくYahoo! UI Libraryを使ってみようと思います。まあ、浮気性なのでいつ別のフレームワークに移るか分かりませんが。
以前に、<a href="http://www.s-memo.net/blog/2006/12/yahoo_ui.php">Yahoo! UIを使って非同期通信の紹介</a>をさせて頂いたのですが今回はイベントリスナーを紹介します。
リスナーとは、予約機能みたいなものです。「マウスを動かした」「クリックした」「ウィンドウサイズを変更した」「キーボードのキーを押した」などの操作に対してHTMLの中にJavaScriptを埋め込むのが一般的かと思いますが、リスナーを使うとそれらの操作を事前に予約することができます。
]]>
        <![CDATA[・<a href="http://developer.yahoo.com/yui/" target="_blank">Yahoo! UI Library</a>
*「Download YUI」ボタンをクリックするとダウンロードできます。

今回は、「yahoo-min.js」「event-min.js」を使いますので、この2つのファイルを適当なディレクトリにコピーしてください。
インストールに関しては、「<a href="http://www.s-memo.net/blog/2006/12/yahoo_ui.php">Yahoo! UIライブラリを使ってみよう</a>」をご覧ください。

今回作成するサンプルは以下の構成になります。
<blockquote>[home]
　└─ index.html
　└─ [js]
　　　　　└─ yahoo.js
　　　　　└─ event-min.js</blockquote>
早速、イベントリスナーを使ってみます。
まずは外部のJavaScriptを参照しましょう。
<blockquote>&lt;script type="text/javascript" src="./js/yahoo-min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="./js/event-min.js" &gt;&lt;/script&gt;</blockquote>
次に以下の関数を作ります。
<blockquote>&lt;script type="text/javascript"&gt;
function windowOpen() {
&nbsp;&nbsp;alert("リスナーを使ってみよう");
}
&lt;/script&gt;</blockquote>
「リスナーを使ってみよう」をいうテキストをダイアログ表示させるだけの簡単な関数です。
次に以下の1行を追加します。
<blockquote>&lt;script type="text/javascript"&gt;
function windowOpen() {
&nbsp;&nbsp;alert("リスナーを使ってみよう");
}
<font color="#FF0000">YAHOO.util.Event.addListener(window, "load", windowOpen);</font>
&lt;/script&gt;</blockquote>
「YAHOO.util.Event.addListener」の部分がイベントリスナーになります。これでイベントリスナー実装が終わりです。
ここまで作り終わったら、ブラウザで表示してみてください。
表示した瞬間に「リスナーを使ってみよう」をいうテキストがダイアログで表示されると思います。
通常であれば、
<blockquote>&lt;body onLoad="windowOpen();"&gt;</blockquote>
のように&lt;body&gt;タグのonLoad属性にwindowOpen()と入れるのですが、リスナーを使うと&lt;script&gt;内に機能を入れることが出来ます。
「YAHOO.util.Event.addListener」の引数の説明は以下の通りです。
<blockquote>YAHOO.util.Event.addListener(id, event, action);
id：対象のID属性名
（windowでウィンドウ全体）
event：対象になるイベント
action：イベント発生時に呼び出す関数名</blockquote>
第2引数のeventには以下のような種類があります。
<blockquote>イベントの種類
load：ページにアクセスした
unload：ページを移動した（破棄した）
mouseover：対象物の上にマウスがある
mouseout：対象物の上にマウスがない
click：マウスをクリックした
mousedown：マウスのボタンを押し下げた
mouseup：マウスのボタンを上げた
change：formなどの内容が変わった
keydown：キーボードのキーを押し下げた
keyup：キーボードのキーを押し上げた</blockquote>

これだけだと何が良いのかよく分からないのでもう少しだけ実用的な
テキストの上にマウスを乗せると背景色が変わって、マウスが外れると背景色が元に戻るような機能を作ってみます。
&lt;script&gt;タグの中に以下のスクリプトを追加してください。
<blockquote>function rollOver() {
&nbsp;&nbsp;this.style.backgroundColor = '#FFFF99';
}
function rollOut() {
&nbsp;&nbsp;this.style.backgroundColor = '#FFFFFF';
}</blockquote>
さらに、以下のスクリプト（リスナー）も追加してください。
<blockquote>YAHOO.util.Event.addListener("listener", "mouseover", rollOver);
YAHOO.util.Event.addListener("listener", "mouseout", rollOut);</blockquote>
「listener」というID属性名に「mouseover」した場合、「rollOver」という関数を実行しなさい。とリスナー（予約）しています。
更に、「listener」というID属性名に「mouseout」した場合、「rollOut」という関数を実行しなさい。とリスナー（予約）しています。
最後に&lt;body&gt;タグ内に以下のHTMLを追加します。
<blockquote>&lt;div id="listener"&gt;テキストのロールオーバ&lt;/div&gt;</blockquote>
&lt;div&gt;タグ内に「listener」というID属性を追加しています。

これでロールオーバが完成しました。完成したらブラウザでプレビューしてみましょう。
「テキストのロールオーバ」というテキストにマウスを乗せると背景色が変わると思います。
ロールオーバも&lt;body&gt;タグ内ではなく、リスナーを使って&lt;script&gt;タグ内に機能を記述することで、ソースを見易くしました。
完成版のソースは以下を参照してください。
<blockquote>&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=shift_jis"&gt;
&lt;title&gt;Yahoo!リスナー&lt;/title&gt;
&lt;script type="text/javascript" src="./js/yahoo-min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="./js/event-min.js" &gt;&lt;/script&gt;

&lt;script type="text/javascript"&gt;
function rollOver() {
&nbsp;&nbsp;this.style.backgroundColor = '#FFFF99';
}
function rollOut() {
&nbsp;&nbsp;this.style.backgroundColor = '#FFFFFF';
}

YAHOO.util.Event.addListener("listener", "mouseover", rollOver);
YAHOO.util.Event.addListener("listener", "mouseout", rollOut);
&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;div id="listener"&gt;テキストのロールオーバ&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</blockquote>

今回はイベントリスナー（addlistener）の紹介をさせて頂きました。
イベントリスナーを使うとHTMLソースが綺麗になります。しかし、下手に多様化すると解析が困難になるので別の作業者のことも考えてコーディングを行いましょう。

・関連記事
<a href="http://www.s-memo.net/blog/2006/12/yahoo_ui.php">Yahoo! UIライブラリを使ってみよう</a>

]]>
    </content>
</entry>
<entry>
    <title>使い所の難しいPHPの機能</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/02/php.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=29" title="使い所の難しいPHPの機能" />
    <id>tag:www.s-memo.net,2007:/blog//3.29</id>
    
    <published>2007-02-13T16:10:02Z</published>
    <updated>2007-02-13T17:18:03Z</updated>
    
    <summary>PHPを始めて4年ほど経つのですが、4年間でほとんど使ったことのない機能が多数あ...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="PHP - 基本情報" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        PHPを始めて4年ほど経つのですが、4年間でほとんど使ったことのない機能が多数あります。それ以前に使い方を知らなくて雑誌などを見て「こんな使い方・機能があるのか？！」とビックリすることもあります。まあ、マニュアルを見ろって話ですね＾＾；
今日は使い所の難しいPHPの機能を紹介します。

        <![CDATA[PHPは他の言語と比べると、柔軟に出来ているので比較的簡単に習得できます。
特に型の定義が曖昧なので、予想外の動きをすることがあります。
下記の例を見てください。
<blockquote>$str = "0";
if($str) {
&nbsp;&nbsp;echo "真です";
} else {
&nbsp;&nbsp;echo "偽です";
}</blockquote>
「$str = "0";」は、文字列の「0」として定義してるのですが結果は「偽（false）」になります。
逆に「$str = "text";」や「$str = "3";」などを定義すると「真（true）」になります。
「$str」に値が入っていたら「真（true）」にしたいと思ってこのようなIF文を作ると正常に動きません。
この他にも以下のものは全て「偽（false）」になります。
<blockquote>$str = 0;
$str = "";
$str = null;
$str = array();</blockquote>
「if($str)」等は注意して使わないと後でバグの原因になります。

次は、以下のプログラムを見てください。
<blockquote>$num1 = 10;
$num2 = "10";
if($num1 == $num2) {
&nbsp;&nbsp;echo "\$num1と\$num2は同じ値です"."&lt;br&gt;";
} else {
&nbsp;&nbsp;echo "\$num1と\$num2は違う値です"."&lt;br&gt;";
}</blockquote>
これは「真（true）」になります。PHPの場合、型の定義が曖昧なのでTEXT型を数字として扱ってくれます。型まで分別してくれる方法もあります。
<blockquote>$num1 = 10;
$num2 = "10";
if($num1 <font color="#FF0000">===</font> $num2) {
&nbsp;&nbsp;echo "\$num1と\$num2は同じ値です"."&lt;br&gt;";
} else {
&nbsp;&nbsp;echo "\$num1と\$num2は違う値です"."&lt;br&gt;";
}</blockquote>
「==」を「===」と書くと型まで判断してくれます。上記の例では「偽（false）」になります。

さあ、どんどん行きましょう。
<blockquote>$str = 10;
switch($str) {
case 20/10:
&nbsp;&nbsp;echo "20/10"."&lt;br&gt;";
&nbsp;&nbsp;break;
case 20/2:
&nbsp;&nbsp;echo "20/2"."&lt;br&gt;";
&nbsp;&nbsp;break;
}</blockquote>
これは見た目通りです。「switch～case」の「case」の部分に計算式を入れられます。

変数を定義する際に「$」を使いますが、「$$」とするとどうなるのでしょうか？
<blockquote>$test = "テストです";
$str1 = "test";
echo $$str1;</blockquote>
出力すると「テストです」と表示されます。
文字列を変数名として使いたい場合に使用するのでしょうが、実際に使ったことありません＾＾；

最後に繰り返し処理を制御する「break」「continue」の変わった使い方について紹介します。
まずは下記の例を見てください。
<blockquote>while(true) {
&nbsp;&nbsp;while(true) {
&nbsp;&nbsp;&nbsp;&nbsp;break 2;
&nbsp;&nbsp;}
}</blockquote>
「break 2」と記述すると、ネストしてあるループを抜けられます。「continue 2」も同じようにネストしているループを飛ばします。

以上、使い所の難しいPHPの機能でした！
次回は、Selenium（セレニウム）やFirePHP等を実験的に使っているのでこれらの紹介しようと思います。
]]>
    </content>
</entry>
<entry>
    <title>PEARを使って、圧縮や解凍をやってみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/01/pear_2.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=28" title="PEARを使って、圧縮や解凍をやってみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.28</id>
    
    <published>2007-01-07T08:28:26Z</published>
    <updated>2007-01-07T09:27:16Z</updated>
    
    <summary>以前に複数ファイルを圧縮してダウンロードする方法（HTTP_DOWNLOAD）を...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="PHP - PEAR" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        <![CDATA[以前に<a href="http://www.s-memo.net/blog/2006/12/post_1.php">複数ファイルを圧縮してダウンロードする方法（HTTP_DOWNLOAD）</a>を紹介しました。
HTTP_DOWNLOADで複数ファイルを圧縮してダウンロードはできるものの、ファイルの[プロパティ]→[概要]が消える問題がありましたが、今回紹介するFile_Archiveは[概要]が消えずに問題なくダウンロードすることができます。
HTTP_DOWNLOADに関してはその名の通りダウンロード用のプログラムですが、File_Archiveは圧縮・解凍用のプログラムです。
ということで、今回はFIle_Archiveを紹介します。]]>
        <![CDATA[・PEAR::File_Archiveのダウンロード
<a href="http://pear.php.net/package/File_Archive" target="_blank">PEAR::File_Archive</a>
*依存ファイルが多いのでレンタルサーバーをお使いの方はご注意ください。

インストールについて知りたい方は、過去の記事をご参照ください。
<a href="http://www.s-memo.net/blog/2005/12/pear_1.php">レンタルサーバーでPEARを使う方法</a>
<a href="http://www.s-memo.net/blog/2006/12/pear.php">WindowsでPEARを自動インストールしてみよう</a>

まずは、ファイルを圧縮してダウンロードしてみましょう。
適当に圧縮させたいディレクトリを準備してください。（今回は「sample」ディレクトリを圧縮すると仮定します）
早速、作ってみましょう。以下のソースを記述してください。
<blockquote>require_once('File/Archive.php');

File_Archive::extract(
&nbsp;&nbsp;File_Archive::read('sample/'),
&nbsp;&nbsp;File_Archive::toArchive('sample.zip', File_Archive::toOutput())
);</blockquote>
これで完成です＾＾；プログラムをブラウザで確認するとzipに圧縮されたファイルがダウンロードできると思います。

<blockquote>File_Archive::extract(<br />
&nbsp;&nbsp;File_Archive::read($dir),<br />
&nbsp;&nbsp;File_Archive::toArchive($fileName, <font color="#FF0000">File_Archive::toOutput()</font>)<br />
);<br />
$dir：圧縮するディレクトリ名<br />
$fileName：ダウンロードファイル名（tar, gz, bz2, tgz, tbz, zipが可能）<br />
<font color="#FF0000">File_Archive::toOutput()</font>：圧縮したファイルをダウンロードする</blockquote>
<font color="#FF0000">File_Archive::toOutput()</font>以外には<font color="#FF0000">File_Archive::toFiles()</font>があります。
下記のソースを見てください。
<blockquote>require_once('File/Archive.php');

File_Archive::extract(
&nbsp;&nbsp;File_Archive::read('sample/'),
&nbsp;&nbsp;File_Archive::toArchive('sample.zip', <font color="#FF0000">File_Archive::toFiles()</font>)
);</blockquote>
<font color="#FF0000">File_Archive::toOutput()</font>を<font color="#FF0000">File_Archive::toFiles()</font>に変更すると、サーバー内に保存されます。

最後に圧縮したファイルを解凍する方法を紹介します。
sample.zipを「sample」ディレクトリに解凍すると仮定して、以下のようなソースを記述します。
<blockquote>require_once('File/Archive.php');

File_Archive::extract(
&nbsp;&nbsp;File_Archive::read('sample.zip/'),
&nbsp;&nbsp;File_Archive::appender('sample')
);</blockquote>
このプログラムを起動させると、解凍されたファイルがsampleディレクトリの中にあると思います。
<blockquote>File_Archive::extract(
&nbsp;&nbsp;File_Archive::read($fileName),
&nbsp;&nbsp;File_Archive::appender($dir)
);
$fileName：解凍する圧縮ファイル名（最後に「/」を入れる）
$dir：解凍先のディレクトリ名</blockquote>
解凍する圧縮ファイル名を記述際に、「/」を入れてください。（例：「sample.zip/」）

File_Archiveを使うことにより、サイトのバックアップを取ったり圧縮したファイルをアップロードしてサーバー上で解凍することも可能になります。

・関連記事
<a href="http://www.s-memo.net/blog/2006/12/post_1.php">複数ファイルを圧縮してダウンロードしよう</a>]]>
    </content>
</entry>
<entry>
    <title>HTML_AJAXを使ってみよう</title>
    <link rel="alternate" type="text/html" href="http://www.s-memo.net/blog/2007/01/html_ajax.php" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.s-memo.net/mt/mt-atom.cgi/weblog/blog_id=3/entry_id=27" title="HTML_AJAXを使ってみよう" />
    <id>tag:www.s-memo.net,2007:/blog//3.27</id>
    
    <published>2007-01-06T06:32:41Z</published>
    <updated>2007-01-06T06:42:49Z</updated>
    
    <summary>今までにAjaxのフレームワークで「Prototype.js」「jQuery」「...</summary>
    <author>
        <name>Piyohiko</name>
        <uri>http://www.s-memo.net</uri>
    </author>
            <category term="JavaScript - AJAX" />
            <category term="PHP - PEAR" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.s-memo.net/blog/">
        今までにAjaxのフレームワークで「Prototype.js」「jQuery」「Yahoo！ UIライブラリ」を紹介してきました。
今回は、PEARのHTML_AJAXの基本的な機能を紹介します。名前の通りPHPでAjaxを使う機能です。
2007年1月6日現在でのヴァージョンは0.5.0(beta版)を使っています。

        <![CDATA[HTML_AJAXは以下のサイトからダウンロードしてください。
・PEAR::HTML_AJAXダウンロード
<a href="http://pear.php.net/package/HTML_AJAX" target="_blank">PEAR::HTML_AJAX</a>

インストールについて知りたい方は、過去の記事をご参照ください。
<a href="http://www.s-memo.net/blog/2005/12/pear_1.php">レンタルサーバーでPEARを使う方法</a>
<a href="http://www.s-memo.net/blog/2006/12/pear.php">WindowsでPEARを自動インストールしてみよう</a>

それでは早速、サンプルを作ってみます。
今回は全てのファイルの文字コードを「<font color="#FF0000">UTF-8</font>」で統一しています。（文字化け防止）
適当にディレクトリを作ります。（仮に「home」とします）
homeディレクトリの中に「server.php」と「sample.html」の2つのファイルを作ります。
<blockquote>[home]
　└─server.php
　└─sample.html
　└─message.txt</blockquote>
server.phpではAjax用のJavaScriptファイルを自動生成するファイルです。
sample.htmlにAjaxを書き込みます。
message.txtにはAjaxで読み込むテキストファイルです。「はじめてのHTML_AJAX」など適当にテキストを記述してください。

まず、server.phpをテキストエディタで以下の以下の3行を記述します。
<blockquote>require_once("HTML/AJAX/Server.php");

$server = new HTML_AJAX_Server();
$server->handleRequest();</blockquote>
handleRequestメソッドでAjax用のJavascriptを自動生成します。

次にsample.htmlにhtmlタグやheadタグ、bodyタグなどの基本的なタグを記述します。
headタグ内に、以下のスクリプトを記述します。
<blockquote>&lt;script type="text/javascript" src="server.php?client=all"&gt;&lt;/script&gt;</blockquote>通常は「src」の中に「xxx.js」と記述することが基本ですが、拡張子を「php」にすることで動的にJavascript（Ajax）を生成しています。
引数「client=all」はHTML_AJAXで使えるjsファイルを全て呼び出します。

次に以下の2行を追加します。
<blockquote>&lt;input type="button" onClick="HTML_AJAX.replace('message', 'message.txt')" value="HTML_AJAX.replaceの起動"&gt;
&lt;div id="message"&gt;メッセージ表示領域&lt;/div&gt;</blockquote>
これで完成です。ボタンをクリックすると「メッセージ表示領域」が「message.txt」の内容に切り替わります。

replaceメソッドの引数は以下のように指定します。
<blockquote>HTML_AJAX.replace(id, file)
id：id属性名
file：読み込むファイル名</blockquote>

他にもappendメソッドやgrabメソッドなどがあります。
ボタンの
<blockquote>&lt;input type="button" onClick="HTML_AJAX.<font color="#FF0000">replace</font>('message', 'message.txt')" value="HTML_AJAX.replaceの起動"&gt;</blockquote>
を
<blockquote>&lt;input type="button" onClick="HTML_AJAX.<font color="#FF0000">append</font>('message', 'message.txt')" value="HTML_AJAX.appendの起動"&gt;</blockquote>
に変えてみてください。
メッセージが上書きされるのではなく、追記されます。

appendメソッドの引数はreplaceメソッドと同じように指定します。
<blockquote>HTML_AJAX.append(id, file)
id：id属性名
file：読み込むファイル名</blockquote>

最後にgrabメソッドについて紹介します。
以下のディレクトリやファイルを新たに作ります。
<blockquote>[home]
　└─server.php
　└─sample.html
　└─message.php</blockquote>
server.phpは以前作成したファイルをそのまま持ってきます。
sample.htmlにAjaxを書き込みます。
message.phpにはAjaxで読み込むテキストファイルです。grabメソッドの機能を分かりやすくするためにPHPにしています。詳細は後ほど説明します。

message.phpに以下の3行を記述します。
<blockquote>sleep(3);
echo "初めてのHTML_AJAX&lt;br /&gt;";
echo "UTF-8で作成！3秒停止後に表示";</blockquote>
アクセスしてから3秒後にテキストを表示させます。

replaceメソッドやappendメソッドではid属性を直接指定していますが、grabメソッドは単体でファイルを読み込むことが出来ます。
grabメソッドを使うことにより、javascriptのalert機能やxmlの処理などを別途で指定することが出来ます。
更に、grabメソッドには同期通信と非同期通信の2種類があります。
同期通信は、プログラムが処理中の場合、ユーザーの操作を受け付けませんが、
非同期通信は、プログラムが処理中であってもユーザーの操作を受け付けてくれます。
この非同期通信がAjaxの最大の魅力だと思います。
言葉で説明しても分からないよ！という方は実際に体験してみましょう。

まずは、同期通信を体験してみましょう。sample.htmlに以下の記述をします。
<blockquote>&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
&lt;title&gt;HTML_AJAX.grad同期モードのテスト&lt;/title&gt;
&lt;script type="text/javascript" src="server.php?client=all"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
&lt;!--
<font color="#FF0000">function grab() {
&nbsp;&nbsp;document.getElementById("message").innerHTML = HTML_AJAX.grab('message.php');
}</font>
//--&gt;
&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;input type="button" onClick="<font color="#FF0000">grab()</font>" value="HTML_AJAX.grad同期モードの起動"&gt;
&lt;div id="message"&gt;メッセージ表示領域&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</blockquote>
ボタンをクリックすると、3秒後に「メッセージ表示領域」のテキストが切り替わります。
その3秒間ブラウザはユーザーの操作を受け付けません。

今度は非同期通信ですが、以下のように記述してください。
<blockquote>&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
&lt;title&gt;HTML_AJAX.grad非同期モードのテスト&lt;/title&gt;
&lt;script type="text/javascript" src="server.php?client=all"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
&lt;!--
<font color="#FF0000">function callback(message) {
&nbsp;&nbsp;document.getElementById("message").innerHTML = message;
}
function grab() {
&nbsp;&nbsp;HTML_AJAX.grab('message.php', callback);
}</font>
//--&gt;
&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;input type="button" onClick="<font color="#FF0000">grab()</font>" value="HTML_AJAX.grad非同期モードの起動"&gt;
&lt;div id="message"&gt;メッセージ表示領域&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</blockquote>
非同期通信では、ボタンをクリックした後でもユーザーの操作を受け付けてくるのが分かると思います。

grabメソッドは以下のように指定します。
<blockquote>同期通信の場合
HTML_AJAX.grab(file)
file：読み込むファイル名

非同期通信の場合
HTML_AJAX.grab(file, callback)
file：読み込むファイル名
callback：コールバック関数</blockquote>

今回紹介した機能以外にも沢山の機能があります。
ただし、PHP5では自動で沢山のことをやってくれるのですが、私のようにPHP4で仕事をすることが多い方にはあまり向かないと思います。（無理やり作ることは出来るのですが、ほぼ手作業でPHPを使う意味がありません＾＾；）

・関連記事
<a href="http://www.s-memo.net/blog/2006/11/prototypejs_1.php">prototype.jsの使い方</a>
<a href="http://www.s-memo.net/blog/2006/12/jquery.php">jQueryを使ってみよう</a>
<a href="http://www.s-memo.net/blog/2006/12/yahoo_ui.php">Yahoo! UIライブラリを使ってみよう</a>]]>
    </content>
</entry>

</feed> 

