軽量フレームワークguesswork

2007/12/26 | guesswork

今回新たな開発案件でguessworkを採用することにした。
データベースアクセスや認証については、外部のライブラリに頼らないといけないが、本当に必要最小限のMVCをルールにのっとって操作できるというところが素敵なフレームワークだ。
たいていのフレームワークの場合、ディレクトリ構成をきちんとルール付けすることによって、余計な設定ファイルを記述しなくてもいいようになっているわけだが、このguessworkは別。基本的にファイルを自由自在に配置できるようになっている。
ウェブアプリの開発には2種類あって、ウェブサイトの管理そのものを開発者だけ(+理屈のわかっているコーダ)が管理するタイプと、開発者が管理にかかわるが、コーダがどんどん勝手にコーディングも更新してしまうタイプ。前者の場合は、サイトを管理する立場の人はいろんなタイプはあるけれど、基本的に「ルールを理解してくれる人」で構成されている。後者はたいていの場合「複雑なルールは面倒」と思う人で構成されている。前者の場合は、フレームワークでありがちな制約を理解してくれる可能性が高いが、後者の場合は、自由にファイルを配置したい、と思う人が多いはずだ。
今回の案件では、どちらかというと後者のタイプで開発を進めるほうがよいと判断したのだ。
軽量で、機能を極力減らしてあるフレームワークだけあって、理解するのは簡単だ。現在は「テンプレートエンジンを使用せず(デフォルトはSmarty)」、「データベースはADODBで」開発している。認証ロジックはまだ検討中だ。

基本的にはcakePHPで通しておきたいというのもあるが、やはり臨機応変でその場に適したフレームワークを使うというのが一番ベストだと思う。PHPのフレームワーク自体は基本的にmojaviからスタートしているわけだから制約がたくさんある(制約から抜け出すためには理解する知識が必要)。内容を理解しなくても、ある程度のアプリを書くことができるguessworkは、ある意味おさえておきたいPHPフレームワークのひとつだろう。

今後は開発していく上ででてきたTips等々を紹介することにする。

PostgreSQLの状態を知る

2007/12/18 | PostgreSQL

とあるクライアントから「データベースのソート結果が変なんだけど」という連絡をいただいた。自分が構築したシステムではないので完全にお気楽モードで調べて差し上げることにした。データベースはPostgreSQL、プログラム言語はPHP。他人が作ったデータベースを触るのは基本的に嫌だが、それでも頼っていただける、というのはありがたい。ということで・・・。
まずはプログラムのバグを疑った。しかし、それらしい問題というのは見当たらない。SQL出力を確かめたり、取得したデータを確かめたり。しかしいずれも整合性が取れている(整合性が取れているにもかかわらず、データの並びがおかしいとはこれ如何に)。
データベースのダンプも預かっていたので、画面に出力させたSQLを自分の環境でも実行してみた。

ん?、ん?、ん???。

先方のサーバと自分のサーバで表示される順番が違う???。なぜ???。
バージョンもほとんど同じなのだからこんなことないはずなのに、と思ったら思いついた点がひとつ。ロケール(locale)の設定だ。データベースで日本語を使用する場合はロケール設定を無効(というかCを指定)にしなければいけない、とかなんとかいう設定があったはず。

で、現在の状態を調べるにはどうすればよいのか調べてみた。
pg_controldata /var/lib/pgsql/data/

このコマンドでいろいろわかる!。ちなみに引数ではデータの場所を指定する。結果として、表示される値のうち「LC_CTYPE:」の値が「C」ではなかった。どうやら、データベースの初期化をきっちりやっていないことが原因らしい。「忘れた」のか「知らなかった」のかわからないけど、クライアントにはいちおう状態を説明。どんな反応をされるのか・・・。少しクライアントがかわいそう。構築した業者さん・・・ハズレだったんだなぁ。

自分へのアクセスができない

「定期的な処理」といえばcronだ。共用のレンタルサーバだと使えないところがほとんどだが、これは便利な機能だ。この機能を使いたいがゆえに、使おうとするサーバは、一応きっちり調査する。ちなみに今、割と使っているのは海外サーバのここ。

3iX

cPanelという管理画面が提供されていて、その中でcronの設定ができる。日本ではあまりメジャーではないが割と使える管理画面だ。あとは、今回の本題PLESKでも使える。

