まとめ ブログ ダウンロード 掲示板 メール

れぶろぐ

< 前月 翌月 > 最新


2007-12-02 (日)

Zend Framework 用 Piece_Flow, Piece_Right コンポーネント Ver.0.8 を公開

Zend Framework で Piece Framework の機能を利用するためのコンポーネントをバージョンアップしました。 前バージョン からの変更点は以下の通りです。

  • Revulo_Controller_Dispatcher_Flow (Piece_Flow を用いた Dispatcher)
    • Zend Framewowk 1.0.3 で Zend_Loader が変更されたことにより動作しなくなっていたのを修正
    • Piece_Flow 内で exception レベルのエラーが発生した場合に、例外を投げるよう実装
    • Piece_Flow_Continuation クラスでなく Piece_Flow_Continuation_Server, Piece_Flow_Continuation_Service クラスを用いるように変更
    • Piece_Unity の仕様に合わせて、flowDefinitions から flowMappings にオプション名を変更
    • 設定可能なオプションを追加
      • configExtension
      • enableGC
      • gcExpirationTime
    • フロー定義ファイルのデフォルトの拡張子を .flow に変更
  • Revulo_Validate_Right (Piece_Right を用いた Validator & Filter)
    • Piece_Right 内で exception レベルのエラーが発生した場合に、例外を投げるよう実装
    • Piece_Right 1.8.0 以降のバリデーションテンプレートの機能に対応

本バージョンでは、懸案だったエラー処理を実装しました。 内部で PEAR_ErrorStack のエラーを Exception に変換 しているので、 try〜catch でエラー処理できます。

ただし、Warning レベルのエラーは無視しています。 それをやろうとすると、エラーが発生したかどうかのチェックを随所に入れなければならないので、 そこまではやっていません。

あとは、最近の Piece_Unity に追いつくべく、ちょこちょこ機能追加してあります。

このエントリの続き: 2007-12-03 (月), 2008-07-30 (水)
Tags: Zend | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-03 (月)

Zend Framework 1.0.3 で Zend_Loader がこっそり変更された件

昨日の記事 と順番が前後してしまうが、 Zend Framework 1.0.3 がリリースされている。主な変更点は以下の通り。

  • Zend_Gdata improvements and support for YouTube, Picasa Web Albums, and Documents List APIs
  • Improved support for localization and translation, date/time and currency values, views, XML-RPC, and configuration
  • New and updated documentation and translations

Zend_Gdata が充実したかな、という印象を受けたが、 基本的にはバグフィックスリリースなので、特に大きな変更はない。

…はずなのだが、いつものごとく、 changelog にも載せずにこっそり変更している部分があって、 ZF 1.0.2 からバージョンアップしたら今までのコードが動かなくなった、 というお決まりのパターンになっていた。

ZF 1.0.3 では、Zend_Loader の isReadable メソッドが次のように変更されていた。

    public static function isReadable($filename)
    {
        if (!$fh = @fopen($filename, 'r', true)) {
            return false;
        }

        return true;
    }

何をしているかお解りだろうか? これは、そのファイルが存在し readable であるかどうかを、include_path も含めて調べている。 というか、自分も知らなかったが、PHP: fopen - Manual に、

オプションの3番目の引数 use_include_path に'1'又は TRUE を設定することにより、include_path のファイルの検索も行うこともできます。

と書かれているので、それを利用したらしい。 (ZF 1.0.2 では、include_path を1つ1つチェックする地道な方法を採っていた。)

はぁ、なるほど、と最初は思ったが、 よく見るとこの方法は @ を使って強引にエラーを無視しており、結構危なっかしい。 例えば自分は、セッション開始時に Zend_Loader を呼ぶような細工をしていたが、 この変更の影響で、Zend_Session の以下の箇所で Exception が throw されるようになってしまった。

/**
 * Hack to throw exceptions on start instead of php errors
 * @see http://framework.zend.com/issues/browse/ZF-1325
 */
