symfony で普段使っているpluginをまとめてみた
この記事はSymfonyアドベントカレンダー2010の19日目です
1. sfWebBrowserPlugin - RESTful APIを利用するならお手の物。HTTP通信なら完全お任せ!
READMEを見ると利用方法が事細かに書かれているので非常に分かりやすいですね。
このpluginでは 3種類のインターフェイスをアダプターという形で用意しています。
- sfCurlAdapter
- sfFopenAdapter
- sfSocketsAdapter
どれを利用しても良いのですが、Forward Proxy経由でHTTPリクエストを送りたい事があるため、sfCurlAdapterを利用しています。
(例)
<?php $b = new sfWebBrowser(array(), 'sfCurlAdapter', array('httpproxytunnel' => 1, 'proxy' => 'http://proxy.example.com:8080', 'proxyport' => '8080', ) );
クラウド環境を利用していて、webサーバがオートスケールで増えてくれるのはいいけれども、振られるグローバルIPが何になるのか分からない場合などに使えますね!
※1. IPアドレスでの通信制限が無い場合は、気にする必要はないです。
※2. ロードバランサーがNATしてくれている場合は、気にしなくてもOK
2. sfDoctrineMasterSlavePlugin - DBのReplicationをするならまずこれでしょう!
Symfonyアドベントカレンダー2010の12日目にvectorxenonさんがsfDoctrineMasterSlavePluginの事を書かれております。
このpluginで何が1番嬉しかったかというと、マスターの分散が出来ることです。
# databases.yml all: # db1 connections db1_master: class: sfDoctrineDatabase param: dsn: mysql:dbname=db1;host:db1-master.example.com username: root password: ~ group: db1 db1_slave: class: sfDoctrineDatabase param: dsn: mysql:dbname=db1;host:db1-slave.example.com username: root password: ~ group: db1 # db2 connections db2_master: class: sfDoctrineDatabase param: dsn: mysql:dbname=db2;host:db2-master.example.com username: root password: ~ group: db2 db2_slave: class: sfDoctrineDatabase param: dsn: mysql:dbname=db2;host:db2-slave.example.com username: root password: ~ group: db2
selectの負荷はSlaveサーバを増やすことによって解決できますが、
更新系処理が多くなってくる場合、それでは対応できません。
上記のようにMaster and Slaveサーバのグループを用意し、schema.ymlで対応するconnectionを指定すればOKです。
# schema.yml User: connection:db1 columns: name: { type: string(255), notnull: true } LegacyUser: connection:db2 columns: name: { type: string(255), notnull: true }
3. sfAdminDashPlugin - 手軽にシャレオツ管理画面を提供したい場合に!
README に設定方法が書かれていますが、id:ken39argさんがsfAdminDashPluginがかなりいい件についてという記事で、ハマりどころも合わせて書かれています。
WEBサービスを作る上で管理画面って結構後回しにされがちですが、このpluginで手軽にシャレオツな管理画面が作れるので重宝しています。
4. sfTaskExtraPlugin - pluginを簡単に作るためのplugin
symfonyで幾つかProjectの開発をしていくと、必ずProject間で共通で利用したいコードが出てくると思います。
その時にplugin化をしたくなるのですが、pluginを開発する上で簡単で手軽にテストコードも準備できる枠組みを提供してくれるのがsfTaskExtraPluginです!
まずインストール
$ symfony plugin:install sfTaskExtraPlugin
これでREADMEに書かれているタスクを利用する事ができるようになりますが、特によく使うのは以下です。
- generate:plugin: pluginのスケルトンを吐き出す
- generate:plugin-module: モジュールを含むpluginのスケルトンを吐き出す
- plugin:package: 作成したpluginをPEARパッケージにしてくれます
symfony の pluginはPEARパッケージで管理しているので、これを使うといちいちpaclage.xmlを作成する必要がなくなります。
まぁそれも便利なのですが、一番素晴らしいのがTDDでの開発がすごくしやすくなることです。
実際にmyPluginを作成してみます。
$ symfony generate:plugin myPlugin
これだけで以下のスケルトンができます。
plugins/myPlugin |-- LICENSE |-- README |-- config | `-- myPluginConfiguration.class.php |-- lib |-- package.xml.tmpl `-- test |-- bin | `-- prove.php |-- bootstrap | |-- functional.php | `-- unit.php |-- fixtures | `-- project | |-- apps | | `-- frontend | | |-- config | | | |-- app.yml | | | |-- cache.yml | | | |-- factories.yml | | | |-- filters.yml | | | |-- frontendConfiguration.class.php | | | |-- routing.yml | | | |-- security.yml | | | |-- settings.yml | | | `-- view.yml | | |-- i18n | | |-- lib | | | `-- myUser.class.php | | |-- modules | | `-- templates | | `-- layout.php | |-- cache | |-- config | | |-- ProjectConfiguration.class.php | | |-- properties.ini | | `-- rsync_exclude.txt | |-- data | | `-- fixtures | | `-- fixtures.yml | |-- lib | | `-- form | | `-- BaseForm.class.php | |-- log | |-- plugins | |-- symfony | |-- test | | |-- bootstrap | | | |-- functional.php | | | `-- unit.php | | |-- functional | | `-- unit | `-- web | |-- css | | `-- main.css | |-- images | |-- js | |-- robots.txt | `-- uploads | `-- assets |-- functional `-- unit
上記を見てわかるとおり、殆どがテストのためのディレクトリ、ファイルになります。
※ plugin:packageをすると上記のテストディレクトリは除外されてパッケージされます。
テストコードの書き方は以下のドキュメントに詳しく書かれていますので、これでいつでもplugin開発ができますね!
5. sfMobileJPlugin - ガラケー対応サイトを作るのなら・・
手前味噌で恐縮ですが、仕事柄ガラケーのサイトを開発することがあるので、ガラケーに特化したpluginを公開しております。
使い方はREADMEにも書いていますが、簡単にご紹介すると、現在公開しているバージョンで出来ることは以下の2つです。
- 通常のテンプレートとガラケー共通テンプレートを分けることが可能
- 個体識別番(imodeID, UID and EZ番号)の制御
- ページ全体、個別でUIDの通知条件の必須を選択することが可能
はい。それだけです。(ぉぃ)
一応それ以外にも細かなUtil classもあったりしますが、backendではNet_UserAgent_Mobileを使用しているので、端末の情報取得系はそちらが使えます。
現在公開準備中ではありますが、絵文字処理、携帯メール処理も上記pluginに含めれるようにコツコツと開発をしております。(^_^;
CentOS5.5 x86_64 で 最新のnginx を rpmbuildする
EPELで実はnginxのrpmがあるんだけども、versionが0.6で止まっている。
なので、EPELからsrc.rpmを落としてきてそいつに最新のnginxをつっこんでbuildした。
EPELからnginxのsrc.rpmをダウンロードし、インストールする
# wget http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/SRPMS/nginx-0.6.39-5.el5.src.rpm # rpm -i nginx-0.6.39-5.el5.src.rpm
最新のnginxをDLし、SPECファイルを編集する
# cd /usr/src/redhat/SOURCES # wget http://nginx.org/download/nginx-0.8.50.tar.gz # cd ../SPECS/ # vi nginx.spec
versionを変更する
Version: 0.8.50
patchを当てないようにする
#Patch0: nginx-auto-cc-gcc.patch #Patch1: nginx-cve-2009-3555.patch #%patch0 -p0 #%patch1 -p0
LANG=C だとmakeでこけてしまうので、LANGを上書きする
%build # nginx does not utilize a standard configure script. It has its own # and the standard configure options cause the nginx configure script # to error out. This is is also the reason for the DESTDIR environment # variable. The configure script(s) have been patched (Patch1 and # Patch2) in order to support installing into a build environment. export LANG='ja_JP.UTF-8' <- 追加 export DESTDIR=%{buildroot}
TODO: rpmの仕様なのか、configureする前にLANG=Cにするみたいなので、上書きしているけど対応方法が強引すぎるため要調査
エラー内容は以下
make -f objs/Makefile make[1]: Entering directory `/usr/src/redhat/BUILD/nginx-0.8.50' gcc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Wunused-function -Wunused-variable -Wunused-value -Werror -g -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ src/core/nginx.c cc1: warnings being treated as errors src/core/nginx.c: In function 'ngx_set_user': src/core/nginx.c:1101: warning: unused parameter 'cmd' src/core/nginx.c: In function 'ngx_set_env': src/core/nginx.c:1164: warning: unused parameter 'cmd' src/core/nginx.c: In function 'ngx_set_priority': src/core/nginx.c:1194: warning: unused parameter 'cmd' src/core/nginx.c: In function 'ngx_set_cpu_affinity': src/core/nginx.c:1234: warning: unused parameter 'cmd' make[1]: *** [objs/src/core/nginx.o] Error 1 make[1]: Leaving directory `/usr/src/redhat/BUILD/nginx-0.8.50' make: *** [build] Error 2 + mv nginx-upstream-fair/README nginx-upstream-fair/README.nginx-upstream-fair mv: cannot stat `nginx-upstream-fair/README': No such file or directory + exit 0
パッケージにファイルが含まれてないといわれるので、無視するようにする
%define _unpackaged_files_terminate_build 0
※ %filesに含めたほうがいいかも。
よく使うyumリポジトリ
言わずと知れたRPMforge
- i386 http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.i386.rpm
- x86_64 http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm
# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt # rpm -i rpmforge-release-0.5.1-1.el5.rf.*.rpm
CentOS(RHEL)でもFedoraのパッケージが使いたいときはEPEL
- i386 http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/i386/epel-release-5-3.noarch.rpm
- x86_64 http://ftp.iij.ad.jp/pub/linux/fedora/epel/5/x86_64/epel-release-5-3.noarch.rpm
# rpm --import http://ftp.iij.ad.jp/pub/linux/fedora/epel/RPM-GPG-KEY-EPEL # rpm -i epel-release-5-3.noarch.rpm
CentOS 5.5 x86_64 に checkinstall を入れてみる
以前はrpmforgeにパッケージがあったと思ったけど、どうやら無くなっている?
仕方が無いので、ソースからインストールし、その後checkinstallを使ってrpmにする。
# cd /usr/local/src # wget http://www.asic-linux.com.mx/~izto/checkinstall/files/source/checkinstall-1.6.2.tar.gz # tar zxf checkinstall-1.6.2.tar.gz # cd checkinstall-1.6.2 # make # make install
x86_64なので、本来installwatch.so は lib64に入ってほしいんだけど、libに入っている。
makefileを書き直してもいいけど、今回はシンボリックリンクで対応。
# ln -s /usr/local/lib/installwatch.so /usr/local/lib64/installwatch.so # checkinstall
適当に質問に答えていき、rpmができたらそいつをインストールしておく
# rpm -i /usr/src/redhat/RPMS/x86_64/checkinstall-1.6.2-1.x86_64.rpm # rpm -qi checkinstall
Name : checkinstall Relocations: (not relocatable) Version : 1.6.2 Vendor: (none) Release : 1 Build Date: 2010年09月18日 18時18分48秒 Install Date: 2010年09月18日 18時19分01秒 Build Host: rpmbuilder Group : Applications/System Source RPM: checkinstall-1.6.2-1.src.rpm Size : 457305 License: GPL Signature : (none) Packager : checkinstall-1.6.2 Summary : CheckInstall installations tracker, version 1.6.2 Description : CheckInstall installations tracker, version 1.6.2 CheckInstall keeps track of all the files created or modified by your installation script ("make install" "make install_modules", "setup", etc), builds a standard binary package and installs it in your system giving you the ability to uninstall it with your distribution's standard package management utilities.
これで完成。
VirtualBox で イメージの複製
vboxmanage clonehd D:\vm\centos5\Base.vdi D:\vm\centos5\NewHardDisk02.vdi
絶対パスでファイルを指定しないとERRORになった。
ERROR: Cannot register the hard disk 'D:\vm\centos5\Base.vdi' with UUID {*******-****-****-****-************} because a hard disk 'D:\vm\centos5\Base.vdi' with UUID {*******-****-****-****-************} already exists in the media registry ('C:\Users\kopug/.VirtualBox\VirtualBox.xml') Details: code E_INVALIDARG (0x80070057), component VirtualBox, interface IVirtua lBox, callee IUnknown Context: "OpenHardDisk(Bstr(szFilenameAbs), AccessMode_ReadWrite, false, Bstr("" ), false, Bstr(""), srcDisk.asOutParam())" at line 633 of file VBoxManageDisk.cp p
VBoxManage コマンドは デフォルトインストールだとこちらに。
C:\Program Files\Oracle\VirtualBox\
Xenのディスクイメージファイルサイズを増やす
開発環境はxenで構築しているんだけど(kvmに移行を考え中)、そこのディスク容量が少ないから何とかしてーと言われたので何とかした時のメモ
前提条件
※ イメージファイルはSparseじゃない
※ ゲストOSで LVMを利用している
DomainU(ゲストOS)を停止
# xm shutdown <name>
イメージファイルをバックアップ
# cd /var/lib/xen/images/ # mv <name>.img <name>.img.bak
空の20Gのイメージを作成し、結合(ここが重いけど我慢)
# dd if=/dev/zero bs=1M count=0 seek=20480 of=./20G.img # cat <name>.img.bak 20G.img > <name>.img # chmod 755 <name>.img
ループバックデバイスを設定
# losetup -f /dev/loop0 # losetup /dev/loop0 ./<name>.img # losetup -a /dev/loop0: [fd00]:61014051 (<name>.img)
マウントしたイメージファイルのoffsetを確認
# fdisk -lu /dev/loop0 Disk /dev/loop0: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors Units = セクタ数 of 1 * 512 = 512 bytes デバイス Boot Start End Blocks Id System /dev/loop0p1 * 63 208844 104391 83 Linux /dev/loop0p2 208845 20964824 10377990 8e Linux LVM
fdiskで対象のスライスを削除し、シリンダサイズを再設定
# fdisk /dev/loop0 このディスクのシリンダ数は 1305 に設定されています。 間違いではないのですが、1024 を超えているため、以下の場合 に問題を生じうる事を確認しましょう: 1) ブート時に実行するソフトウェア (例. バージョンが古い LILO) 2) 別の OS のブートやパーティション作成ソフト (例. DOS FDISK, OS/2 FDISK) コマンド (m でヘルプ): d 領域番号 (1-4): 2 コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本領域 (1-4) p 領域番号 (1-4): 2 最初 シリンダ (14-6527, default 14): Using default value 14 終点 シリンダ または +サイズ または +サイズM または +サイズK (14-1305, default 1305): Using default value 1305 コマンド (m でヘルプ): t 領域番号 (1-4): 2 16進数コード (L コマンドでコードリスト表示): 8e 領域のシステムタイプを 2 から 8e (Linux LVM) に変更しました コマンド (m でヘルプ): w 領域テーブルは交換されました! ioctl() を呼び出して領域テーブルを再読込みします。 警告: 領域テーブルの再読込みがエラー 22 で失敗しました: 無効な引数です。 カーネルはまだ古いテーブルを使っています。 新しいテーブルは次回リブート時に使えるようになるでしょう。 ディスクを同期させます。
ループバックデバイスを削除
# losetup -d /dev/loop0
DomainU(ゲストOS)を起動
# xm create <name>
以下ゲストOS内で
# pvscan # pvresize /dev/xvda2 # pvscan # lvscan # lvresize -L +20G /dev/VolGroup00/LogVol00 # resize2fs /dev/VolGroup00/LogVol00 # df -h
xenが重くなったときに試してみる事
xenに限った事じゃないけど、イメージファイルをSparseにしている場合、
I/O負荷が馬鹿にならない。
そんな時には思い切ってSparseをやめてみる。
cp --sparse=never 元イメージファイル 新イメージファイル
ファイルサイズによっては結構時間がかかるけど。
終わったら ls -s で見ると実ファイルと同じサイズになっているのが分かる。