2006年9月アーカイブ

mod_rewriteお勉強

いまいち書きなれないRewriteRule。今日はUAでのrewriteを勉強。

RewriteEngine on

RewriteCond  %{HTTP_USER_AGENT}    ^UA1.*
RewriteRule  index.html /rewrite/ua1.html     [L]

RewriteCond  %{HTTP_USER_AGENT}    ^UA2.*
RewriteRule  index.html /rewrite/ua2.html     [L]

RewriteRule  index.html /rewrite/default.html [L]

上記は.htaccessでの記述なので、第1引数はディレクトリ内のファイル名。RewriteCondで%{HTTP_USER_AGENT}利用してUAのパターンを書いたらよろし。

さて、mod_rewriteってパフォーマンス的にどんな感じなんだろう?

MacPortsではvariantでオプション項目を指定する。

で、phpの場合、"php -a"とかpcntlとかmemory_get_usageだとかが使えなかったりする。なので、variantを追加して対応してみる。これでいいのか分からないけど、まあ、これでいいのだ。

variant devel {
        depends_lib-append      port:readline
        configure.args-append   --enable-debug \
                                --enable-pcntl \
                                --with-readline \
                                --enable-memory-limit
}

上記を"sudo port edit php5"とかして、variantのブロックに適当に追記。したら、"sudo port php5 +apache2 +mysql5 -postgresql +devel"でインストール。先述した使えないやつが使えるようになったので、ひとまずOK。

前は、configure.argsに直接書いてみたけど、今回はvariantをいじくってみて対応してみた。これでしばらく動かしてみて、またMacPortsで入れたパッケージがおかしくなれば、"sudo port edit"周辺でまずい事をしているという事かな。

気になるのは、CLIのオプションがconfigure次第で使えないという事。こういうのは普通なのかな?

MacPorts総入れ替え

dylibがどうとかでこれまで入れて来たパッケージがほぼ全滅。

imageだとかdirectだとかの関係?よく分からず/optをmvして最初からやり直してみる。

MacPortsからDarwinPortsの1.3.2を落として来て、インストール。なぜかpkgじゃないのを落としてしまったので、makeでインストール。

入れ終わって、早速phpでも入れようかとinstallしてもrsyncがどうとか、indexがどうとかでエラー。syncしないと駄目なんだね。

で、ついでにselfupdateもしておいたけど、これは1.3.20入ってるから意味無しだった。

さて、何入れる必要があるのかさっぱり。svn/sqlite/php/apache/mysqlほか多数?

HTMLに限った事ではないんだけど、内容は大して変わってなくても、インデントだとかぐちゃぐちゃになって行レベルではものすごい変更がある場合ってdiffはどう扱うんだろう。

本当に気になっているのは、diffというか、Subversionの差分。まあ、差分といえばdiffでしょう。きっと一般的なdiffの仕組みをSubversionでも使っているはず。

DreamWeaverのテンプレートを使っている場合、結構頻繁に衝突が起きる。しかも、衝突範囲がおおざっぱなので、ファイルの内容まるまる衝突として教えられる。

HTMLではコーディング規約を取り入れていないので、その影響もあるかも。規約あったかな?あったかも?

diffが内部的にブロックを判断して、上手い事整形してくれたら問題は無いのかな?インデント(行頭の空白)とかは無視出来るとかっていう事を教えてもらった気がするんだけど、HTMLのブロックを1行で書いたり複数行で書いたりしたときの差分までは無理だよね?

何か統一的な整形ツールを通してからcommitすべき?

普段使うEmacsはCarbonEmacsなんだけど、以前etagsをMacPortsで入れた時にemacsも入れたかなんかしたんだと思う。ctags入れる時にemacsが必要になったんだったか?

で、portのoutdatedをupgradeしようとしたらgettextかなんかがemacsがどうとかでこけた。emacsに何か問題がありそうなので、とりあえずMacPortsで入れたのを立ち上げてみれば、mallocがどうとかで立ち上がらず。

とりあえずMacPortsのemacsはdeactivate&uninstall。CarbonEmacsの方のemacsを使えるようにシェルの環境変数をいじってみた。

コンパイラとかの方が問題なのかな?それともCライブラリ?mallocとかいわれても、「メモリ領域確保するアレだよね?」くらいしか覚えてないし。。。

今も、gtk2でこけてるし。。。gtk2って何目的で入れたんだっけな?

PHP_CodeSnifferで遊ぶ

