liquibaseでお手軽DBバーション管理

書いた
http://github.com/gotoppella/liquibase_project
antをインストールさえすりゃ使えるらくちん

初期設定

$ cat <<EOF > dbconfig/設定名.property
> #liquibase.properties
> driver: com.mysql.jdbc.Driver
> url:jdbc:mysql://ホスト名(:ポート番号)/データベース名
> username: ユーザ名
> password: パスワード
> EOF
$ ant db:changePropertiesFile
db:changePropertiesFile:
    [input] input config type >設定名

antのtargetを実行する際、"input config type >"と出た場合、
dbconfigディレクトリにある"**.property"の"**"を指定する。

設定変更

$ ant db:changePropertiesFile
db:changePropertiesFile:
    [input] input config type >設定名

既に存在するDBをバージョン管理したい場合

$ ant db:generateChangeLog
db:setChangeLogName:
    [input] チェンジログの名前 >test
$ ls changelog
master.xml
20121102xxxxxx_test.xml
$ ant db:changeLogSync // changelogとデータベース上のバージョン情報をシンクロ

新しいchangelog作成

$ ant db:makeChangeLog
db:setChangeLogName:
    [input] チェンジログの名前 >test

changelogをデータベースに反映させる

$ ant db:update

データベースの変更点の差分をchangelogに変換

phpMyAdminとかで変更した内容をchangelogにできるのでxmlさわる手間も省けてよい

  1. 同じデータベースを二つ用意する
  2. 一方を変更する
  3. 変更してないデータベースの設定を使用する
$ ant db:diffChangeLog
db:setChangeLogName:
    [input] チェンジログの名前 >diff
db:diffChangeLog:
    [input] 比較元のURL >変更したデータベースのURLおよびポート
    [input] 比較元のデータベース名前 >変更したデータベース名
    [input] 比較元のユーザ >ユーザ名
    [input] 比較元のPassword >パスワード

Document作成

$ ant db:generateDocument

ブラウザでbuild/index.htmlを開く

その他

ロールバックとかのターゲットは未実装
./liquibaseコマンドで代用

PHPでImageMagickでも

PHPで画像処理にはGDとImageMagickが主流でしょう
GDは簡単で、速度もそこそこ良い、リサイズした時の画質は微妙
Imagickはフォトショ並の画像処理できる、速度はGDに劣る、ドキュメントは不足

まあImageMagick、ジョブキューで使えば動的なGifアバター作成処理とかには最適だと思う(つかそう使ってる)

簡単な合成処理などはGDでサクッとやって、その他の画像処理とかGifアニメ作成はImageMagickで非同期的にやるみたいな

ところでImageMagickPHPの拡張モジュール使用するがドキュメントがほとんどないので少し戸惑う

ImageMagickのメモでも起こしておこう

ImageMagickは本体とPHP拡張モジュールをインストールする必要がある

インストール

本体はMacPorts等でパッケージあるからインストール

sudo port install ImageMagick
追加2012年11月7日

LZW有効にするためには

sudo port edit ImageMagick

でconfigure.argsに--enable-lzwを追加して
インストールし直す


ビルド終わったら拡張モジュールをインストール
pecl install imagickでもいけるが、MAMPで開発してるのでMAMPで使えるようにしたいのでソースコードビルドする

curl -O http://pecl.php.net/get/imagick-2.3.0.tgz
tar zxvf imagick-2.3.0.tgz
cd imagick-2.3.0
which php #=> /Application/MAMP/bin/php/php5.3*/bin/phpにパスが通っていることを確認
phpize
ln -s /Developer/SDKs/MacOSX10.6.sdk/usr/include /Appcation/MAMP/bin/php/php5.3.*/include
./configure --with-imagick=/opt/local
make
make install
echo "extension=imagick.so" >> /Application/MAMP/bin/php/php5.3.*/conf/php.ini

phpinfoにimagickがあればインストール成功
と思ったらない
php_error.logに以下のログが・・・

PHP Warning:  PHP Startup: Unable to load dynamic library '/Applications/MAMP/bin/php/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/imagick.so' - dlopen(/Applications/MAMP/bin/php/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/imagick.so, 9): Library not loaded: /opt/local/lib/libjpeg.8.dylib
  Referenced from: /Applications/MAMP/bin/php/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/imagick.so
  Reason: Incompatible library version: imagick.so requires version 13.0.0 or later, but libjpeg.8.dylib provides version 12.0.0 in Unknown on line 0

よくわからんが/Applications/MAMP/Library/bin/envvarsの以下のラインをコメントアウトしたらいいらしい

#DYLD_LIBRARY_PATH="/Applications/MAMP/Library/lib:$DYLD_LIBRARY_PATH"
#export DYLD_LIBRARY_PATH

これでおk

Imagickクラス

phpではImagickクラスを主に使用する
Imagickオブジェクトはイテレータの役割もこなす。(画像シーケンスと呼ぶ)
例えば、

$imagick = new Imagick("image.jpg");

として得られた$imagickオブジェクトは、画像シーケンスの一覧に"image.jpg"の画像データとしてのImagickオブジェクトが入れ子として入っているオブジェクトになる

$imagick2 = new Imagick("image2.jpg");
$imagick->addImage($imagick2);

として画像シーケンスにImagickオブジェクトを追加できる

$array = array("image.jpg", "image2.jpg");
$imagick = new Imagick($array);

また配列を引数とすると複数の画像の入ったImagickオブジェクトを作成できる。

サムネイル画像はthumbnailImageメソッドを使う
画像の表示はechoでおk(__toString)

$imagick->rewind(); // 画像シーケンスを最初に戻す。
$imagick->thumbnailImage(100,100);
$imagick->next();
header('Content-type: image/jpeg');
echo $imagick;

