スタッフブログ

  • haltさんの最新配信
  • RSS

do-whileでエラー遷移を制御する

 : PHP 2008/7/16 2:04

Blogger's Avatar

PHP4の最終リリースもせまり、もうPHP4を触る事はないだろうと思っていたのになぜかPHP4のコードを書いているhaltです。 今日はPHP4でのエラー遷移制御のバッドノウハウ…いやテクニックを紹介します。 通常、エラー発生時にメッセージを貯めていくコードを書くと、以下のような感じになり がちです。
class example1_controller
{
    function post()
    {  
        $comma_count = 3;
        $filename = __FILE__;
        if (file_exists($filename)) {
            if ($filedata = file_get_contents($filename)) {
                $csv_data = array();
                $rows = explode("\n", $filedata);
                array_shift($rows); //先頭行はタイトルなのでイラネ
                if (count($rows) < 1) {
                    $this->error->addError('parse error.');
                } else {
                    foreach ($rows as $row) {
                        $cols = explode(',', $row);
                        if (count($cols) != 4) {
                            $this->error->addError('invalid column count.');
                            break;
                        }
                        $csv_data[] = $cols;
                    }
                }
            } else {
                $this->error->addError('file read failed.');
            }
        } else {
            $this->error->addError('target file not found.');
        }

        // 途中でエラーがあってもここを通したい
        $this->render->setAttribute('error', $this->error);
        $this->render->setTemplate('test.tpl');
    }
}
「エラーがなければ次へ」というifを繰り返して先へ進むこのコードですがネストが深く なってしまいたいへん見辛いコードになっています。 PHP5なら、tryブロックで囲んでエラーが発生したらthrowする事で、ネストする事なしに 処理をとばせるのですが、PHP4にはtry-catch構文がないので仕方なくif文で…となると>>立ちまち汚いコードがうまれてしまいます。 そこで他の人はどうやっているのだろうと検索してみたところ、一回で抜けるようにした do-while文を使ってtryブロックのように囲み、問題が発生した時点でbreakする事によっ て擬似的にtry-catchのような遷移を実現するという方法を知りました。 あきらかにクセがあるので使うタイミングを良く考える必要がありそうですが、具体的に は以下のような感じです。
class example2_controller
{
    function post()
    {
        $comma_count = 3;
        $filename = __FILE__;

        do {
            if (!file_exists($filename)) {
                $this->error->addError('target file not found.');
                break;
            }

            $filedata = file_get_contents($filename);
            if ($filedata === false) {
                $this->error->addError('file read failed.');
                break;
            }

            $csv_data = array();
            $rows = explode("\n", $filedata);

            array_shift($rows); //先頭行はタイトルなのでイラネ
            if (count($rows) < 1) {
                $this->error->addError('parse error.');
                break;
            }

            foreach ($rows as $row) {
                $cols = explode(',', $row);
                if (count($cols) != 4) {
                    $this->error->addError('invalid column count.');
                    break;
                }
                $csv_data[] = $cols;
            }
        } while(0);

        // 途中でエラーがあってもここを通したい
        $this->render->setAttribute('error', $this->error);
        $this->render->setTemplate('test.tpl');
    }
}
do-whileブロック内では、エラー発生時点でbreakを使って処理を抜けている為、if文連>打のようにネストが深くなる事はありません。do-whileテクニックを知っている人が見れ ば非常に見易いでしょう。ただし、ネスト回数の少ないコードでこれを使うと意図が見え づらく、混乱の元になりそうです。 クラスなどを利用して擬似的にExceptionを扱う方法もあるようなのですがこのあたりで>調査を終わりにしたいと思います。こういった方法を使うよりもPHP5を使った方がずっと 幸せになれるからです。

Windows Mobileを便利にする11のフリーソフト

 : 技術全般 2008/7/8 3:07

Blogger's Avatar

haltです。
willcomから発売されているW-ZERO3などのPHSは、WindowsMobile搭載によって普通の電話
としての機能だけでなく、様々な機能を持たせる事ができます。
例えば、エクセルやワード、IEなどを使えるのはWindows Mobileならではでしょう。
また、マイクロソフトのソフトウェアだけでなく、サードパーティーが開発したソフトウ
ェアも自由にインストールすることができます。今回はW-ZERO3を便利にするフリーウェ>アについて紹介します。

* EasyDial
http://d.hatena.ne.jp/KOTETU/20051005/p1

アイコンをクリックするだけでダイヤルアップの接続、切断を行う事ができます。デフォ
ルトでは手動ダイヤルアップの手順が面倒なのでこのアプリケーションをインストールし
ておくと便利です。

* wifictrl
http://w03holic.seesaa.net/article/51166074.html

EasyDialと同じように無線LANのon/offをきりかえる事ができるアプリケーションです。

* PocketPutty
http://www2h.biglobe.ne.jp/~m-saeki/junk/PocketPuTTY.html

いざという時のSSH接続のために。自分はサーバにirssiをいれてPocketPuttyからsshして
IRCをみたりしてました。

* HttpAdjustClock
http://caviar.air-nifty.com/note/software/adjclock.html

HTTPを利用して時刻あわせをおこないます。W-ZERO3は自動時刻あわせがないようなので>これを使って定期的に時刻をあわせておくと良いでしょう。

* Criw0
http://www.fastwave.gr.jp/diarysrv/misuzilla/200612c.html

IRCクライアント。最新はcodereposに。

* OffisnailDate6
http://www.offisnail.info/archives/2007/07/18/offisnail_date_offisnail_note/

カレンダー、予定管理のアプリケーションです。デフォルトのものが貧弱なので。

* QDz
http://www.nicque.com/PQz/

軽量の連絡帳。起動が早く軽いのでデフォルトのものとおきかえて。

* PlaceEngine
http://www.placeengine.com/

無線LANの電波強度を元に現在位置をわりだすアプリケーション。ログをとるようにして>おくと自分があるいた位置がわかります。おもしろいです。

* POSync
http://www.geocities.jp/bjsoftab4/zero3.html

googleカレンダーと内蔵の予定表をsyncできるアプリケーションです。都度syncしなけれ
ばならないのが面倒ですが、googleカレンダーをつかっているなら是非。

* ctrlswapmini
http://hp.vector.co.jp/authors/VA004474/wince/wince.html

インストールする事で「ベル打ち」による入力が可能になります。最近の携帯電話はなぜ
かベル打ちできなくなってしまったのでベル打ち信者にはたまりません。

* YTaskMgr
http://www31.ocn.ne.jp/~yoshio2/ytaskmgr-1.html

画面回転ボタンにランチャー機能をわりあてるアプリケーション。これにEasyDialやwifictrlを登録するだけでかなり使いやすくなります。

Windows Mobile系の端末はカスタムしてようやく便利になるのでいろんなアプリケーションをインストールして試してみましょう。

Jsphonをcodereposにアップロードしました。

 : 技術全般 2008/7/2 2:51

Blogger's Avatar

haltです。
皆さんはJsphonというライブラリをご存知でしょうか。 www.hawklab.jp のhawkさんが書
かれたPHPでJSONをエンコードしたりデコードする為のライブラリです。PHPにはjson_encodeとjson_decodeという関数がありますが、比較的新しいPHPにしか実装されていない為、古いバージョンでJSONを利用する場合は別途ライブラリが必要になります。

非常に多くのライブラリやアプリケーションがこのJsphonを利用しているのですが、残念
ながらhawkさんがJsphonを公開していた www.hawklab.jp が閉鎖してしまった為、ライブ
ラリの入手ができなくなりました。

そこで、JsphonがPHPライセンスである事に着目し、私のディスク内にあったJsphonをcodereposにアップロードしました。

codereposとは、http://coderepos.org/ にある、ソースコード共有サイトで、みんなで公開svnリポジトリを使う事で自由にソースを公開したり、編集したりできるサイトの事です。これにより、

pear install http://svn.coderepos.org/share/lang/php/Jsphon/release/Jsphon-1.0.1.tgz

というコマンドを入力するだけでJsphonがインストールできるようになりました。特にPEARに依存しているわけではないので、わざわざPEARコマンドを使わなくても、上のURLからtgzファイルをダウンロード、解凍するだけで利用できます。

例えば、jsonを返すapiを利用する場合、

require_once 'Jsphon/Decoder.php';
$json = new Jsphon_Decoder();
$result = $json-&gt;decode($json_data);

のように書きます。

オープンなライセンスは素晴らしいですね。

HatenaSyntaxを使ってブログや掲示板にはてな記法を導入しよう

 : 技術全般 2008/6/25 2:16

Blogger's Avatar

haltです。

今日ははてな記法を簡単に利用できるPHPライブラリ「HatenaSyntax」を紹介します。

はてな記法とは、株式会社はてなのサービスの中で利用されている記法です。

http://hatenadiary.g.hatena.ne.jp/keyword/%E3%81%AF%E3%81%A6%E3%81%AA%E8%A8%98%E6%B3%95%E4%B8%80%E8%A6%A7

この記法を利用することで、わざわざ複雑なHTMLを書かなくてもシンプルで短いコードを追加するだけで複雑な表現ができるようになります。

HatenaSyntaxはanatooさんが開発し、googlepagesで公開されています。現在の最新バージョンは0.06のようです。

http://anatoo.study.googlepages.com/HatenaSyntax.php.ver006.txt

では実際に使ってみましょう。

引用:

<?php
require_once 'HatenaSyntax.php';

$text = <<<EOD
* みだし
ほんぶん

>>
引用
<<

EOD;

$hatena = new HatenaSyntax();
echo $hatena->parse($text);
?>


たったこれだけです。requireしたあと、HatenaSyntaxをnewしてparseメソッドを呼び出すだけ。簡単ですね。

ブログや日記、Wikiの表現力を高めるのに使ってみてはいかがでしょうか。

今から覚えるXen part2. Xenのインストール

 : 技術全般 2008/6/16 14:46

Blogger's Avatar

前回のエントリを読んでない方はこちらをどうぞ。

今から覚えるXen part1. Xenについて

前回はXenについて簡単に説明しました。いつまでも概要について説明するよりは実際に動いているものを見た方が理解が早いので早速イン
ストールに挑戦してみましょう。

part1.の後半で紹介したように、インストールする環境はUbuntu Linuxになります。SUSEやFedora、CentOSに関するXenのインストール報告
は多いのですがUbuntuで運用しているという人があまりいないのであえて挑戦です。他のディストリビューションを利用している人は各自>でインストール方法を検索してください。

インストール手順はdebパッケージをインストールするだけなので簡単です。aptitude search xenで検索してそれっぽいパッケージをイン>ストールします。具体的には以下のパッケージになります。

<br />
-libxen3<br />
-linux-image-xen<br />
-linux-xen<br />
-python-xen-3.2<br />
-ubuntu-xen-server<br />
-xen-docs-3.2<br />
-xen-hypervisor-3.2<br />
-xen-shell<br />
-xen-tools<br />
-xen-utils-3.2<br />
-linux-restricted-modules-xen<br />


あたりをインストールしました。インストールしたXenのバージョンは3.2になります。
これであとはネットワークの設定をしてイメージを作るだけなのですが、残念ながら私がインストールしたカーネルイメージにバグがあっ>たようで、ネットワーク設定がどうやっても認識しませんでした。

Bug #204010 in xen-3.2 (Ubuntu): “networking not working>”

を参考に、ひらのさんという方が作ったイメージをダウンロードしてインストールするとこの問題が解決できます。

ひらのさんのサイトから、自分の環境にあったイメージをダウンロードしま
す。私は今回64bit環境だったのでlinux-image-2.6.24-16-xen_2.6.24-16.30zng1_amd64.debをダウンロード。

<br />
sudo dpkg -i linux-image-2.6.24-16-xen_2.6.24-16.30zng1_amd64<br />


としてインストールしました。

これでインストール作業はすべて完了です。再起動したら、

<br />
sudo xm list<br />


として、Domain-0が見えるかチェックしてください。

次回はネットワークの設定とイメージの作成を行います。

スタッフブログ最新
カテゴリ一覧

〒104-0061 東京都中央区銀座1丁目3番3号 G1ビル7階
お問い合わせ TEL 03-3524-8860

Copyright(c) 2012 RYUS.All Rights Reserved.