PHPのコーディング規約をチェックするライブラリがあるようなので、遊んでみた。
PHPコーディング標準への適応状況をチェックする PHP_CodeSniffer

まずはインストール。

~% sudo pear install PHP_CodeSniffer-alpha

まだalphaらしい。インストールすると、phpcsというコマンドが使えるようになって、そのヘルプは以下。

~% phpcs -h
Usage: phpcs [-nvi] [--report=] [--standard=]  ...
      : one or more files and/or directories to check
  : the name of the coding standard to use
    : print either the "full" or "summary" report
 -n         : do not print warnings
 -v         : print verbose output
 -i         : show a list of installed coding standards
 -h --help  : print this help message
 --version  : print version information

以下は、標準で対応しているコーディング規約。まだPEARのみ。

~% phpcs -i
The only coding standard installed is PEAR

コーディング規約は自分でも増やせるらしいけど、その辺は細かく追ってなし。

で、例のごとくEmacs用に適当に書いとく。

;;; ;;; PHPファイルの規約チェック
(defun php-code-standard-check ()
  "Performs a PHP code-standard-check on the current file."
  (interactive)
  (shell-command (concat "phpcs -v --standard=PEAR --report=full " (buffer-file-name))))

会社では、デイリービルドっぽくUnitTestを毎朝自動実行してる訳だけど、併せてこの辺もやっとくといいのかな?

JavaScriptのsubmit()を使うとonsubmitに拾われない。

type="submit"だとonsubmitが拾ってくれるので、フォーム送信の際の前処理を一括で書ける。けど、type="button"のonclickでsubmit()した場合、フォーム送信はしてくれるけど、onsubmitが拾ってくれないので、onsubmitに書いた統一前処理を無視。

type="button"を使わなければいいって事なのかな?使うにしてもそれはフォーム送信を必要とするイベントではない、と?

ひとまず、type="submit"に統一できるかどうかを検討しようかな。ただ、そうするとボタンの登場位置によってreturnキーを押したときのイベントがフォーム的に意味不明になりそうで怖い。onkeydownだかなんだかでreturnキーが押されたときの処理を考えろってこと?CSSでの並び制御も限界があるよね?

いっそ、type="button"で統一して、onsubmitを使わなければいいとか暴言吐いてみたくなる。自前で送信処理のメソッド(ラッパー)作って、前処理は外から登録(こういうのがフック?)するようにしたり?

あれですね、いろんなアプリを注意深く触ってみる事が重要ですね。この辺の実例がさっぱり思いつかない。。。


で、(同期処理での)フォーム送信後の安全策として画面のフリーズってやり過ぎかな?LightBoxみたいな感じで、画面に幕を覆って処理が完了する(レスポンスが返って来てページ遷移される)までは何も操作させない。『処理中』ってのがはっきりしていいかな、と。


思いつかないとか書いておきながら、MTでポストしたら。。。そうね、『処理中画面』に切り替わるんだよね。
GMailでは遷移中にウィンドウ(タブ)切り替えてると遷移後に元のウィンドウ(タブ)に切り替わるっぽいし。。。
観察力を養いましょう。。。

"upgrade -f"したからか?"upgrade installed"でも?

気がついたら"conf/extra/httpd-vhosts.conf"にこれまで書いたVirtualHostの設定が無くなってた。

まあ、いいんだけど。設定周りは常にSVN辺りに突っ込んどいた方がいいね。


このごろPHP周りとかでごちゃごちゃやってたので、わけわからんくなってる。。。

会社のTracが逝った日

気がついたら真っ白画面。

mod_pythonで動かしていたTracが動かないとの苦情あり。で、なんだか動くTracもあるし動かないTracもあるしでよく分からない状況。Apacheのerror_logには"Segmentation fault"。

Googleをさまよってみてもそれといった情報も無く、仕方が無いので、断片的に拾えた『mod_pythonにバグがある』らしき情報を信じてmod_pythonをバージョンアップ。なんとか動くようになった。

で、もう1つTrac+SVNリポジトリを立てる事になったのでinitenv。SQLiteがどうとかで失敗。またGoogleをさまよってみるもののどうもそれらしき情報はない。

ぐだぐだとサーバを調べてみるうちに、どうやらSQLiteのバージョン周りとかPython用ライブラリ当りが臭い。ので、入ってるバージョンを調べて、(いつの間にやら)SQLite3になっているようだと判明。SQLite3でそろえてみたら無事initenvが通り、新しいTracにアクセス出来た。

