著者アーカイブ


概要

Teeple2 にデータベースマイグレーション機能を追加しました。これによりコマンド一発でデータベースの変更を適用し、エンティティクラスもそれに合わせて更新できるようになりました。
マイグレーション機能はシステムリリース後もそうですが、開発中も複数人で開発している場合は特に有用です。

使い方

まずmigrationディレクトリにDataSource名でディレクトリを作成します。
その中にデータベースに適用したいDDL文を NNN-somename.sql という形式で配置します。
「NNN」は001のようにバージョンを数字で表します。
ハイフン、またはアンダースコア以降は適当なファイル名で構いませんが拡張子は.sqlにする必要があります。

次に以下のコマンドを実行して差分を適用します。

$ php cli.php Teeple_Migration
 (cli.phpはbinディレクトリにある)

エンティティも同時に上書きしたい場合は –entityをつけます。

$ php cli.php Teeple_Migration --entity

※ Entity_Base_* が更新されます。

リンク

Comments Teeple2にデータベースマイグレーション機能を追加 はコメントを受け付けていません


概要

PHPでケータイサイトを作る際に非常に便利に使わせていただいているのが「らくらくケータイ3キャリアコンバーター(仮名)」です。(詳しくはke-tai.org > Blog Archive > PHPを使って3分で作る3キャリア対応ケータイサイト をご覧ください。)
簡単にいうと以下のようにやると3キャリア対応のケータイサイトが1つのソース(HTML)で実現できます。

  • HTML(テンプレート)はXHTMLでShift_JISで書く
  • 絵文字はドコモのunicode形式で書いておく (これを上記モジュールで出力時に変換する)

さてここでフォームの入力モード(docomoだとistyleとか)を指定したい場合にはどうしたらよいでしょうか?
「ケータイ xhtml 入力モード」とかでぐぐると以下のようなサイトがヒットします。

これらのサイトで述べられていることをまとめると以下のようになります。

  1. style属性でwap-input-formatを各キャリア仕様分並べて書いてやれば3キャリアとも機能する
  2. ただしSoftBankの一部の機種(特にSHARP)で入力制限モード(指定したモード以外の文字種が入力できない状態)になってしまう

大体のサイトでは2の条件はNGだろうと思うので結論としては「絵文字のように出力時に置換してやる方法しかない」ということになります。

そこで、「らくらくケータイ3キャリアコンバーター(仮名)」には docomoのときだけ istyle を wap-input-format に変換する関数が用意されていますがこれを拡張して3キャリア対応の関数を追加しました。

修正箇所

convert_istyle関数の追加


    /**
     * 入力モード指定変換(全キャリア)
     *
     * iモード用の入力モードの変換を行う
     *
     * @param   string  $input  変換対象の文字列
     *
     * @return  string          変換後の文字列
     */
    function convert_istyle($input, $agent)
    {
        $rep_arr_master = array(
            'DoCoMo' => array(
                'istyle="1"' => 'istyle="1" style="-wap-input-format:"*<ja:h>";"',
                'istyle="2"' => 'istyle="2" style="-wap-input-format:"*<ja:hk>";"',
                'istyle="3"' => 'istyle="3" style="-wap-input-format:"*<ja:en>";"',
                'istyle="4"' => 'istyle="4" style="-wap-input-format:"*<ja:n>";"'
            ),
            'SoftBank' => array(
                'istyle="1"' => 'mode="hiragana" istyle="1" format="*M"',
                'istyle="2"' => 'mode="hankakukana" istyle="2" format="*M"',
                'istyle="3"' => 'mode="alphabet" istyle="3" format="*x"',
                'istyle="4"' => 'mode="numeric" istyle="4" format="*N"'
            ),
            'EZweb' => array(
                'istyle="1"' => 'istyle="1" format="*M"',
                'istyle="2"' => 'istyle="2" format="*M"',
                'istyle="3"' => 'istyle="3" format="*x"',
                'istyle="4"' => 'istyle="4" format="*N"'
            ),
        );
        
        $carrier = KetaiConverter::getCarrier($agent);
        if (! preg_match('/DoCoMo|SoftBank|EZweb/', $carrier)) {
            return $input;
        }
        $rep_arr = $rep_arr_master[$carrier];
        
        $output = $input;
        preg_match_all('/<input (?:.*)(istyle=("|\')?[1-4](?:"|\')?)(?: (?:.*?))?>/i', $input, $arr);       // inputタグを検索し、配列に格納
        for ($i = 0; $i < count($arr[0]); $i++) {
            // 必要な変数を取得
            $target = $arr[0][$i];          // 置換対象
            $istyle = $arr[1][$i];          // istyle属性
            $quote = $arr[2][$i];           // クォート
            $replacement = strtr($target, $rep_arr);
            $output = str_replace($target, $replacement, $output);
        }
        
        return $output;
    }