set_error_handler(array('Zend_Session_Exception', 'handleSessionStartError'), E_ALL);
session_start();
restore_error_handler();
if (Zend_Session_Exception::$sessionStartError !== null) {
   set_error_handler(array('Zend_Session_Exception', 'handleSilentWriteClose'), E_ALL);
   session_write_close();
   restore_error_handler();
   throw new Zend_Session_Exception(__CLASS__ . '::' . __FUNCTION__ . '() - ' . Zend_Session_Exception::$sessionStartError);
}

あと、Zend MVC のメーリングリストに、

という投稿があったが、これも根っこは同じじゃないかという気がする。 この投稿に対し、

Caveat: there were some performance enhancements to Zend_Loader and Zend_Controller_Dispatcher_Standard in this release. However, they were all tested, and I can verify that I'm running code in production that uses these changes.

という、動かないのはそっちがおかしい、みたいな返答があったが、 現にここに、この変更のせいで今までのコードが動かなくなって、 デバッグしなければならなかった被害者がいるんですけどねぇ。

変更するなとは言わないが、こういう変更はこっそりやらず、 BugTrack や ChangeLog にきちんと記録を残してやって欲しい。 って、こう書くの、いったい何回目だろう?


(2007/12/05 追記)

Zend Framework のメーリングリストにも、上の問題に関する投稿があった。

それで、このメールに対し、 「この方法は ZF 1.0.2 までの方法に比べてこんなに速い。それに多くの場合は問題ない。」 と力説する返答が返されている。

いや、だから、そんなことは分かっているのだけれど、 なぜそういう(今までのコードが動かなくなる可能性のある)変更をこっそりやるのか、 という点をぜひ答えてもらいたい。 個人が趣味で作っている俺々フレームワークじゃないんだからさ。

Tags: Zend | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-04 (火)

Piece Framework と Zend Framework における flowMappings の比較

拙作の Zend Framework で Piece_Flow を使うためのコンポーネント では、Piece_Unity に合わせて flowMappings という設定項目を用意しています。 ただし、Piece_Unity と比べると設定方法が異なっているので、 ほとんど自分用のメモですが、違いをまとめておきます。

Piece_Unity では、flowMappings を次のように設定します。

    - name: flowMappings
      type: configuration
      value:
        - url: (フローID として使われる)URL
          flowName: (拡張子を除いた)フロー定義ファイル名

一方、拙作の Revulo_Controller_Dispatcher_Flow コンポーネントでは、次のように設定します。

flowMappings:
  フローID:
    module:
    controller:
    action:
    file: (拡張子付きの)フロー定義ファイル名

このように設定項目が違っていますが、おそらくこの違いは、 フロー ID にどのような文字列を使うか、という設計の違いに起因しています。

Piece_Unity では、URL をフロー ID として使います。 しかし、それをそのままフロー定義ファイル名に流用するのは難しいので、 flowName という別のパラメータをフロー定義ファイル名のために用意しているのだと思います。

一方、自分は、ユーザーが選んだ Registration といった文字列をフロー ID にする方式を選びました。 そして、そのフロー ID を元にして、フロー定義ファイル名のデフォルト値も設定しています。 file: パラメータは、フロー定義ファイル名をデフォルトとは違う名前にしたい時に使うもの、という位置付けです。

Piece_Unity では、フロー ID というのは内部で使われる値であり、 外から見えるフローの名前は flowName というように区別されています。

一方、拙作のコンポーネントでも、フロー ID はあくまでも内部で使われる値です。 ただ、通常、この値はフロー定義ファイル名と一致しているので、 Piece_Unity の flowName と同じように、フロー名と呼んでも差し支えないものになっています。


(2007/12/05 追記)

ITEMAN さんがブクマのコメントで、

Piece_Unityがフロントコントローラでないのも違いかと思われる

と書いていますが、確かにその違いが根本なのでしょう。