そしたらこれまでのTracが全滅。SQLiteのバージョン変えたけど、DBを変換してない、と。

~$ sqlite OLD.db .dump | sqlite3 NEW.db

SQLite2でダンプして、SQLite3にインポート。一通り変換したら無事復活。というか、もう使ってなかったので細かくは調べてなす。

そんなこんなで、作業に必要以上に時間をかけてしまった1日でした。

"php -a"が使えた

ヘルプにあるように、"php -a"は"Run as interactive shell"という事で、インタラクティブシェルが起動するコマンドオプション。

どういう訳か、自分が使ってる環境では"php -a"で上手い事シェルが起動してくれず、『謎のオプション』として存在し続けていた。それが突然使えるようになった。

configureの引数を追加した効果なのかな?なんだろ、readlineとか関係あるのかな?

まあ、基本的にEmacs上でリージョンから評価するから使わないといえば使わないんだけど、使えれば使えたで嬉しい気がする。

PHPのconfigureじゃなくて、他の依存ライブラリとかなのかも?

MacPortsでconfigure設定

PHPをMacPorts経由で入れると、当然無効になってるオプションがある。

正しい方法か分からないけど、editコマンドで一応解決。

~% sudo port edit php5

適当にconfigure.argsの所に追加。

"/opt/local/var/db/dports"あたりで管理されてるローカルに落ちてるパッケージ(?)のファイルを編集してるようなので、一度落としたやつじゃないと駄目なのかな?だとすると、upgradeしたらもう駄目ってことかも。

最初、開発用に色々な関数を有効にしたくて、ソースから入れようとしたけど、どうもライブラリとかがどこにあるのか分からない。MacPortsで入れたMySQLのヘッダファイルってどこに入るんだ?

まあ、あまり宜しくない方法だろうけどひとまず解決。pcntlとかreadlineとかxslとかdebugとか色々有効にする事が出来た。

何やるかは決めてないんだけどね。。。

Haskell本をようやく読み始めたけど、自分が関数型っぽいのをやるならこっちじゃない気がする。

開発作業の心臓になってるEmacs。オレポータビリティは早々あきらめなので、ローカル環境での作業効率を素敵にするためにも、自分でelisp書けた方がいいんじゃないかな、と。

ものすごい嘘くさくて適当な短いやつは、どこぞからパクって都合いいようにいじって書ける。けど、これはelispじゃないと思う。

まずはAmazonで物色かな。。。

GeSHiで遊ぶ

DokuWiki時代にお世話になったソースコードをハイライトしてくれるPHPライブラリのGeSHiで遊んでみる。
GeSHi - Generic Syntax Highlighter

"php -s"をGeSHiを使ったスクリプトに置き換えてみたり、Smarty修飾子プラグイン書いてみたり、MTプラグイン作りを狙ってみたりと、うだうだやりつつたどり着いたのがCLI。

~% geshi -l php -f input.php -o output.php
~% echo 'echo "hoge\n";' | geshi -l php

イメージは↑な感じね。

で、ちょこちょこ書いて(一応)動くものは書けた。書けたけど、まあ暇つぶし以外の何者でもない。ので、いい加減。意味無し。

書いた後で、同梱されてんじゃね?とちょっと見てみれば、"contrib/aliased.php"とかいうブラウザ経由のViewerらしきものを発見。そもそも、GeSHiのサイトにあるDemoで事足りるような気もする。

コマンドとして運用するにはライブラリの置き場所に困ったり。言語ファイルもgeshi/にあるものとして書いちゃったし。まあ、いいんです。自分用だし。

そんなわけで、(一応)続きにコード晒し。普通に*nixなコマンドがあればそっち使いたい。。。

Firefoxのタブ移動

デュアルな環境なので、ブラウザ窓を両画面にしてたら発見。

左(モニタの)窓のタブを右(モニタの)窓に持っていったら、右窓で表示された。おもしろ!

…、きっと常識だよね?


つい嬉しくなって会社からポスト。

まんまパクリで、"~/c/"を*nixっぽいディレクトリ構成にして、なんでもかんでもバージョン管理。

dotfiles周りも"~/c/"の下においておいて、それぞれの環境でシンボリックリンクを貼る。OSXとCentOSでは簡単にリンクがはれたんだけど、Windowsではよく分からない事になった。

とりあえずショートカットだとやってみれば、「".emacs.d.lnk"なんて知らねーよ」と怒られる。そういやそうだと、WebをあさってWindowsのシンボリックリンクの方法を調べてみる。

