preload
1月 19

「CakePHP で複合キーは使えない?」というエントリを書いたところ、sdozonoさんという方からコメントをいただいた。

どうしても id フィールドは作りたくない、という場合には、http://qcodo.com がよさそうです。”Qcodo even allows tables to have multiple-column primary keys. However, only limited functionality will be generated for tables that have multiple primary keys. “とあります。

早速、試してみたので、簡単なチュートリアルも交えて試用報告。

qcodo は PHP5 以上を対象としたフレームワーク。PHP4 でやってから悩まないように(僕は、よくハマる。TRAXのときもハマッた)。日本語情報は少ないし、本家チュートリアルの対象バージョンは若干古め。ちょっといじってみた感じ、web に転がっている情報と最新の配布ファイルとでは、ディレクトリ構成や API 周りにいろいろギャップがあるようだ。最新バージョンを試すならアーカイブ中の README や本家チュートリアルからリンクされている example 集の情報を読むのが吉。

今回試したのは 0.3.11。配布ファイル中の /_README.txt を参考に、wwwroot/ 以下を htdocs/qcodo として配置。cli ツールを使う場合は、_devtools_cli を任意の場所に設置する。

続いて、htdocs/qcodo/includes/configuration.inc.php を環境にあわせて編集する。DOCROOT 周り設定と、DB 設定だけで、すぐ動かせる。DOCROOT は apache の DocumentRoot(つまり htdocs まで)、SUBDIRECTORY は DOCROOT から見た qcodo ルート位置を書く。DB設定はアダプタ名と、DBホスト、接続ユーザ名、パスワードとかとか書いてやればよい。ウチの場合、両箇所の該当部分はこんなかんじ。

終わったら、htdocs/qcodo/_devtools/codegen.php をブラウザからアクセスしてやると、接続先DBのスキーマからデータモデルクラスやらフォームやらビューをぼこぼこ自動生成してくれる。一個一個、対話式でbakeしなくて良いのはCakePHPよりも楽ちんだ。できあがったフォームは htdocs/qcodo/form_drafts やら htdocs/qcodo/panel_drafts をアクセスすれば確認できる。プルダウン選択->テーブルの読み込みや、レコード新規作成/編集のUIは AJAX していて、これだけでもなかなか使いやすい。

qcodoの面白いところは、CakePHPで悩んだ複合キーの課題も含め、テーブル間の関連情報を、全て外部XML設定ファイルに書けるという点にある。codegen.php でコード生成する際、既存スキーマの利用はテーブル名/カラム名くらいにまで留まっており、関連やキーの設定はこの外部XMLを参照するような作りになっているようだ。これがなかなか絶妙。

つまり、将来的にhogehogeするかもしれないから、なんて理由でユルユルな制約のまま運用してしまって、機能拡充するうちにアレな状態になってしまっていた既存DBの面倒を見ることになってしまっても(泣)、既存スキーマに手を入れること無く、スピーディな管理ツール開発手法を導入できる(かも知れないっ)ということだ。

この辺の話は、また今度書く。

Tagged with:
1月 15

PDO設定を入れたらapacheが起動しなくなる

PHP コメントは受け付けていません。

ローカル開発環境にPHP5を入れてみたついでにPDOを使ってみようかと思い立つ。マニュアル にもある通り、5.1以降であれば、extension設定を入れるだけ。php.ini に次の2行を追加する。

extension=pdo.so
extension=pdo_mysql.so

sudo apachectl graceful などとして、設定を適用。あれ、apache が起動してないみたい。エラーログを見ると、

/usr/local/app/apache-2.2.3/bin/httpd: symbol lookup error: /usr/local/app/php-5.2.0/lib/php/20060613/pdo_mysql.so: undefined symbol: php_pdo_declare_long_constant

うぬ、どうやらDSOの読み込みに失敗してるぽい。PECLモジュールを手動インストールしてみても状況変わらず。PECLのバグなのかなんなのかと色々webを漁っていたら、koyhogeさんのブログに当たる。まさしく同じ症状だ。

というわけで –enable-versioning を外してリコンパイルしてみたところ、無事認識してくれた。てことで、僕もさよなら –enable-versioning (ここんとこ何回リコンパイルしてんだろ)

Tagged with:
1月 10

DBのマスタメンテナンスツールを手軽に作りたいなーと思い、O/Rなツールをいろいろと試してみている。仕事だと既存のアレな感じのDBも面倒を見なければならず、どうすれば楽ができるかなと模索中。
で、CakePHPをちょっといじってみた。最新の 1.1.12.4205 を試用。日本語のマニュアルもあるよ。
アーカイブを拾ってきてひとまず DocumentRoot の下に設置。app/config/database.php で DB の接続設定。これだけでとりあえず準備完了。ルートディレクトリ(index.php)にブラウザからアクセスすれば接続できてるよーって画面が見える。
CakePHP だと、同梱されている bake コマンドを使って、Model, View, Controller の Scaffolds がさくさく作れる。