ついでなので、Zend Framework 側の事情をもう少し書いておきます。 Zend Framework の標準設定では、 http://example.com/module/controller/action のような URL によって、 どのアクションを実行するかが決定されますが、 controller, action のデフォルト値は index と決められているので、例えば http://example.com/ , http://example.com/index/ , http://example.com/index/index/ は全て同じアクションを実行することになります。

このように、1つのアクションに対し複数の URL が対応してしまっているので、 フローのマッピングをする際に URL を登場させたくないという思いから、 上で書いたような方式にしています。

Tags: Piece Zend | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-09 (日)

PukiWiki Plus! rev.1494 を rewritemap.inc.php プラグインに対応させるパッチを試験公開

今まで rewritemap.inc.php プラグインは、実質、本家 PukiWiki でしか使えませんでしたが、 これで PukiWiki Plus! でも使えるようになりました。

ダウンロードは以下のページからお願いします。

今回のパッチは、rewritemap プラグインに限らず、 mod_rewrite を使った URL 書き換えなどに汎用的に使えるような形にしてあります。 これに関連する提案を PukiWiki Plus! の BugTrack にしているので、なにか意見のある人は書き込みして下さい。

このエントリの続き: 2007-12-16 (日)
Tags: PukiWiki | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-10 (月)

Yahoo!ブックマークのブログパーツ

Yahoo!ブックマークの被リンク数が、画像として取得できるようになっていた。

まだ、きちんと見ていないけれど、

  • JavaScript を使わずに表示
  • 数字だけを表示

っていうのもできそうなので、 自作の PukiWiki 用プラグインでもこれを利用するように更新する予定。

このエントリの続き: 2007-12-25 (火)
Tags: SBM | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-11 (火)

1つの郵便番号が2都道府県にまたがる例

郵便番号を入力してもらって、そこから都道府県を割り出すことを考えていたのだけれど、 実際に郵便番号データを調べてみると、都道府県が1つに定まらない例が3件あった。

23235,"498  ","4980000", ... ,"愛知県","弥富市","以下に掲載がない場合",0,0,0,1,0,0
24303,"498  ","4980000", ... ,"三重県","桑名郡木曽岬町","以下に掲載がない場合",0,0,0,1,0,0

26303,"618  ","6180000", ... ,"京都府","乙訓郡大山崎町","以下に掲載がない場合",0,0,0,1,0,0
27301,"618  ","6180000", ... ,"大阪府","三島郡島本町","以下に掲載がない場合",0,0,0,1,0,0

40642,"871  ","8710000", ... ,"福岡県","築上郡吉富町","以下に掲載がない場合",0,0,0,1,0,0
44203,"871  ","8710000", ... ,"大分県","中津市","以下に掲載がない場合",0,0,0,1,0,0

まいったな、こういうケースがあるのか。

ただ、郵便番号データの説明 - 日本郵便 を読むと、

9)の項目位置に、「"以下に掲載がない場合"」とは、 お探しの町域が見つからない場合にお書きいただく番号であり、 町域を特定するものではありませんのでご注意ください。

と書かれていたので、 これらの郵便番号のところに住んでいる人がいるわけではないらしい。 (これは間違いでした。)

ということは、郵便番号を入力してもらう際に、 「以下に掲載がない場合」の値は認めないという仕様にしておけば、 都道府県を特定できると考えて良いわけか。


(2007/12/12 追記)

コメントで指摘があったように、「以下に掲載がない場合」の郵便番号に押し込められている住所も存在するので、 入力を認めない、というのはまずいです。 もし真面目にやるのなら、上の3件だけ特別扱いするのがいいかもしれません。

このエントリの続き: 2007-12-12 (水), 2007-12-13 (木)
Tags: zipcode | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink
本日のコメント(全2件) [コメントを書く]

# tt [参考になりました。 ただし、3-7桁目が「0000」でないと指定できない住所はありますよ(その他ですから)。この例で..]