XPじゃ出来ないのね。何かしらのツールを入れないとさ。

リンク作成シェル拡張 for Windows 2000/2003/XP
とりあえず、これで解決。本当は.batファイルに書けるやつがよかったんだけど、lnで出来るやつは使い方がよく分からなかった。Cygwinのとバッティングしてたのかな?出来たリンクを開いてもアクセス出来ませんになる。

> del "\\?\c:\path\to\file"

↑繰り返して削除を何回もやったけど、とりあえずGUIでもいいやという事で先述のツールでよし。

"C-z fg"おもしろ

| コメント(2)

今頃夏バテでダウン。とりあえず"C-z fg"で急場しのぎ。

deconの資料の中で、ジョブ制御とかいうのがあるらしいという事を知ったので試す。

きっと、サスペンドからの復帰という事なんだと思う。なので、シェルを落とすまでは復帰出来るよという事だと思う。

~% vi hoge
(viで編集して保存せずに"Esc C-z")
~% vi bar
(viで編集して保存せずに"Esc C-z")
~% fg
("vi bar"の状態が復帰。:wqで保存して終了。)
~% fg
("vi hoge"の状態が復帰。:wqで保存して終了。)

1回のfgで何個か前をたどれるのかと思ったんだけど、順にしか復帰出来ないのかな。やりかた分からず。

fgは"shell builtin commands"という事で、シェルスクリプトで使ういろんな命令の一部と同じって事なのかな?この辺はさっぱり。

何にしても、明日は自分も復帰しないとね。

ここのブログでごくまれにPHPのコードを貼ったりしてるけど、preでそのまま。

;;; ;;; リージョン内のスクリプトをHTML形式でハイライト表示
(defun php-source-highlight-region nil "PHP source highlight"
  (interactive)
  (shell-command-on-region
    (region-beginning) (region-end)
    "php -s"))
