munin mysql_isam_space_ の division by zero エラー対策
CentOSに5.xにrpmforgeからmuninをインストールしましたが、mysql_isam_space_がエラーを吐きます。
Illegal division by zero at /etc/munin/plugins/mysql_isam_space_xxxx line 220, line 1.
で、その対策パッチ
- mysqlshowの結果をパースしているあたりが怪しいので修正。
- Max_data_lengthが0の場合の対策。
これで、munin-node-configure –suggest で、ずらずら候補が表示されればうまくいきます。
後は、munin-node-configure –suggest –shell | /bin/sh でリンクを張って、munin-nodeをreloadすればOKです。
うまくいかないときは、statefile (/var/lib/munin/plugin-state/plugin-mysql_isam_space.state)のパーミッションと更新時刻(更新時刻が1時間以内だと、処理をスキップするようです)が怪しいので、見直してください。
で、とりあえずグラフ化されるようになったのですが、なんか値が0.00ばっかりで、見ててもつまらないです。
InnoDBだと、Max_data_lengthの値が0なので、意味がないですし。。
設定ファイルでabsoluteを1にすれば、Data_lengthの値がそのまま出るので、こちらの方が実用的かもしれません。
Symfony TemplatingをCakePHPで使ってみる
CakePHPでSymfony Templatingを使ってみる
前回はSymfony Templatingを単独で利用したり、Smartyと連動させてみました。
次に何をしようかと思い、現在のsymfonyで組み込んでみようかと思いましたが、すでにOpenPNEでおなじみの手嶋屋の海老原さんがブログで実践されていました。
というわけで、あのCakePHPのViewとしてSymfony Templatingを使ってみたらどうだろうと思い試してみました。
ただし、CakePHPのViewを完全に置き換えているわけではありません。
とりあえずCakePHPのViewとして動作させることができたという感じです。
Symfony Templatingを使ってみませんか?
Symfony Componentsというのをご存知でしょうか?その名前のとおり、あのPHPのフレームワークで有名なsymfonyに関係するコンポーネントなのですが、symfonyの次期バージョンであるSymfony2で利用されるコアとなる各コンポーネントがライブラリとして公開されています。
近頃、その1つでテンプレート機能部分である Symfony Templatingが公開されましたので、さっそく使ってみました。軽量で柔軟性が高いのでsymfonyを使った事がある人も無い人も簡単に導入する事が可能だと感じました。
そこで、symfonyを使った事がある人も無い人も、「テンプレートエンジンといえばSmartyを使っているけど、PHPってテンプレートエンジンみたいなものだしPHPでテンプレートを書きたい。。」という方まで、ドキュメントとソースを読んで実際に使ってみた例を紹介したいと思います。
Gitで更新時にメールを送信する
社内のソースバージョン管理でgitも使ってみようということで、開発メンバーが利用できるようにgit環境を構築しています。
subversionで管理しているときは、commit時にcommitの概要をMLにメールを送信するようにしていました。メールが届いたから何かをするわけではありませんが、commit内容をわざわざ報告しなくてもMLで共有できるので便利です。
gitでも同様のことができまるようにしてみました。gitの場合は複数のリポジトリが存在しますが、情報が欲しい情報のはみんなが共有しているリポジトリの更新内容です。なので、共有リポジトリに対してのみ設定を行います。
DoctrineのfindBy,findOneByにorder byを追加する方法
symfonyではDoctrineが実質的な標準ORMになりました。
まだまだ使いきれていないのですが、機能が豊富にあるため知っているのと知らないのではかなりの差がでてきます。
今回は知っていると得するDoctrineの小ネタです。
Doctrineの特徴としてfindByとfindOneByメソッドがあります。
これらはマジックメソッドで実装されており、カラム名をつけて呼び出すことでより通常のDQLの記述よりも短くすっきりと書くことができます。
CakePHP IRC集会に参加しました
昨日cakephperさん主催のCakePHP第三回IRC集会に参加させて頂きました。
業務中だったこともあり、前半ほとんど発言できず、、途中開発環境の件では、みなさんの環境が立派すぎて「sakuraエディタです」とは言えませんでした。。
(社内の2名はEmacs派のようです)
結局、最後の1時間くらいでようやくご挨拶。このブログも取り上げて頂き有難うございました。
ウチの記事を知って頂いていた方もいらして、少しはCakePHP界に貢献できていることが実感できました。
IRCでも話に出ていましたが、CakePHPの素晴らしさはFWとしての機能も当然ありますが、
知識の共有が積極的に行われていることに尽きると思います。
本の執筆活動、フォーラムでのフォロー、勉強会やIRC集会、各自のブログ、etc・・
これらの活動をされている方々には本当に感謝しています。
弊社も少しずつですが、何らかで貢献していければと思っています。
CakePHP MySQLのバックアップ(mysqldump)を行うバッチ
CakePHP1.2からコマンドラインからCakeが起動できるようになりました。
この機能を使って、MySQLのバックアップを行う簡単なスクリプトを作成してみました。
データベースの接続には、/app/config/database.phpの接続情報を利用しています。
CakePHP 動的なウィジェットの作り方
CakePHPではコントローラーでの処理はビューを介してレイアウトのメインコンテンツ($content_for_layout)の部分に展開されます。
その際レイアウトに配置してあるメインコンテンツ以外の部分は基本的にはコントローラーから操作ができません。(たぶん)
一般的なサイトでは2段組みや3段組みのレイアウトを使うケースが多いと思いますが、メインコンテンツ領域以外もCakeを使って柔軟に制御する方法を検討します。
(出力されるHTMLの部品をウィジェットとします)
※今回の実装サンプルはこちらから確認できます。
※ソースコードはこちらからダウンロードできます。
※サンプルではメインコンテンツ側で指定されたカテゴリの情報をフッター部に表示しています。
CakePHP Behaviorでバリデーション周りの効率化を図る 応用編
前回紹介したBasicValidationBehaviorを使って、動的にバリデーションを切り替える方法を紹介します。
共通のモデルを複数のフォームで利用している場合にバリデーションの定義を動的に変更したい場合などに有効です。
例1:新規登録時と編集時でバリデーションの登録項目を変更する
対応1)loadValidate()メソッドに引数を追加し、条件によって分岐させる
[モデル内の処理]
-
function loadValidate($action = 'add') {
-
'name' => 'required | maxLen[50]',
-
'email' => 'required | email | isUnique | maxLen[200]',
-
'password' => 'required | single | maxLen[20] | minLen[6]',
-
're_password' => 'required | confirm[password]',
-
'sex' => 'required | numeric | maxLen[1]',
-
'birthday' => 'required | ymd',
-
'tel' => 'required | phone | maxLen[13]',
-
'zip' => 'required | zip | maxLen[8]',
-
'pref' => 'required | maxLen[12]',
-
'addr1' => 'required | maxLen[200]',
-
'addr2' => 'maxLen[200]',
-
);
-
// 新規登録時以外はパスワード関連の項目を無効にする
-
if($action !== 'add'){
-
}
-
$this->setValidate($valid);
-
}
対応2)コントローラーでモデルのvalidate()やsave()前にloadValidate()を明示的に実行する
[コントローラー内の処理]
-
function add(){
-
// 処理を省略
-
-
$this->TestUser->set($this->data);
-
// バリデーションを設定
-
$this->TestUser->loadValidate('add');
-
if($this->TestUser->validates()) {
-
-
// 処理を省略
-
}
-
-
function edit($id = null){
-
// 処理を省略
-
-
$this->TestUser->id = $id;
-
$this->TestUser->set($this->data);
-
// バリデーションを設定
-
$this->TestUser->loadValidate('edit');
-
if($this->TestUser->validates()) {
-
-
// 処理を省略
-
}
CakePHP Behaviorでバリデーション周りの効率化を図る
CakePHPでバリデーションを使う際、標準(CakePHP1.2)のままでも十分開発はできますが、大きめのプロジェクトや複数のプロジェクトでも汎用的かつ効率的に使えるようにできないかと検討しました。
バリデーション改善の目的
- エラーメッセージを日本語化し共通化・デフォルト化したい
- 独自バリデーションメソッドを共通化したい
- ルール配列を簡単に記述したい(項目が多いとソースが長くなり過ぎて見通しがよくない)
- バリデーションの前に自動で整形処理をしたい(半角英数変換やカタカナ変換など)
実装にあたって
バリデーションメソッドの共通化については、
cakephperさんの日記:よく使う独自バリデーションルールをプラグインのbehaviorにまとめる
に記載してありますように、プラグインのbehaviorで管理するほうが良いと思いますが、今回は弊社で過去に実装した通常のbehavior(BasicValidationBehaviorとします)を使った方法を紹介します。