このようにすると2枚目の画像はサムネイル処理されていない事がわかる
画像処理は画像シーケンス上の現在のポインタ上の画像に対して行われる
ImagickはIteratorを実装してるのでforeachでイテレーションできる

foreach ($imagick as $im) {
    $im->thumbnailImage(100,100);
    $filename = $im->getImageFileName();
    $im->writeImage($filename."_new");
}

このように複数画像に同じ画像処理をすることができる
ざっくりいうとメソッド名にImage(not 複数形)が入ってるものは現在のポインタ上の画像に対するもののようだ

GIFアニメ

画像シーケンス上からGIFアニメを作る事ができる
writeImagesメソッドを使用する

$imagick->setFormat('gif');
foreach($imagick as $im) {
    $im->setImageFormat('gif');
    $im->setImageDelay(100); // 次の画像までの遅延
    $im->setImageDispose(1); // 画像の配置方法(背景色で一旦塗りつぶしてからか等)
    $im->setImageIterations(0); // ループ回数(0ならば無限)
}
header("Content-type: image/gif");
$imagick->writeImages("/tmp/asdf", true);
echo file_get_contents("/tmp/asdf");
unlink("/tmp/asdf");

大分遅い・・・

Smartyでヘルパークラス

Smartyで一々plugin作っていくの面倒いのでヘルパークラス作ってテンプレートから呼び出せるようにする

まずヘルパークラスを登録し、Smartyのpluginから呼び出すためのクラス

ヘルパーを呼び出すSmartyプラグイン関数

ReflectionMethodを使用してます

ヘルパークラス例

テンプレート

呼び出し側

ヘルパークラスはたくさん追加できる

foltiaの録画後twitterポスト

twitterで録画ポスト垂れ流していたスクリプト公開

需要ないが

使い方

あらかじめAPI KEYを取得
http://dev.twitter.com/apps

cpanモジュールインストール

perl -MCPAN -e shell
cpan> install Jcode
cpan> install Net::Twitter::Lite;
cpan> exit

パッチを当て、API KEYを設定

cp fotila_twitter.pl {foltia_dir}/perl/
patch -p3 -d {foltia_dir}/perl < foltia_twitter.patch
vi {foltia_dir}/perl/foltia_twitter.pl # CONSUMER KEY等を設定


出先でちゃんと録画できてるかすぐ確認できて安心感を得る

録画容量について

foltia_tv-lvol0って論理ボリュームを作ってます
foltia_dir/php/tv(録画ディレクトリ)以下にマウントしましょう

PHPでウェブアプリケーションフレームワークを自作しよう 第一回

PHPフレームワークSymfonycakePHPZend frameworkなど色々と選択肢があって今更自作する必要性など感じられない、こんな連載記事の需要もどうなんだろ
しかしながらPHPも5.3以降で名前空間、無名関数まで使えるようになり、ウェブ開発現場での主流の言語の立場はまだまだ崩さないだろう
特に日本の企業では圧倒的にPHPの案件ばっかりだ
(僕の周りがたまたまそうなだけなのかもしれないが)

PHPはレガシーで美しくない、大衆向けの言語だと思われがちだが、度重なるバージョンアップでわりかし楽しいプログラミング的なことは可能だと思った

Rubyで動的なAPI作るようなことは__callとか__callStatic等のマジックメソッド使えばある程度再現可能であるし
メタプログラミング的なことはやはり回りくどい実装になってしまうが…

フレームワークを自作していくことで自分の中でPHPの可能性が広がると思う

開発環境

御託はいいとして、第一回は開発環境の話から

とりあえずMAMPXAMPPの二択で

適当にインストールしたら、インストールディレクトリ下のbinにパスを通しておこう
Macなら.bashrcに

export PATH=/Applications/MAMP/bin/php/php5.3.6/bin:$PATH
alias phperror="tail /Applications/MAMP/logs/php_error.log"
alias apacheerror="tail /Applicatons/MAMP/logs/apache_error.log"
alias mysqlerror="tail /Applications/MAMP/logs/mysql_error_log.err"

とか追加すればいいと思う($PATHの前後注意)
シェル上で

source ~/.bashrc
which php

って打って、

/Applicatons/MAMP/bin/php/php5.3.6/bin/php

って返ってきたら成功
エディタは各自好きなの使えばいいが僕はEclipse+PDT使ってる

PHPUnit

次にPHPUnitpearでインストールしよう

pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit

でおk
/Applications/MAMP/bin/php/php5.3.6/lib/php下にPHPUnitディレクトリがあればインストール成功
あと以下の追加パッケージは入れておこう

pear install phpunit/DbUnit

PHPUnitはこれからフレームワークの開発をTDDで行うために必須のテスティングフレームワークである
悪いPHPerが混沌なPHPのコードを産み出してしまうのはPHPオブジェクト指向を活用しきれてなかったり、テストが十分でなかったりするんだが、PHPUnitは素晴らしいテスト自動化のツールなので積極的に利用すべきだと思う
ドキュメントも充実してるのでなおさら良い

シンプルなMVCモデルを目指そう

MVCモデルはもうウェブアプリフレームワークでは標準のデザインパターンだとおもう

RDBMを扱い、データを読み書きするModel、APIの呼び出しに応じて、Modelからデータを処理し、Viewに橋渡すController、Controllerから受け取ったデータを人が読める形に整形出力するViewといった具合でアプリケーションを作るメリットはたくさんある。
特に、Viewを分離するって言うことは、Webデザイナさんとの連携を図るための重要なファクター

もともとPHPはテンプレート言語であるため、明確にViewを分離するために、今回はSmartyというサードパーティのテンプレートエンジンを利用しようと思う

といったところで執筆力が尽きた
次回はディレクトリ構成と、コアの部分の実装をしていこうと思う