• [勉強会] ZendFramework勉強会@Tokyo で話してきました

    ちょっと遅くなってしまいましたが、4/4に開催されたZendFramework勉強会@TokyoのLTで話してきました。 準備不足もさることながら、半分くらいで制限時間が来てしまうなど非常にグダグダでしたので、出席された皆さんには申し訳ないと思っています。 発表資料はこちらにおいておきます。firefoxで見てください。 いくつか勉強会報告の記事を読んでいたら、junichiroさんのブログでこんな意見がありました。 ブログが続かないわけ Zend\_Log にローテーションの機能をつけようという話。 僕の個人的な感想としては、疑問符がつくないようだったが、(略) (略) logrotate と比較して、ZendFramework で実装することのメリットを提示して もらえたら、より面白かったと思う。 まず、作った経緯ですが、 権限的にlogrotateの設定ができない状態だったので、アプリ側でやる必要があった log4phpとでもよかったが、Zend Frameworkの(拡張も含む)で完結させたかった Zend Frameworkでも作っている気配が無かったので作ってみた という感じです。わりと無駄なものを作るのが好きなきらいがあります。 メリットとしては ZFが使える環境ならどこでもログのローテーションできる 時間やサイズ以外でも、任意のタイミング、方法でローテーションができるように拡張可能 という感じでしょうか。あまりいい答えではないですね。。。 実際自分も、常にアプリ側でローテーションを行なっているかというとそうではなく、むしろlogrotateを使ってやっているケースのほうが多いです。 選択肢の一つとしてZend Frameworkのコンポーネントにあってもいいんじゃないかな、と思っているのが実際のところです。 先ほどのjunichiroさんのブログを見ると、一応よい好評もあったようなので、ほっとしています。 調子に乗ってプロポーサルしてみようかな、なんて思っています。 ソースはgithabにおきました。 ほかのものもおいてありますが、完全に自分用なのであまり使えないかもしれません。 使い方や拡張方法は次のエントリーで書いてみようと思っています。
  • [Emacs] Poderosaを使うときのEmacs用の設定覚書

    ・設定した内容 [ツール]→[オプション] からオプション設定ダイアログを表示して、[操作]の[キーボード]のグループで以下を設定 左Altキーの用途を「Metaキー」に変更(右Altキーは「メニューとショートカット」のまま) 「Backspaceキーで0x7Fを送信」にチェック 追加キー定義に以下を追加(C-/ でundo) Ctrl+OemQuestion=0x1F 一番下が結構重要だったりします。 ・参考 http://d.hatena.ne.jp/whitypig/20080617/1213702348
  • [apache] apacheでリバースプロキシーを設定したときのメモ

    apacheでリバースプロキシの設定をしました。 ■ 条件など ・Apacheのバージョンは2.2.8 ・画像、css、jsなどの静的ファイルについてはリバースプロキシで配信を行う。 ・動的なファイルのときはアプリケーションサーバにリクエストをプロキシする ・画像、css、jsのパスはそれぞれ以下の通り``` wadslab.net/images wadslab.net/css wadslab.net/js **■ 設定** リバースプロキシの設定を行うのに必要なApacheのモジュールは以下のとおりです。``` mod\_rewrite mod\_proxy mod\_proxy\_http ```設定は、リバースプロキシサーバーのhttpd.confとか、httpd.confの下のほうにある``` \# Virtual hosts #Include conf/extra/httpd-vhosts.conf ```のIncludeの部分をコメントアウトして、httpd-vhosts.confを編集します。 設定の内容は以下のようになります。``` ServerName wadslab.net RewriteEngine On RewriteRule ^/(images|css|js|)/ - \[L\] RewriteRule ^/(.\*)$ http://192.168.0.100/$1 \[P,L\] ```これでapacheを再起動すればバースプロキシの設定は終了です。簡単ですね。 一度リクエストをかけた後、リバースプロキシ、アプリケーションサーバの両方でaccess\_logをみて、うまくリクエストを振り分けられたかどうか確認できます。 **■ ssl通信を処理するときの設定** 上記設定は80番のポートに対しての設定だったので、ssl通信についてもリバースプロキシで処理する場合はもう少し設定が必要す。 sslでのリクエストの場合は、私の環境ではhttpd.confを以下のように編集して、``` \# Secure (SSL/TLS) connections Include conf/extra/httpd-ssl.conf #コメントをはずす ```httpd-ssl.confというファイルで設定をしています。 以下、これを前提に記述します。 sslでリクエストがきた場合、httpd-ssl.conf内の``` ... ```のディレクティブの設定が適用されます。 設定自体は、上記ディレクティブ内に``` RewriteEngine On RewriteRule ^/(images|css|js|)/ - \[L\] RewriteRule ^/(.\*)$ http://192.168.0.100/$1 \[P,L\] ```と書けばOKです。 設定の通り、リバースプロキシーとアプリケーションサーバ間のリクエストは非sslとなるので、アプリケーション側でsslでのリクエストかどうかを知りたい場合は、ちょっと工夫が必要です。 以下のように、プロキシさせる場合にはヘッダーを設定して、``` RewriteEngine On RewriteRule ^/(images|img|css|js|favicon\\.
  • [Zend Framework] Zend_Filter_InputをZend_Controllerで使ったときのメモ

    Zend Frameworkを使って、MVCフレームワークで開発しているとき、Zend_Filter_Inputを使ってフォームで入力された値のフィルタリングを行う処理を記述した時のメモ。 以下のようなフォームで、入力された値についてチェックをかける場合。``` 登録する情報を入力 ユーザー名: パスワード: パスワードの確認: ユーザ名は半角英数字、5文字以上10文字以下 パスワードは半角英数字、5文字以上10文字以下 ```普通にZend\_Filter\_Inputを使ってフィルタリング処理をアクションメソッドに書くと以下のようなになります。``` class RegisterController extends Zend\_Controller\_Action { .... public function confirmAction() { $validate = array( 'id' => array( 'Alnum' array('StringLength', 5, 10), 'presence' => 'required', 'message' => array( 0 => ... // Alnumに対するエラーメッセージ 1 => ... // StringLengthに対するエラーメッセージ ) ), 'password1' => array( 'Alnum' array('StringLength', 5, 10), 'presence' => 'required', 'message' => array( 0 => ... // Alnumに対するエラーメッセージ 1 => ... // StringLengthに対するエラーメッセージ ) ), 'password2' => array( 'Alnum' array('StringLength', 5, 10), 'presence' => 'required', 'message' => array( 0 => .
  • [mysql][Apache] mod_log_sql関連のベンチマーク

    前回設定した項目についてベンチマークをとりました。 今回のテストケースは 通常のaccess_log(ファイル)に保存 BufferedLogsディレクティブをONにしたaccess_log mod_log_sql+MyISAMストレージエンジン mod_log_sql+Archiveストレージエンジン の4つです。 それぞれ上記設定をしたwebサーバに、apacheのabコマンドを使ってテストしました。``` # /usr2/apache2/bin/ab -c 100 -n 10000 http://example.com/ 1度に100ユーザ同時接続し、合計で10000回リクエストをかけています。 リクエストをかけると、以下のようなシンプルなレスポンスが帰ってきます。 これは静的ファイルで用意されています。 test テストケース リクエスト数/秒 1に対する割合 1 7598.81 100% 2 8670.88 114.1% 3 4340.90 56.7% 4 3119.29 41.0% mod\_log\_sqlを使うと、MyISAMを用いた場合はもともとの57%弱、Archiveに至っては40%程度しかパフォーマンスが出ていません。結構性能が落ちていますね。 INSERTパフォーマンスは、ArchiveだとMyISAMの1.5倍くらいあると聞いていたので、Archiveのほうがパフォーマンスがよくなると予測していたのですが、そのような結果にはなりませんでした。同時接続数とか条件で変わってくるのかもしれませんが、今回は検討しません。 続いて、ログファイルのサイズについて検討します。 dbに保存されたデータについては、``` SHOW TABLE STATUS LILE 'access\_log'\\G \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 1. row \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* Name: access\_log Engine: ARCHIVE Version: 10 Row\_format: Compressed Rows: 119070 Avg\_row\_length: 11072 Data\_length: 2764858 Max\_data\_length: 1318343040 Index\_length: 0 Data\_free: 0 Auto\_increment: NULL Create\_time: 2008-12-02 16:30:49 Update\_time: 2008-12-02 16:30:49 Check\_time: NULL Collation: utf8\_general\_ci Checksum: NULL Create\_options: Comment: 1 row in set (0.
  • [mysql][Apache] mod_log_sqlを使ってApacheのアクセスログ(access_log)をmysqlのARCHIVEストレージエンジンに保存する

    mod_log_sqlを使って、Apacheのアクセスログをmysqlに保存する設定をしたときのメモです。 アクセスログを保存するmysqlのストレージエンジンには、前からずっと気になっていたARCHIVEストレージエンジンを使用しました。 ■ ARCHIVEストレージエンジンについて ロギングや監査用途に向いている。SELECT、INSERT命令しか使えない INSERTのパフォーマンスはMyISAMの1.5倍、InnoDBの3.5倍 データは圧縮して格納(圧縮率70~80%) インデックスは非対応 一般ユーザーの利用率は5%程度 すべて以前行ったセミナーでもらった資料より抜粋です。 ■ ログを保存するデータベースを作成 mysqlのインストールは完了しているものとして割愛します。 ただmysqlをソースからビルドしてインストールする場合には、configure時に–with-archive-storage-engineオプションを追加しないとARCHIVEストレージエンジンは使用できません。 現在のMySQLでARCHIVEストレージエンジンが有効かどうかを調べるには以下のようにします。``` mysql> show variables like ‘have_archive’; +—————+——-+ | Variable_name | Value | +—————+——-+ | have_archive | YES | +—————+——-+ 1 row in set (0.00 sec) 結果にYESと出ればARCHIVEストレージエンジンを使用できます。 もしNOと出た場合には、--with-archive-storage-engineオプションをつけて再度mysqlをビルドする必要があります。 続いてログ保存用のデータベースを、apachelogsという名前で、ストレージエンジンをARCHIVEで作成します。 /etc/my.cnfに以下のように設定してデフォルトのストレージエンジンをARCHIVEにします。設定後にmysqlを再起動します。 [mysqld] default-storage-engine=archive ストレージエンジンの設定方法は他にも色々あります(テーブル作成時に設定とか、alter tableとか)が、ここでは割愛します。 続けてログを保存するデータベースの設定をします。 mysql> create database apachelogs; Query OK, 1 row affected (0.00 sec) mysql> use apachelogs; Database changed mysql> grant INSERT, CREATE ON apachelogs.
  • [git] git 備忘録 - タグとブランチ

    gitのタグとブランチの基本操作を備忘録として書いておきます。 タグ関連 タグを作成 $ git tag < タグ名> 現在作成されているタグの確認 $ git tag -l test test2 example ワイルドカードも使えます $ git tag -l "test\*" test test2 タグがリンクしているハッシュ値を確認する $ git rev-parse test c8d5c281933cfe5c94222cb2a1b761eae7901b32 ブランチ関連 ブランチを作成する $ git branch < ブランチ名> 現在のコミット(HEAD)からブランチが作成されます ブランチを確認する $ git branch * master test-branch masterはgit cloneでローカルリポジトリを作成したときに最初から作られるブランチです。 現在のブランチに*が付きます。 タグを指定してブランチを作成 $ git chekout -b < ブランチ名> < タグ名> 現在のブランチは、新しくチェックアウトしたブランチに切り替わります。 ハッシュ値を指定してブランチを作成 $ git chekout -b < ブランチ名> < ハッシュ値> 同様にブランチが切り替わります 例です $ git checkout -b test-branch2 test2 Switched to a new branch "test_branch2" $ git branch master test-branch * test-branch2 $ git checkout -b test-branch3 c8d5c281933cfe5c94222cb2a1b761eae7901b32 Switched to a new branch "test_branch3" $ git branch master test-branch test-branch2 * test-branch3 ブランチを切り替える $ git checkout test-branch Switched to a new branch "test_branch" $ git branch master * test-branch test-branch2 test-branch3 ファイルを変更後、コミットせずにブランチを切り替えた場合、切り替えた先のブランチにどうファイルが存在する場合は変更が適用されます。
  • [ubuntu][trac][git] gitとtracを連携させる

    tracで連携するリポジトリとして、subversionではなくgitを使う設定をしました。 今回はそのときの設定ログです。 gitとtracの連携にはGit Plugin for Tracというプラグインを使いました。以下インストール手順です。 インストール 1. ソースのダウンロード まずはプラグインをリポジトリからダウンロードします。``` $ mkdir ~/tmp $ cd ~/tmp $ git clone http://nanosleep.org/git/trac-git-plugin/ Initialized empty Git repository in /home/wada/trac-git-plugin/.git/ /usr/bin/git-clone: 310: curl: not found Cannot get remote repository information. Perhaps git-update-server-info needs to be run there? curlがインストールされていないようなのでインストールします。 $ sudo apt-get install curl 改めてプラグインをダウンロードします。 $ git clone http://nanosleep.org/git/trac-git-plugin/ **2\. インストール** 続いて、プラグインをtracにインストールします。 $ cd trac-git-plugin/0.10 $ python setup.py Traceback (most recent call last): File “setup.py”, line 1, in from setuptools import setup ImportError: No module named setuptools setuptoolsが必要とのこと。 ez\_setup.
  • [Zend Framework]Zend_Domを使ってみた

    Zend Framework 1.6から追加されたZend_Domを使ってみました。 XPathだけではなく、CSSセレクタによるDOMドキュメントの問い合わせを行うことができます。 以下のような感じでドキュメントを読み込ませてみました。``` require_once ‘Zend/Dom/Query.php’; $str =< « EOD title item 1 item 2 EOD; $zend_dom = new Zend_Dom_Query($str); echo “Document Type is “; echo $zend_dom->getDocumentType() . “\n”; echo “Document is \n”; echo $zend_dom->getDocument() . “\n”; 結果は以下のとおりです。 Document Type is docHtml Document is title item 1 item 2 getDocumentType()でドキュメントのタイプが取得できます。 ドキュメントのタイプは、Xml、html、xhtmlの3タイプで判別されます。判別の方法は以下のようになっています。 public function setDocument($document) { if (‘< ?xml’ == substr(trim($document), 0, 5)) { return $this->setDocumentXml($document); } if (strstr($document, ‘DTD XHTML’)) { return $this->setDocumentXhtml($document); } return $this->setDocumentHtml($document); }
  • [ClamAV] ClamAVのインストール

    オープンソースのアンチウィルスソフトウェアであるClamAVをインストールしてみました。 インストール ClamAV用のユーザおよびグループを作成します。 # groupadd clamav # useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav 続いてClamAVのビルドをします。 % wget http://freshmeat.net/redir/clamav/29355/url\_tgz/clamav-0.94.tar.gz % tar zxvf clamav-0.94.tar.gz % cd clamav-0.94 % ./configure --sysconfdir=/etc % make % su - # make install # ldconfig make時にzlibが古いといわれたら、zlibをアップデートしてからビルドしなおしてください。 % wget http://www.zlib.net/zlib-1.2.3.tar.gz % tar zxvf zlib-1.2.3.tar.gz % cd zlib-1.2.3 % ./configure --shared % make % su - # make install # ldconfig ClamAVのconfigure時に–enable-checkオプションをつけると、ユニットテストを行うことができます。 ユニットテストを行うには、別途check パッケージが必要です。 インストールされていない場合はこちらよりソースをダウンロードしてインストールしてください。 % tar zxvf check-0.