さて定期的に動作させたいプログラムだが、PHPしかできない人にとってはやっぱりPHPで書きたいところ。PHPではコマンドライン版があるので、PHPで完結できるところもありがたい。しかしウェブ用の設定とコマンドライン版の設定が異なることもあったりするし、コマンドライン版そのものが使えないところもあるから厄介。そういうときは、通常通りウェブ用にプログラムを書いておいて、wgetやlynxなどのコマンドラインから使えるブラウザでアクセスするよう設定してやると、定期的な処理ができるようになる。ちなみにwgetなどのブラウザが使えない場合は・・・普通はCGIが使えることが多いので、CGI版PHPで簡単なブラウザを書いてしまう。
だったらCGI版PHPで処理書けば・・・という話になるのだが、これもやはり設定がモジュール版と違うことがあるから・・・。

で、本題。上記の処理を入れたのだが、うまくアクセスしてくれない。PLESKサーバに設置したのだが、なぜか自分へのアクセスで失敗する。
しばらく悩んだ末、自ドメインの名前解決ができていないのでは?、と考えた。で、nslookup・・・。なんと自ドメインのAアドレスが127.0.0.1と返されてしまった。これじゃぁダメだよね(というか、これで動作するように設定してあれば別なんだけど)。仕方ないので/etc/hostsの該当箇所の記述を削除した。これで問題解決。

他のところに影響が出なければいいのだけれど。

多次元配列をソートする

2007/12/10 | PHPの基本

とある案件で、配列に格納されたデータをソートする処理が必要になった。
今までは、基本的にデータの保存にはデータベースを使用していたので、配列としてデータを取り扱う以前にデータのソートは完了しているのが常だった。しかし今回データベースを使用せず、CSV形式で与えられていたので、配列に格納されたデータをソートする必要が出てきたわけだ。
実はこの処理、それほど難しいわけではなく、PHPで標準装備の関数で対応できる。それがarray_multisort関数だ。ただコマンド一発!というわけではなく、事前準備が必要となる。処理内容は以下の通り。

foreach ($data as $key => $row) {
$volume[$key] = $row[‘volume’];
$edition[$key] = $row[‘edition’];
}
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

条件としてデータ「$data」が多次元配列で、その各行でいくつかのデータが指定され、かつ、それらのデータのうち「volume」「edition」というキーで与えられた値を元にソートするものとする。

最初のforeach文で、各行の「volume」「edition」のキーで指定された値をあらかじめ全て取り出して、変数に格納しておく必要がある。これを使い、array_multisort関数にデータ、ソート対象を引き渡す。関数が実行されると$dataがソートされている、というわけだ。

この関数、引数の与え方が他の関数とずいぶん違うので、使用する際は注意が必要になる。上記の例では、


第1引数:あらかじめ抽出したソート対象の配列
第2引数:ソート方法(昇順、降順)
:(上記2つの繰り返し)
最後の引数:データ

となっている。これは時としてこんな具合にもなる


第1引数:あらかじめ抽出したソート対象の配列
第2引数:ソート方法(昇順、降順)
第3引数:ソートのフラグ(文字列として、数値として等)
:(上記3つの繰り返し)
最後の引数:データ

慣れるまでは注意が必要な関数だ。

WordPressの表記を変更

2007/12/08 | SNS/CMS/ブログ

とある案件で、WordPressをCMSとして利用し、かつメンバーしか閲覧できないようにするためのシステムを作っている。ブログツールにはたいてい標準でユーザ管理機能がついているので、それを使えばユーザ管理機能は作成する必要がない。それにWordPressならプラグインを使って、ユーザ管理データベースと連携した認証システムを組み込むこともできるからだ。
さてこのWordPress。テンプレートとかのデザインが変更できるのはもちろんだが、言語ファイルを作成するだけで、多言語に対応できる。しかしその言語ファイル。これはPHPで書かれているものではない・・・それが厄介。
言語ファイル自体は「wp-includes/language/」ディレクトリ内に存在するのだが、同じファイル名で異なる拡張子を持つ対のファイルがいくつか存在している。拡張子はpoとmoの二つだが、WordPressが実際に使用しているのはmoのほう。これ、中を見ようとするとバイナリなんだな・・・。お手軽に編集して済むということではなさそうだ。
で、その編集方法を調べてみた。やり方としてはpoファイルを作成し、そこからmoファイルに変換するようだ。

(1) 拡張子poのファイルをテキストエディタで編集する
(2) コンソール上で適当なディレクトリで以下のコマンドを入力
 msgfmt -o ja_UTF.mo ja_UTF.po
(3) できたファイルを上記のディレクトリへ配置

これでできあがり。
どうしてこんな面倒なことになっているんだろ?。多言語対応というのは、きっとこういうところが大変なんだろうな。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net