$ php cake/scripts/bake.php
___ __ _ _ ___ __ _ _ __ __ __ _ _ ___
| |__| |_/ |__ |__] |__| |__] |__] |__| |_/ |__
|___ | | | _ |___ | | | | |__] | | | _ |___
—————————————————————
Baking…
—————————————————————
Name: app
Path: /usr/local/apache2/htdocs/cake/app
—————————————————————
[M]odel
[C]ontroller
[V]iew
What would you like to Bake? (M/V/C)
>

既存DBのメンテナンスツールを作ることを想定しているので、いくつか使い勝手を確認してみる。

テーブル名、カラム名に制約はないか
デフォルトだとあるけど、変更できる。たとえば、テーブル名はクラス名単数形 + ‘s’ でないとダメ、単語間区切りは大文字 <=> アンダースコア ‘_’ で置き換え(AddressBookクラスならaddress_books)、とか。これは bake で Model を生成するときにテーブル名を手動で指定してやればOK。primary key はカラム名 id の必要があるが、これは app/models/ の下に吐かれる Model クラス中で var $primaryKey = ‘address_book_id’; などとしてやれば OK。
Given your model named ‘AddressBook’, Cake would expect a database table named ‘address_books’.
Is this correct? (y/n)
[y] > n
What is the name of the table (enter “null” to use NO table)?
> address_book
Model間の関連(アソシエーション)は定義できるか
Model 間の関連も対話式に定義できる。hasOne, hasMany, belongsTo, hasAndBelongsToMany から選ぶ感じ。スキーマ中に外部キー制約が付けてあれば自動検出してくれるし、制約なんて付けてないアレなスキーマでも、手動設定できる。手動設定するときは関連先をテーブル名でなくクラス名(モデル名)で指定すること。
複合キーのModelは定義できるか
これが無理っぽい。思わぬところではまった。

たとえば、CustomerHasManyAddressBooks なアソシエーションがあるとして、customer は customers_id が PK、address_book は customers_id と address_book_id の複合キーが PK であるとすると、前者は問題なく定義できるのだが、後者は定義できないようだ。Model 中で $primaryKey = array(‘customers_id’, ‘address_book_id’) などとやってもダメ。CakePHP, multi, primary keyとかでググると、本家のtracに当たった。このチケットとかこことかこの辺を見ると、クローズになってるのか、未対応なのか、できそうな、まだできなさそうな、微妙なステータス。
言葉を変えて composite primary keys などで IRC ログを漁ってみると、どうやら対応してないし、まだ対応する予定も無いような発言も見える(この人は中の人だろうか)。RoR とかでも別の PK 扱いできるインクリメンタルなカラムをつくるというのが現実解ぽいし、複合キーは使わないのが良いのかな。
そもそもCakePHPだと各レコードのURLでPKをそのまま使うという設計になっているようで、複合キーを入れると、キーを複合した文字列を作ったり分割したりという処理が必要になってくる。まだ一部しか見られていないが、これが大変、ということだろうか。複合キーを使う時点で、個々のIDの体系に縛られる設計になってしまうし、こういった関連は外に切り出してしまうのがベターなのかもしれない。
でも既存のDBをそこまで梃入れする元気も無いし、やんなきゃやんないで話は進まないしと言うジレンマ。なんかうまい楽な方法はないものか。

Tagged with:
1月 04

GPS携帯で位置を取得

PHP コメントは受け付けていません。

auケータイユーザになって久しいが、GPS対応コンテンツを作ってみたことがないので、やってみた。

au公式の技術情報提供ページには、簡易位置情報の利用方法は開示されているが、GPS利用コンテンツの開発方法は開示されていない。が、
情報提供している方 がいたので、これを参考に、作ってみた。

取得できる緯度経度情報は INVGEOCODER という素敵なwebサービスを利用させてもらうことで、テキストの住所情報に変換できる。PHP だと HTTP_Client と XML_Serializer を使ってしまえば、加工も簡単。

送信部分の html はこんなかんじ。action に device:gpsone を指定することで、GPS を利用できる。この例だと、au.php に取得結果を渡してる。

上の datum とか unit とかは測位系や、値のフォーマットを表している。デフォルト 0 と解釈されるようだが、unit ゼロだと、INVGEOCODER に渡すときにフォーマット加工してやる必要がある。最初そこがよくわかってなくてはまった。詳しくは上のポインタから辿れる先を参考に。

取得側の au.php はこんなかんじ。lat や lon は preg_match するまでも無かったのだが、上の unit=0 ではまっていたときの名残。
いちおう製造番号を必須で拾うようにしてる。なんか作るとき用の伏線。かも。

これだけで、上のhtmlをケータイで表示して「取得」すれば住所情報が番地まで表示できる。auのGPSは、家の中で測位してもほとんど誤差が出ない。なかなか凄い。

Tagged with: