ようこそゲストさん

mitc - 日記

2007/05/16(水) dBugをPostgreSQLに対応させてみた

はてブ 2007/05/16 15:15 PHPmiff
昨日からdBugを使っていますが,やっぱりPostgreSQLのリソースが表示できないのは気持ち悪いです.
私の環境が悪いのかわかりませんが,とにかくエラーメッセージが表示されていることですしソースコードを覗いてみました.
その結果,dBug*1のデータベース表示機能は,そもそもMySQL用に書かれていて他のDBのはオマケであることがわかりました.

簡単に書くと,関数の使用時に
// $dbには,MySQLなら"mysql",PostgreSQLなら"pg"が入っている
call_user_func($db."_data_seek",$var,0);
こんな感じで接頭辞だけ変えて関数を呼び出すことで対応させようとしているんですが,
PHPのMySQL関数とPostgreSQL関数には,名前レベルでそれほど互換性があるわけではなく,
存在しない関数を呼び出そうとしてしまっているのです.
この問題を完全に解決するには,dBug内でラッパ関数を作って差異を吸収するか,
関数のネームテーブルを作ってそれ経由で呼び出すか*2しないといけませんが,
とりあえずそれほど元コードを変えないで対応してみました*3

PostgreSQL関数
MySQL関数

dBug公式
This software is distributed under the GNU General Public License
とのことなので,公式に対応されるまでの繋ぎとして改変版をここに置いときます*4
お約束ですが,このコードを用いて起こった一切の損害は保証しません.
GPLの改変なので,これもGPLですね.
公式ですら
dBug has been downloaded 5855 times*5
なので需要があるのか無いのか謎ですが.

dBug.zip

*1 : 書いた時点のバージョンは1.2

*2 : 両者にそれほど違いはありませんが

*3 : PostgreSQLに対応させただけですよ.

*4 : 拙い英語ですが作者の方にはメール送りました.元々対応させるつもりだったのかよくわからないので迷惑だったかも…….

*5 : 2007/5/16 15:09現在

ソースコード改変

pg_data_seekは存在しないので,代わりにpg_result_seekを使う
pg_result_seek
// 313行
// ここでは,表示するためにシークしたデータベースリソースのカレント行を頭に戻している
 - call_user_func($db."_data_seek",$var,0);

 + if ($db == "pg") {
 + 	call_user_func($db."_result_seek",$var,0);
 + } else {
 + 	call_user_func($db."_data_seek",$var,0);
 + }

pg_fetch_arrayにPG_ASSOCという定数は使えないので,代わりにPGSQL_ASSOCを使う.
pg_fetch_array
// 300行
// $iで読み込む行番号の指定も行う
 - $row=call_user_func($db."_fetch_array",$var,constant(strtoupper($db)."_ASSOC"));

 + if ($db == "pg"){
 + 	$row=call_user_func($db."_fetch_array",$var,$i,constant("PGSQL_ASSOC"));
 + } else {
 + 	$row=call_user_func($db."_fetch_array",$var,constant(strtoupper($db)."_ASSOC"));
 + }
pg_fetch_fieldという関数は存在しないので,
代わりにpg_field_nameを使う.
pg_field_name
// 295行
 - $field[$i]=call_user_func($db."_fetch_field",$var,$i);

 + if($db == "pg") {
 + 	$field[$i]->name=call_user_func($db."_field_name",$var,$i);
 + } else {
 + 	$field[$i]=call_user_func($db."_fetch_field",$var,$i);
 + }

$field[$i]について

元々のmysql_fetch_fieldは,フィールド情報を構造体で返している.
$field[$i]の値は,フィールド名をpg_fetch_arrayのキーにアクセスするためだけに使っていて,
アクセスしているメンバは$field[$i]->nameのみ.
// 303-308行
for($k=0;$k<$numfields;$k++) {
	$tempField=$field[$k]->name;
	$fieldrow=$row[($field[$k]->name)];
	$fieldrow=($fieldrow=="") ? "[empty string]" : $fieldrow;
	echo "<td>".$fieldrow."</td>\n";
}
PostgreSQLには,全く同じような値を返す関数が無いので,
上のコードでは,勝手にnameをでっちあげてそこにフィールド名を入れてます.
この操作は,文法的に正しくない気がします*6
とりあえず元ソースからの変更箇所を多くしたくなかったので.

二箇所変更で多分文法的に問題無い方法

// 295行ら辺をこんな感じに書き換え
$tmpFieldName = "";

if($db == "pg") {
	$tmpFieldName = call_user_func($db."_field_name",$var,$i);
} else {
	$tmpFieldName = call_user_func($db."_fetch_field",$var,$i);
	$tmpFieldName = $tmpFieldName->name;
}
$field[$i] = $tmpFieldName;
下側
// 303-308行をこんな感じに書き換え
for($k=0;$k<$numfields;$k++) {
	$tempField=$field[$k];
	$fieldrow=$row[($field[$k])];
	$fieldrow=($fieldrow=="") ? "[empty string]" : $fieldrow;
	echo "<td>".$fieldrow."</td>\n";
}

*6 : 詳しくはわからないですが,少なくとも感覚的にはおかしな操作です

その他メモ

関係ありませんが,
* NOTE!
* ==============
* forceType is REQUIRED for dumping an xml string or xml file
* new dBug ( $strXml, "xml" );
らしいです.


名前:  非公開コメント   

E-Mail(任意/非公開):
URL(任意):
  • TB-URL  http://mitc.s279.xrea.com/diary/026/tb/

2007/05/16(水) Sleipnir2の天気表示プラグインSkyPaletteを使ってみた