convert関数の最後に convert_istyleを呼び出し


       // istyleの変換
        $output = KetaiConverter::convert_istyle($output, $agent);

※convert()内でDocomoのときに呼び出されている istyle_imode()はコメントアウトしておきます。

課題

今のところこのような形で運用していますがAUの一部の機種でどうしても「入力制限モード」になってしまうことがあるようです。調べた結果AUの仕様の書き方が曖昧で、これはどうしようもないとの結論に至っています。

まとめ

「らくらくケータイ3キャリアコンバーター(仮名)」はこのようにケータイサイトの出力時にいろいろ変換をかませるモジュールとして大変便利でカスタマイズしやすくなってます。
たとえばこれ以外にも

  • formのaction属性にguid=ONをつける

という変換なども加えて使っています。
このような便利なモジュールを公開してくださったke-tai.orgさんに感謝です。

参考

添付

viewer.php

Comments PHPのケータイ絵文字変換モジュール「らくらくケータイ3キャリアコンバーター(仮名)」に入力モード指定変換機能を追加 はコメントを受け付けていません


概要

先日MySQLのMaster-Slaveレプリケーションが何かの拍子に機能しなくなっていることがわかりました。
このような状況に陥ったときの修正手順についてまとめてみます。

環境:

  • Debian lenny
  • MySQL 5.0.51
  • 1台のマスタから1台のスレーブに対してレプリケーションしている構成

修正前のSlave状態

まず、現在のSlaveの状態を確認します。

mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_State:
                Master_Host: xxx.xxx.xxx
                Master_User: repl
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysqld-bin.000005
        Read_Master_Log_Pos: 13341150
             Relay_Log_File: mysqld-relay-bin.000232
              Relay_Log_Pos: 98
      Relay_Master_Log_File: mysqld-bin.000005
           Slave_IO_Running: No
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 13341150
            Relay_Log_Space: 98
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: NULL
1 row in set (0.01 sec)

⇒「Slave_IO_Running: No 」になっています。
ちなみにマスタの状態は、、

mysql> show master status\G
*************************** 1. row ***************************
            File: mysqld-bin.000009
        Position: 42782848
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)

となっています。明らかにずれています。

復旧手順

MasterのバックアップとPositionの確認

Masterのバックアップを取ると同時にLog Positionを確認しておきます。

(Master側で)
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
※ここで表示される FileとPositionの値を記録しておく。

バックアップはmysqldumpコマンドで行ないます。

$ mysqldump -u root -p --lock-all-tables --databases db1 db2 ...  > mysql.dmp

バックアップが終わったらロックを解除します。

(Master側で)
mysql> UNLOCK TABLES;

※ここまでの間、DBへの書き込みがブロックされることになります。

Slave側にバックアップを適用

Masterで取得したバックアップファイルをSlaveに適用します。

(Slave側で)
mysql> drop database db1 db2 ....;
$ mysql -u root -p < mysql.dmp

Slave側でMasterのpositionをセットしてレプリケーション開始

Masterバックアップ時に記録したFile名とPotisionをSlaveにセットしてレプリケーションを開始します。

(Slave側で)
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001',  MASTER_LOG_POS=4320981;
mysql> START SLAVE;

これで完了。Master側で SHOW MASTER STATUS, Slave側で SHOW SLAVE STATUSを実行してレプリケーションが機能していることを確認します。

Nagiosでのレプリケーション監視

WEB+DB PRESS vol.54に書いてあるとおりなのですがNagiosでレプリケーションの監視ができることを知りました。
標準プラグインで提供されている「check_mysql」を使用するのですがDebianの場合は
/etc/nagios-plugins/config/mysql.cfg に以下のように追記してコマンドを用意しました。

# 'check_mysql_slave' command definition
define command{
        command_name    check_mysql_slave
        command_line    /usr/lib/nagios/plugins/check_mysql -H '$HOSTADDRESS$' -u '$ARG1$' '$ARG2$'
}

そしてサーバの定義ファイルに

define service{
        use                             generic-service
        host_name                  localhost
        service_description       mysql
        check_command         check_mysql_slave!nagios!-S
}

のように設定します。

※監視用につかう nagiosユーザには REPLICATION CLIENTに加えて SUPERの権限が必要でした。

mysql> GRANT SUPER,REPLICATION CLIENT ON *.* TO nagios@localhost;

※今回は既に一度レプリケーション構成を構築していた環境で再設定することについてまとめましたが、一からレプリケーション構成を構築する場合にはこれに加えていくつかの作業が必要となります。下記のリンクなどが参考になります。

参考

Comments MySQLのレプリケーションが不整合になってしまったときの再構築手順 はコメントを受け付けていません


はじめに

はてなから引っ越して技術的な情報をまとめるブログにしようと思います。できるだけ役に立つような記事を書くように心がけます。以下、google codeに公開しているものたちを紹介します。

