PhpDocumentorによるドキュメント自動生成

バイト先のWebアプリケーション用ソースコードの量が増えてきたので、
そろそろドキュメント生成ツールでも使おうということで、そのメモ。

バイト先では、PHP & symfonyフレームワークで書いてるんで、
ドキュメント生成ツールにはPhpDocumentor現バージョンは1.4.2ですを使います。

インストールはPEARを使えば楽勝。

 $ pear install PhpDocumentor

で、ドキュンメントの生成にはphpdocコマンドを使います。

 $ phpdoc -d apps,lib -t doc/phpdoc

これで、appsとlibディレクトリ以下すべてのphpファイルをHTMLドキュメント化して、
doc/phpdoc以下に吐き出してくれます。

ただ、デフォルトで生成するHTMLには、charset=iso-8859-1が指定されているため、
日本語コメントは文字化けしてしまいます。

対処法としては、HTML内にcharset指定のないHTMLドキュメントを生成するのが楽ですとはいえ、webサーバのDefaultCharsetが間違っていたり、ブラウザの文字コード自動判定が失敗した場合は、文字化けが起きるので注意

 $ phpdoc -d apps,lib -t doc/phpdoc -o HTML:Smarty:PHP

この場合、デフォルトで生成したHTMLとはレイアウトが変わってしまいます。
デフォルトレイアウトが好きな方は、下記サイトを参考にテンプレートを書き換えてください。
http://je-pu-pu.jp/blog/archives/2006/04/phpdocumentor.html

参考文献

CentOSのyum追加パッケージ – RPMForge

CentOSのyumはFedora等に比べてyumでインストール可能なパッケージ数が少ないです。
そのため、インストールしようと思ったパッケージが存在しなくて困るときがあります。

この前は、inkscapeを入れようとしたけどパッケージが存在しなくて困りました。

ソースやrpmからインストールするには、いろんな依存パッケージをインストールする必要があって面倒です。

そこで、yumでインストール可能なパッケージを増やすために、RPMForgeを導入しました。
導入方法は、下記リンク先に書いてある通りです。

http://wiki.centos.org/AdditionalResources/Repositories/RPMForge

導入後は、以下のようにyumでインストールできました。

$ yum install inkscape

ActiveRecordの予約語とテーブルのカラム名

RubyのActiveRecordActiveRecordってデザインパターン名だったんだね。知らなかった・・・。http://ja.wikipedia.org/wiki/Active_Recordライブラリを使ってDB操作をした際、ハマッたのでメモ。

ActiveRecordを使うと、DBテーブルのレコードをオブジェクトとして取り出せます。
カラムのデータを取得する際は、カラム名をメソッド名としてオブジェクトを操作すれば良いのですが、
ActiveRecordの予約語と同じカラム名が存在すると正しく動作しません。

例えば、type, displayなどが予約語です。

ためしに、下記のようにテーブルとレコードをつくり、

$ mysql -u root test

CREATE TABLE apples
(
    id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
    type VARCHAR(20) NOT NULL
);
INSERT INTO apples (type) VALUES ('fuji');

以下のRubyコードを書いたとします。
[Ruby]
require ‘rubygems’
require ‘activerecord’

ActiveRecord::Base.establish_connection(
:adapter => ‘mysql’,
:host => ‘127.0.0.1’,
:username => ‘root’,
:password => ”,
:database => ‘test’
)

class Apple < ActiveRecord::Base end a = Apple.find(1) p a.type [/Ruby] 上記コードを実行すると下記のような例外がでます。

/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.1/lib/active_record/base.rb:1434
:in `instantiate’: The single-table inheritance mechanism failed to locate 
the subclass: ‘fuji’. This error is raised because the column ‘type’ is reserved
for storing the class in case of inheritance. Please rename this column if you didn’t
intend it to be used for storing the inheritance class or overwrite 
Apple.inheritance_column to use another column for that information. 
(ActiveRecord::SubclassNotFound)

typeの場合は、上記のようにわかりやすい例外がでます。displayという名前のカラムが
ある場合は特に例外が発生しません。でも、a.displayと実行してもカラムのデータとは異なる値が
返ってくるので厄介です。

対処法としてはカラム名を変更(type -> etypeとか)するのが普通です。

カラム名を変更したくない場合はselectで別名を指定すれば、問題を回避できます。
[Ruby]
a = Apple.find(1, :select => ‘type as etype’)
p a.etype # “fuji”
[/Ruby]

ActiveRecordの予約語として何があるかは、下記リンクを見てください

その他参考文献

http://uruseiyatsura.way-nifty.com/blog/2007/08/ruby_on_rails.html