# revulo [コメントありがとうございます。調べてみたら木曽岬町新輪もその他扱いなので、郵便番号だけ教えてもらっても都道府県は特定..]


2007-12-12 (水)

1つの郵便番号が2都道府県にまたがる例 (2)

昨日の 郵便番号から都道府県が特定できない3件 について、 郵便番号データに載っている住所と、マピオンに載っている住所一覧とを比較してみた。

マピオンの住所一覧は、

※上記の住所一覧は全ての住所が網羅されていることを保証するものではありません。

と書かれているし、いつの時点のデータなのかよく分からないが、 とりあえずこれを頼りに比較してみると、次のような結果になった。

  • 郵便番号 4980000 に該当する住所:
    • 愛知県: 曙、栄南町、大縄場町、大藤町、加稲山町
    • 三重県: 新輪
  • 郵便番号 6180000 に該当する住所:
    • 京都府: 該当無し
    • 大阪府: 該当無し
  • 郵便番号 8710000 に該当する住所:
    • 福岡県: 該当無し
    • 大分県: 該当無し

この木曽岬町新輪というところを Google マップで見てみると、

干拓地で、人が家を建てて住んでいるようなところではなさそうだ。 つまり、「私の家の郵便番号は 4980000 です」という人がもしいたら、 愛知県の人だと判断しても差し支えないだろう。

以上のことから、あくまでも便宜的にだけれども、

24303,"498  ","4980000", ... ,"三重県","桑名郡木曽岬町","以下に掲載がない場合",0,0,0,1,0,0
27301,"618  ","6180000", ... ,"大阪府","三島郡島本町","以下に掲載がない場合",0,0,0,1,0,0
40642,"871  ","8710000", ... ,"福岡県","築上郡吉富町","以下に掲載がない場合",0,0,0,1,0,0

の3行を郵便番号データから取り除くことで、 郵便番号 → 都道府県 の変換用データとして使うことができると思う。

このエントリの続き: 2007-12-13 (木)
Tags: zipcode | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-13 (木)

郵便番号 → 都道府県 の検索をデータベースを使って行う

市区町村名まで分かるようにした方がいいかもしれないが、 まずは 郵便番号 → 都道府県コード (都道府県名) というところまでを、 MySQL を使ってやってみる。

1. 全国地方公共団体コード(JIS X0401、X0402)……… 半角数字
2. (旧)郵便番号(5桁)……………………………………… 半角数字
3. 郵便番号(7桁)……………………………………… 半角数字
4. ......

・各項目は、半角の「,」(カンマ)で区切っており、上記の2)〜9)までの項目は「"」(ダブルクォーテーション)で囲んでいます。

全国地方公共団体コードの上2桁が JIS X 0401 で定められた都道府県コードとのことなので、 まず、郵便番号データから郵便番号と都道府県コードだけを抜き出す。 PHP 5 なら、こんなコードで処理できる。

<?php

$lines = file('KEN_ALL.CSV');

$data = '';
foreach ($lines as $line) {
    $zipcode  = substr($line, 15, 7);
    $jisx0401 = substr($line, 0,  2);
    $data .= $zipcode . ',' . $jisx0401 . "\n";
}

file_put_contents('zip.csv', $data);

?>

ただし、元の郵便番号データには、

05201,"011  ","0110951", ... ,"秋田県","秋田市","土崎港相染町",0,1,0,1,0,0
05201,"011  ","0110951", ... ,"秋田県","秋田市","土崎港古川町",0,1,0,1,0,0

のように同じ郵便番号の行があるため、このデータには重複する行が含まれてしまっている。 そこで、sort と uniq コマンドを使って重複行を除く。

$ sort zip.csv | uniq > zip2.csv

ところが、1つの郵便番号が2都道府県にまたがる例 があるので、 これでもまだ郵便番号が重複している箇所がある。 そこで、昨日調べた結果 を基に、