はてブ 2007/05/16 11:41 雑記miff

Sleipnir2

私は,この前PortableFirefoxを導入しましたが,相変わらずSleipnir2も使っています.
というか,メインPortableSleipnir2でサブがPortableFirefoxという感じです.
Headline-Readerがどうしても手放せなくて.

この前mixi用のプラグインが出たSleipnir2ですが,今度はお天気表示のプラグインが出ました.
ちょうどFirefoxエクステンションのForecastFoxみたいな感じですね.

お天気情報のソースはウェザーニュースからだそうで.
開発者の方の日記は,こちら
http://www.fenrir.co.jp/blog/2007/05/_skypalette_.html

この日記を書いた後に他の方の日記を検索すると色々あり,もっといい情報が載っていて赤面.

インストール

Sleipnir2プラグインのインストールは簡単です.
Firefoxと同じなんですが.

download.png
ダウンロードリンクを選択すると

download_2.png
インストールするか聞かれてはいを選択すると

download_3.png
インストールされて,そのまま再起動

weather.png
再起動すると,ステータスバーの右端にお天気アイコンが表示されるようになります.

一番右がお天気の情報で,右から二つ目が選択中の地域.
初期状態でなぜか接続している場所の地域になってるのは接続元から判定してるのかな*1

*1 : もしかしたらデフォルトが大阪なのかもしれない

設定

weather_config.png

選択中の地域の部分をクリックするとメニューが出ます.
設定項目は,「常に新しいウィンドウで開く」と「新しいウィンドウをアクティブにする」のみ.
お天気と何の関係があるかわかりづらい項目ですが,
これらはSkyPlaletteがウェブページを開く時のSleipnir2の動作を設定する項目です.
例えば,次に紹介するウェザーニューストップページを開く機能もそうですし,
閲覧時に詳しいページを見るためにページを開く機能にも適用されます.

ウェザーニューストップページは,その名の通りウェザーニュースのトップページを開く項目です.
別に設定中の地域のページを開いてくれたりはしません.

選択できる地域は,ウェザーニュースで選択できる地域と同じです.
なのでどの程度細かく指定できるかは,ウェザーニュースのページで確認できます.

閲覧

weather_tooltip.png
お天気の部分にマウスカーソルをあわせると,ツールチップで少し詳しい情報を確認できます.

weather_detail.png
お天気の部分をクリックすると,もっと詳しい情報を確認できます.

weather_detail_info.png
1:こんなページを開きます
2:お天気マークの詳細を開きます
3:例えばこんな感じのピンポイントお天気ページを開きます

感想

便利ですが,多機能で無いので好みがわかれるかな.
例えば,私はお天気マークのマウスオーバーで
ツールチップではなくお天気の詳細情報が表示されて欲しいし,
欲を言うならわざわざウェブページを開かなくても
このプラグイン上で細かいお天気情報も閲覧したい.
そういう細かいカスタマイズができるのがSleinpir1.6の魅力だったんですが,
さすがにSleipnir2のしかも公式とはいえ1プラグインに求めるのは求めすぎかな?
ただ,もうちょっと柔軟な運用ができるようにはして欲しいなあ…….

ただ,MixiChainも同じような部分で動作に不満があるので,
多分今のFenrirとしては,そんな方針でプラグインをリリースしているのでしょう.
とはいえお天気情報を手軽に確認できるという部分は満たしているので十分使えるとは思います.
あと,SkyPaletteという名前は私は好きです.

アメール

ちなみに,お天気情報だとアメールというサービスがお勧めです.
http://amail.am/

どんなサービスかというと,メールアドレスを登録しておくとその日が雨なら朝の指定した時間にメールを送ってくれるというもの.
これが傘忘れの防止にかなり役立ちますよ.
登録してから多分半年くらい経ちますが,今のところここ経由でアドレスが漏れたと思われる迷惑メールはきてません.
今後のことはわかりませんが.

Sleipnir2のプラグイン仕様

とりあえず言いたいことは,何でプラグインの仕様を一般に公開してくれないんだろう…….

窓の杜のインタビューによると,
 現在プラグインの仕様や開発者向けインターフェイスは非公開で、今後一般公開するかどうかは検討中です。公開すると誰もがプログラムの深い部分に触れて、動作を変更できるようになるため、セキュリティ上好ましくない部分があります。また、一度公開したインターフェイスを変更するとなるとすでに公開されているプラグインの開発者に迷惑がかかりますが、一方で我々が自由に変更できないと「Sleipnir」自体の開発効率が落ちる可能性があるため、どのタイミングで公開するかは慎重に検討する必要があります。
 そこで現在、ユーザーのみなさまに直接プラグインを作ってもらうのではなく、「Sleipnir」本体とユーザー製拡張プログラムの“橋渡し”を行うプラグインを提供するという仕組みを開発中です。これならば、「Sleipnir」の内部動作を変更しても“橋渡し”プラグインが開発者向けインターフェイスの違いを吸収し、開発者に迷惑をかけずにすみます。
このような事情だと言っていますが,この時点からもう1年半以上経ってるんですよね.
プラグイン自体も色々なバリエーションが出ていて,
今回のお天気プラグインみたいな活用の仕方が出てきたってことは,プラグインの仕組み自体も安定してきてるんじゃないのかなあ.
セキュリティー上の問題だって,ユーザが自分でインストールするプラグインを選択すればいいだけですよね.

経営的な判断なのかわかりませんが,早く公開して欲しいものです.


名前:  非公開コメント   

E-Mail(任意/非公開):
URL(任意):
  • TB-URL  http://mitc.s279.xrea.com/diary/025/tb/