Archive

Archive for the ‘tips’ Category

ming で生成した swf で TextField の文字列が表示されない

ming で生成した Flash Lite 1.1 の swf である条件下で TextField に addString() した文字列が、DoCoMo の端末で表示できない場合があります。

画面サイズが、240px * 240px の端末に、

$movie->setDimension(240, 240);

とすると、上記の問題が発生します。

これを回避するには、

$movie->setDimension(240 - 1, 240 - 1);

とすると、表示されるようになります。

C::P::Session::State::URI で HTML::Entities に日本語をエスケープさせない方法

Catalyst - Session管理とHTMLエンティティコード(数値文字実体参照) でも言及されているように、Catalyst::Plugin::Session::State::URI を使っていると、

<img alt="日本語" />

などが、エスケープされてしまい、表示がおかしくなったりします。

(続きを読む…)

日時や時間を文字列で取得

日時を文字列で取得する場合、

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$date = sprintf("%04d/%02d/%02d", $year+1900, $mon+1, $mday);

こんな書き方が多いですが、もっと短くこう書けます。

use POSIX;
my $date = strftime("%Y/%m/%d", localtime);

DateTime モジュールで同じことができますが、POSIX は標準モジュールなのでインストールしなくても使えるというのが強みです。Windows の Strawberry Perl でも使えました。

と、これだけなら大した事無い違いなのですが、strftime はもっと便利です。
(続きを読む…)

lighttpd でピリオドを含まない(拡張子無し)URL と特定拡張子の指定方法

ディレクトリや拡張子なしの URL と PHP だけバックエンドに送りたかったので正規表現でカリカリと。

最近は色んなソフトに PCRE が採用されていて便利ですね。

$HTTP["url"] =~ "/([^/.]*(\?|$))|\.php(\?|$)" {
    proxy.balance = "hash"
    proxy.server  = ( "" => ( ( "host" => "localhost", "port" => 8080) ) )
}

ちなみに、静的ファイルだけ ligttpd に処理させたいときは以下です。

$HTTP["url"] =~ “/[^/.]*(\?|$)” {

この書き方は、baz.png?foo=bar などと、クエリ付きのリクエストにも対応しています。

IE の JavaScript 高速化(参照回数が多い場合)

amachang さんのところで紹介されていました。

以下の一行をすべての JavaScript の前に読み込む

/*@cc_on _d=document;eval('var document=_d')@*/

この一行を読み込むことによって IE での document へのアクセスが 5 倍速くなります。

だそうです。
(続きを読む…)

UTF-8 文字列の URI エスケープ

RFC 2396 で、unreserved として定められた文字列を URI エスケープする場合には、


$str =~ s/([^a-zA-Z0-9_.!~*'()-])/’%’ . unpack(’H2′, $1)/eg;

とすれば良いですが、エスケープする文字列が UTF-8 の場合、注意しないといけないことがあります。それは、変換前に UTF-8 フラグを落とすことです。


utf8::encode($str) if utf8::is_utf8($str);

を変換前に追加しましょう。

画像ファイルやローカルからのアクセスをログに記録しない

Apache で、アクセスログに画像ファイルや、CSS などを含めたくないときには、


SetEnvIf Request_URI "\.jpe?g$" image no_log

などと、書いて、


CustomLog /path/to/access.log combined env=!no_log

と、すれば良いですが、lighttpd には lighttpd-1.4.15/doc/accesslog.txt を見ても、選択的なアクセスログ設定には触れられていません。

logrotate の処理中に wrapper スクリプトを使うのも何ですし、どうしたもんかと思いましたが、ふと、lighhttpd には PCRE を利用してコンフィグを正規表現でガリガリ書けることを思い出しました。

と、いうことで実際に書いてみたら、期待通りの動作をしました。


$HTTP["remoteip"] !~ “^(127\.|192\.168\.)” {
$HTTP["url"] =~ “/[^/.]*(\?|$)” {
accesslog.filename = “/path/to/access.log”
}
}

上記では、拡張子が無いファイルへのリクエストのみログに記録しています。
なお、remoteip と url の入れ子を逆にしたら上手く動作しませんでした。

X-Catalyst レスポンスヘッダーを消したいとき

Catalyst.pm で

if ( $c->debug ) {
    $c->stats(Tree::Simple->new([gettimeofday]));
    $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
}

と、ありますので、環境変数 CATALYST_DEBUG を 0 にしてあげると、出力されなくなります。

nitsuji さんが和訳されてらっしゃる、Catalyst::Manual::Cookbook に CATALYST_DEBUG 環境変数について触れています。

Enable debug status in the environment

ふつうは-Debugフラグをuser Catalystに追加してデバッグ情報を有効にする。けど、環境変数を使ってもできるのでアプリケーションを変更しなくてもデバッグ情報を有効にできる。CATALYST_DEBUGか<MYAPP>_DEBUGをtrueにすればいい。

C::P::FormValidator::Simple と C::P::FillInForm と DBIx::Class::WebForm

物凄い便利です。

FormValidator::Simple だけでも充分便利すぎるのに、FillInForm はテンプレートに条件分岐などかかなくても勝手に value アトリビュートを探して値を入れてくれるし、WebForm もフォームから一発で DB を更新してくれたりします。FormValidator::Simple::Auto が DBIC_UNIQUE に対応してないそうなので(試していません)、そこが対応になればもう言うことないですね。

WebForm の情報が少なく、導入に手間取ったのでメモを残しておきます。

DBIx::Class::Schema::Loader で自動生成した Schema クラスに以下のように追加。

package MyApp::Schema::User;

use base 'DBIx::Class';
use base 'DBIx::Class::WebForm';

以上で、以下のように楽できます。

my $f = $c->form( -VALIDATION- );
my $u = $c->model('Schema::User')->find($id)
$u->update_from_form($f);

DBIx::Class::WebForm

JSONのススメ

JavaScript でプログラミングする際に便利な記法があります。
それは、JSON と言ってよく目にする JavaScript 解説サイトではあまり言及していないのですが、これを知っているといないとでは、コーディングの手間が大分変わってくると思います。

http://www.crockford.com/JSON/

こちらに邦訳があります

JSON(JavaScript Object Notation)は、軽量のデータ交換フォーマットです。人間にとって読み書きが容易で、マシンにとっても簡単にパースや生成を行なえる形式です。JavaScriptプログラミング言語(ECMA-262標準第3版 1999年12月)の一部をベースに作られています。JSONは完全に言語から独立したテキスト形式ですが、C、C++、C#、Java、JavaScript、Perl、Python、その他多くのCファミリーの言語を使用するプログラマにとっては、馴染み深い規約が使われています。これらの性質が、JSONを理想的なデータ交換言語にしています。

要は、今まで

var a = new Array(’foo’, ‘bar’);

と書いていたものが、

var a = [ 'foo', 'bar' ];

と書けたり、

var obj = { name : ‘foor’, age : 30 };

とオブジェクトのプロパティを設定できたりする。もちろん、

var obj = { greeting : function() {
alert(’Hello!’);
};

obg.greeting();

ともできます。