Teeple2 ~ Java屋のためのPHP5フレームワーク

teeple2は「Java屋のためのPHP5フレームワーク」をコンセプトににseasar2ファミリーのteedaやSAStrutsのエッセンスを取り込んだ、PHP5のWebアプリケーションフレームワークです。
以下のような特徴を持っています。

  • 学習コストを極限まで低くしました。(規約をできるだけ少なく、シンプルに)
  • ブラウザからURLにアクセスするだけでActionクラスの雛形を自動生成できます。
  • URLとActionとのマッピング定義が不要です。
  • 設定ファイルを書くだけの入力値検証(Validator)
  • 設定ファイルを書くだけの入力値変換(Converter)
  • メソッドチェーン型の易しいDBアクセスライブラリ(O/Rマッパー)を提供しています。
  • ServletFilterのようなFilter構造を採用しています。
  • HTMLテンプレートにはsmartyを使用します。
  • HTMLモックアップからそのまま開発に進めるように心がけています。(URLを変えない)
  • DIパターンによるシンプルな構成
  • Eclipseでの開発に最適化、コードアシストを最大限に活用できる構成にしています。

くわしくは http://code.google.com/p/teeple2/ をご覧ください。
過去のブログもあわせてご覧ください。

S2Vali ~ Seasar2用Validationフレームワーク

S2ValiはSeasar2で commons-validatorを簡単に使うためのフレームワークです。

主な用途:

  • アップロードしたCSVファイルの検証に
  • SOAPサービスの入力値検証に
  • バッチプログラム等の入力値検証に

各種MVCフレームワークに付属しているValidatorで実現できない箇所に使用することを想定しています。

くわしくは http://code.google.com/p/s2vali/ をご覧ください。
過去のブログもあわせてご覧ください。

Comments ようこそ はコメントを受け付けていません


概要

今週からWordPressと格闘しています。主に技術情報をまとめるブログにしたいので、これまで慣れているはてな記法とコードを美しく見せるためのSyntaxHighlighterをプラグインで導入したいと思っていました。いろいろと試行錯誤してみた結果、

  1. 「WP HatenaNotation」と「SyntaxHighlighter2」をそれぞれインストールして有効化
  2. コードを書くときははてなのスーパーpre記法で書く

ことで望みどおりの結果を得られました。

※2010/10/28 追記:いろいろ弄っているうちにはてなのスーパーpreで書いたときにSyntaxHighliter2のJavascriptエラーが発生するようになってしまいました。結局、「はてな記法の設定」から「WordPressの改行を使用する」を「はい」に変更したところ、SyntaxHighlighter2の記法でいけるようになりましたので今はそちらを使ってます。

はてなのスーパーpre記法でコードを書いた場合

記法

>|php|
    public function serializeField($entity, $fields, $json=FALSE) {
        
        foreach($fields as $field) {
            if (! Teeple_Util::isBlank($this->$field)) {
                $entity->$field = $json ?
                    json_encode($this->$field) : serialize($this->$field);
            } else {
                $entity->$field = NULL;
            }
        }
        return;
    }
||<
表示
    public function serializeField($entity, $fields, $json=FALSE) {
        
        foreach($fields as $field) {
            if (! Teeple_Util::isBlank($this->$field)) {
                $entity->$field = $json ?
                    json_encode($this->$field) : serialize($this->$field);
            } else {
                $entity->$field = NULL;
            }
        }
        return;
    }

このように期待通りに表示されました。
おそらく動作原理は以下のようになっていると思います。

  1. WP HatenaNotationが >|php| ~ ||< までを
    <pre class="brush: php;"> ~ </pre>
    

    に変換。

  2. SyntaxHighlighter2が pre内をハイライト。

次はSyntaxHighlighter2の記法でやってみた場合の失敗例です。

SyntaxHighlighter2でのハイライト

記法

[ code="php" ]
    public function serializeField($entity, $fields, $json=FALSE) {
        
        foreach($fields as $field) {
            if (! Teeple_Util::isBlank($this->$field)) {
                $entity->$field = $json ?
                    json_encode($this->$field) : serialize($this->$field);
            } else {
                $entity->$field = NULL;
            }
        }
        return;
    }
[ /code ]

表示


    public function serializeField($entity, $fields, $json=FALSE) {
        
        foreach($fields as $field) {
            if (! Teeple_Util::isBlank($this->$field)) {
                $entity->$field = $json ?
                    json_encode($this->$field) : serialize($this->$field);
            } else {
                $entity->$field = NULL;
            }
        }
        return;
    }

このように<p>タグが入ってしまいます。。恐らくWP HatenaNotationが悪さをして <p>タグを入れてしまっているものと思われます。

参考

Comments WordPressのプラグイン「WP HatenaNotation」と「SyntaxHighlighter2」を同居させるには はコメントを受け付けていません