(global-set-key "\C-c\C-s" 'php-source-highlight-region)

"php -s"にパイプで渡せばHTMLで色を付けた結果が出力される。というわけで、適当にelisp。

最初、"php -r"みたくパイプでは渡せないと思ってPHPスクリプトをかませてたけど、どうやら渡せるらしい。

エスケープもしてくれるみたいだし、いつかPHPコードを貼付ける事があれば使ってみるかも。

<?php
if ($elisp) {
  echo 
"Emacs!\n";
}
?>

リージョン範囲を↑みたく出力。

変なバッファに書き出されるのは面倒かも。リージョン置き換えの方がいいかな。まあ汎用だって事で?

MT3.32にup

という訳でテスト投稿。

ほんとにこれで構築早くなるかな?DB側の問題な気がするけど。。。


別に変わらない気がする。。。やっぱサーバ側の問題?

MacPortsを使いこなそうと思い、manを叩いてみても見当たらない。

manがOSXのものだからかと思いMacPortsのmanを入れてみても変わらず。最近UTF-8にしたからかと思って色々試すも効果無し。

で、zshの設定を見直していたら、MANPATHに/opt/local系が含まれてない。なので、/opt/local/manを追加。無事解決。

そういえば、DarwinPortsってMacPortsに変わってたんだね。

UTF-8環境を試す

多分すぐ挫折。
参考:いやなブログ: UTF-8 への移行計画

自宅のOSX(PPC)だと、'export LANG=ja_JP.UTF-8'じゃないと駄目っぽい(かも)。

~% locale -a | grep ja_JP
ja_JP
ja_JP.eucJP
ja_JP.SJIS
ja_JP.UTF-8

ひとまず、zsh+screenなTerminal.appをUnicodeにしてlvでSJIS/EUC-JP/UTF-8がちゃんと表示される事は確認。"svn help"も大丈夫(これでcvsdudeのsvnログも化けないかな?; これは別問題?)。

問題はEmacsのelisp周りがどうなるか、か。一応、EmacsもUTF-8をデフォルトにしてみた。ので、mapaeは停止中だからいいとしても、hiki-modeがどうなるか不明。まあ、大丈夫でしょう。

これまで書いたものの9割はEUC-JPなのでどうなるか不安だけど、あまり問題はない気もする。PHPの内部エンコーディングとかでどうなるか、かな。

そういえば、.emacs.elってUTF-8でも平気なんだね。Emacs覚えたての頃にJISじゃないと駄目ってのを見た記憶があるんだけど、Carbon Emacsだからかな?

ようやく違和感に気づく

Subversionで開発ブランチをきって作業してる場合。

しばらくブランチで作業してると、trunkで色々と変化がある。で、「はぁ、マージ憂鬱っ」とかぼやいてたりしたんだけど、これ違うよね?

Subversionのドキュメントに、「毎週くらいでtrunkでの変化をマージしとけ」って書いてある。

運用のポリシーとかもあるんだろうけど、まあ妥当だよね。なんで今更気づくんだろう。

さて、どうしたものか。

"--TEST--"だとか"--SKIPIF--"だとか"--FILE--"だとか"--EXPECT--"だとか。PHPUnitしか知らないのでよく分からず。

PHPUnitはPEARパッケージなので、PEARパッケージを配布する際にPHPUnitでやるのは微妙だって事かな?package.xmlに書いておけば依存解決は出来るけど、目的外のパッケージを強制インストールさせるのは好ましくない?

PEARドキュメントをちょっと見ると、".phptかPHPUnit"って事らしいので、PHPUnitで書いて問題は無いけど、配布側の心遣いとかその辺かな。(テスト実行時の入出力をあわせられれば何使っても問題は無いんだろうけどさ)

まあ、どっちを使うかってのは場合によって(PHP4だとかね)だろうからいいとして、問題はphptってどう書けばいいのかってこと。googleを見た程度じゃ分からない。なんとなくCだかC++だかの空気を感じる。一般的なやつなの?

もしかしたらいずれ『いざっ』て時がくるかもしれない。けど、こないかもしれない。.phpt覚えた方がいいのかな?

grepでごりおしなのはいかがなものか、という訳でEtags。

ひとまず適当に拾ってきたタグを自動生成してくれるelispをいじくってphpオンリーに。M-.した時にタグが無ければ自動生成。

;;; ;;; タグの自動生成
(defadvice find-tag (before c-tag-file activate)
  "Automatically create tags file."
  (let ((tag-file (concat default-directory "TAGS")))
    (unless (file-exists-p tag-file)
      (shell-command "find . -name \\*.php | xargs etags -o TAGS 2>/dev/null"))
    (visit-tags-table tag-file)))

運用側であらかじめタグを(定期的に)自動生成しとけばいいのかも?9/8でこの辺の話も出るかな(資料公開に期待)?

コードの検索もackを入れてみたのでしばらくはお試し。

『サーバで作業』が気になってきたので見てみた。
これだけは知っておけ! vim 勉強会

皆さん元気で仲良しですね。

『○○の使い方』みたいな勉強会はノートPCあるといいね。それぞれがその場で実践出来ると盛り上がる、か。

開発作業を(サーバ上で)vim使ってやるかは分からないけど、httpd.confあたりをいじるのは楽になりそう。

とりあえず、emacsのphysical-line-modeを使ってみよう。vimのgjね。

SBSとMTでの『タグ』にずれがあるかも。

自分が使ったタグはどこかで管理しとかないと面倒かも。WebAPI経由でタグのサジェストとか出来るんだっけ?

集約したタグ一覧から候補をサジェスト。MTとかHikiとかはてなブックマークとかに仕込めたらいいな。


ついでに、『このタグは○日以上使われていません』とかWindowsっぽく教えてくれても嬉しいかも。で、その使われてないタグでよく使われる類似タグのリストを出してくれて、しかも置換してくれるとさらに嬉しい。
まあ、置換に関しては別サービス(プラットフォーム)だしちょいと無理があるかもだけど。

:encoding u e

Zend_Feedを試す中で、EUC-JPなコンソール上でUTF-8のフィードをダンプすると当然化ける。

で、そういえば"GNU screen"の":encoding"使えば簡単にエンコーディング切り替えられるなと。":encoding UTF-8"とか":encoding utf-8"とか":encoding utf8"とか":encoding u"とか、化けまくり。

よく分からないけど、PHPのmb_convert_stringみたいなものらしい。ようは、to-fromでパラメータ与えた方が確実に変換出来る、と。なので、EUC-JPな端末で":encoding u e"したらUTF-8な端末になるっぽい。というか、家のOSXではそうなった。

会社のWin(coLinux/CentOS)でも同じだったので、これで解決かな。


Zend_Feedはパッチを当てたりしない限りは、RSS1.0(RDF)を扱えないらしい。ドキュメントもRSS=RSS2.0だしね。ボキャブラリが豊富すぎるのも問題なのかな。RSS1.0がメジャーなのって日本だけなんだっけ?

プロフィール

このアーカイブについて

このページには、2006年9月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2006年8月です。

次のアーカイブは2006年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。