24303,"498  ","4980000", ... ,"三重県","桑名郡木曽岬町","以下に掲載がない場合",0,0,0,1,0,0
27301,"618  ","6180000", ... ,"大阪府","三島郡島本町","以下に掲載がない場合",0,0,0,1,0,0
40642,"871  ","8710000", ... ,"福岡県","築上郡吉富町","以下に掲載がない場合",0,0,0,1,0,0

この3つに該当する行を取り除くことにする。

$ grep -v -e 4980000,24 -e 6180000,27 -e 8710000,40 zip2.csv > zipcode.csv

これで、必要なデータだけ抜き出した CSV ファイルができた。


次に、都道府県コードと都道府県名とを対応づけるために、 以下のような CSV ファイルを作っておく。

  • JISX0401.csv
01,北海道
02,青森県
03,岩手県
04,宮城県
05,秋田県
06,山形県
07,福島県
08,茨城県
09,栃木県
10,群馬県
11,埼玉県
12,千葉県
13,東京都
14,神奈川県
15,新潟県
16,富山県
17,石川県
18,福井県
19,山梨県
20,長野県
21,岐阜県
22,静岡県
23,愛知県
24,三重県
25,滋賀県
26,京都府
27,大阪府
28,兵庫県
29,奈良県
30,和歌山県
31,鳥取県
32,島根県
33,岡山県
34,広島県
35,山口県
36,徳島県
37,香川県
38,愛媛県
39,高知県
40,福岡県
41,佐賀県
42,長崎県
43,熊本県
44,大分県
45,宮崎県
46,鹿児島県
47,沖縄県

最後に、これらのデータを MySQL に放り込む。 以下の SQL を実行し、テーブルを作成。

