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さわる手間も省けてよい
- 同じデータベースを二つ用意する
- 一方を変更する
- 変更してないデータベースの設定を使用する
$ 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で非同期的にやるみたいな
ところでImageMagickのPHPの拡張モジュール使用するがドキュメントがほとんどないので少し戸惑う
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");
大分遅い・・・
foltiaの録画後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等を設定
PHPでウェブアプリケーションフレームワークを自作しよう 第一回
PHPのフレームワークはSymfony、cakePHP、Zend frameworkなど色々と選択肢があって今更自作する必要性など感じられない、こんな連載記事の需要もどうなんだろ
しかしながらPHPも5.3以降で名前空間、無名関数まで使えるようになり、ウェブ開発現場での主流の言語の立場はまだまだ崩さないだろう
特に日本の企業では圧倒的にPHPの案件ばっかりだ
(僕の周りがたまたまそうなだけなのかもしれないが)
PHPはレガシーで美しくない、大衆向けの言語だと思われがちだが、度重なるバージョンアップでわりかし楽しいプログラミング的なことは可能だと思った
Rubyで動的なAPI作るようなことは__callとか__callStatic等のマジックメソッド使えばある程度再現可能であるし
メタプログラミング的なことはやはり回りくどい実装になってしまうが…
フレームワークを自作していくことで自分の中でPHPの可能性が広がると思う
開発環境
御託はいいとして、第一回は開発環境の話から
適当にインストールしたら、インストールディレクトリ下の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
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というサードパーティのテンプレートエンジンを利用しようと思う
といったところで執筆力が尽きた
次回はディレクトリ構成と、コアの部分の実装をしていこうと思う