CREATE TABLE `zipcode` (
  `id` int(7) unsigned zerofill NOT NULL default '0000000',
  `jisx0401` tinyint(2) unsigned zerofill NOT NULL default '00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

CREATE TABLE `jisx0401` (
  `id` tinyint(2) unsigned zerofill NOT NULL default '00',
  `name` varchar(4) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

CSV ファイルからテーブルにデータをインポート。

mysql> USE データベース名;
mysql> LOAD DATA INFILE "/home/revulo/zipcode.csv" INTO TABLE zipcode FIELDS TERMINATED BY ',';
mysql> LOAD DATA INFILE "/home/revulo/JISX0401.csv" INTO TABLE jisx0401 FIELDS TERMINATED BY ',';

動くかどうか確認。

mysql> SELECT zipcode.id, jisx0401.name FROM zipcode, jisx0401
    -> WHERE zipcode.jisx0401=jisx0401.id AND zipcode.id=1000001;
+---------+-----------+
| id      | name      |
+---------+-----------+
| 1000001 | 東京都    |
+---------+-----------+
1 row in set (0.00 sec)

あとは、これに相当する SQL を実行してくれるプログラムを、適当に書けばよい。

Tags: zipcode MySQL | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-16 (日)

PukiWiki Plus! rev.1494 を rewritemap.inc.php プラグインに対応させるパッチを公開

先週のパッチ で不足していた分の修正をさらに追加し、正式に公開しました。 ダウンロードは以下のページからお願いします。

今回の修正は、SKIN_DIR, IMAGE_DIR となっていた箇所を SKIN_URI, IMAGE_URI に書き換えただけですが、 まさかあんなに修正箇所が多いとは…。 おかげでパッチのサイズが倍近くにふくれあがっています。

Tags: PukiWiki | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

PukiWiki 用プラグイン geshi.inc.php Ver.1.2 beta2 を公開

ベータ版ですが、掲示板にて公開中なので、一応ここにも書いておきます。

外部スタイルシートへの対応なども含めて、いろいろと変更しています。 問題がなさそうなら、これをほぼそのまま Ver.1.2 として公開する予定です。

Tags: PukiWiki | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-21 (金)

ドロップダウンメニューを作る際の z-index の設定

CSS だけで作るドロップダウンメニューを試してみた。

ところが実際に組み込んでみると、メニューが透けて見える感じになってしまう。 どうも、メニュー以外の部分が手前に表示されているようだったので、 メニューに z-index を設定したりしてみたけれど全く効果無し。

そうして、いろいろ調べたり試行錯誤してみて、なんとなく解決法が分かった。 こういうメニューでは position: relative; という設定を使うが、 position: relative; の箇所に z-index をセットで指定するといいようだ。

今回の場合は、

<div id="header">

<h1 id="title">......</h1>

<div id="menu">
......
</div>

</div>

のような HTML になっていたが、header の方にも position: relative; を指定していたので、

#header {
	position: relative;
	z-index: 10;
}

のように z-index を設定してみたところ、ようやくメニューが手前に表示されるようになった。

なんで #menu の中身じゃなく #header の方に z-index を設定するとうまくいくのかがよく分からないが、 とにかく position: relative; と z-index はペアで使う、と覚えておくといいのかもしれない。

Tags: CSS | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-25 (火)

PukiWiki 用プラグイン socialbookmark.inc.php Ver.1.2 を公開

各種ソーシャルブックマーク用のアイコンを表示するプラグインをバージョンアップしました。 前バージョン からの変更点は以下の通りです。

ダウンロードは以下のページからお願いします。

このエントリの続き: 2008-08-03 (日)
Tags: PukiWiki | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

2007-12-26 (水)

PukiWiki Static! への提案

PukiWiki Static! という、PukiWiki Plus! の静的 HTML 版を sonots さんが公開している。

いくつか気が付いた点があるので、sonots さんのところに書き込もうかと思ったが、 まだ考えがまとまらない部分があるので、とりあえずここに書いてみる。

  • AllowOverride Indexes していないと、DirectoryIndex not allowed here のエラーが出て動かない
  • encode, decode をそれぞれ lib/func.php の get_page_uri(), plugin/read.inc.php で呼ぶようにすれば、rewritemap プラグインはおそらく不要
  • どうせ経過時間は正しく表示されないので、$show_passage = 0; をデフォルトに
  • ページを名前変更した際、変更前のページに対応するダンプファイルは、リネームか削除して欲しい

例えば foo → bar にリネームした時、ダンプファイルが残っていると、 リネームしたはずなのに foo.html という URL で以前のページがずっと見られてしまう。 でも、リネーム前のダンプファイルを削除してしまうと、 他のページからリンクが張られている場合に、リンク切れになってしまうのか。 それも嫌だな。

ということは、rename プラグインは使わずに、

  1. ページ foo をテンプレートにして、ページ bar を新たに作成
  2. ページ foo を削除
  3. foo → bar にリダイレクトの設定

ということを手作業でやればいいのか?

Tags: PukiWiki | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink
本日のコメント(全4件) [コメントを書く]

Before...

# sonots [一行抜けてた。こうですかね? RewriteEngine On RewriteBase /pukiwiki-stat..]

# revulo [1. 標準は DirectoryIndex を使う設定の方がいいと思います。ただ、どこかに注意書きが欲しいなと思った..]

# sonots [1. そういえば DirectoryIndex index.html index.php 方針では、 $script..]


2007-12-28 (金)

APC 3.0.16 がリリース

以前書いた pthread mutex Locks が、デフォルトのロック方式になったようだ。 それと、一応試してみたが、 誤ったファイルのキャッシュを返すことがあるバグ はまだ直っていなかった。 この辺は、現在開発中だという APC 3.1 に期待するか。

あと APC でなく XCache の話だけれど、このバグに関連するこんな書き込みを発見。

やはり sapi_get_stat() は信用できないと書かれている。 でも XCache 1.2.1 のコードを見てみると、この修正は適用されていないんだよな。 うーん、このバグって、Apache のバージョンとかファイルシステムに依存するのかな?

Tags: PHP | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink

追記