最新スプライトの色

従来:
・フォーカス時のみ最新スプライトを赤色に塗り換え
・常に赤いと見た目が鬱陶しいため
問題:
・全体マップ上の塗り換えはIEにとっては重いタスク
今後:
・最新スプライトは常にオレンジ

svnX

SCPluginはFinderの動作が遅くなるので,お勧めできません.
(アイコン表示時,コンテキストメニュー表示時)
マウスでやりたい気持ちのときは,svnXを使うことに.
ようやくすっきりした.

ClearSilver + Catalyst::Plugin::I18N

次のようなファイルをgettextで処理できるようにする.

# root/template/list.cs
<h1><?cs var:loc.Admin_Title ?></h1>

loc は決め打ち.localize の意で.
上の場合,msgid は Admin_Title
.csファイルから.potを作成するユーティリティ

$ myxgettext.pl
usage: mygettext.pl INPUTDIR OUTPUTFILE
e.g.) mygettext.pl root/template message.pot

myxgettext.pl

#!/usr/bin/perl
if(scalar(@ARGV) == 0){
print "usage: mygettext.pl INPUTDIR OUTPUTFILE\n";
print " e.g.) mygettext.pl root/template message.pot\n";
exit(0);
}
my $inputdir = $ARGV[0];
my $outputfile = $ARGV[1];
opendir(DIR, $inputdir) or die "Cannot open $inputdir";
my @list = readdir( DIR );
closedir( DIR );
open(XGETTEXT, "| xgettext - -o $outputfile") or die "Cannot open xgettext";
foreach my $item (@list){
if($item !~ /.cs$/){
next;
}
my $filepath = $inputdir . "/" . $item;
open(CSFILE, $filepath) or die "Cannot open $filepath";
my $cstext = "";
while(){
$cstext .= $_;
}
$cstext =~ s//gettext("$1")/g;
print XGETTEXT $cstext;
}
close(XGETTEXT);

各言語ごとの.moファイル作成

$ cp message.pot lib/FooBar/I18N/ja.po
$ emacs lib/FooBar/I18N/ja.po
msgid "Admin_Title"
msgstr "管理ページ"
$ msgfmt lib/FooBar/I18N/ja.po -o lib/FooBar/I18N/ja.mo

Catalyst::Plugin::I18Nを用いて,コントローラのアクションから呼び出し.
上で決め打ちした
$c->stash->{loc}
へ代入.

$c->languages( ['ja'] );
{
no strict 'refs';
$c->stash->{loc} = \%{ "FooBar::I18N::" . $c->language . "::Lexicon" };
}
$c->stash->{template} = "template/list.cs";
$c->view('CS')->process($c);

ClearSilver適用後のroot/template/list.cs

<h1>管理ページ</h1>

Catalyst::Plugin::I18Nの使い方については,こちらも参考にさせて頂きました.
http://d.hatena.ne.jp/Bayside/20070515/p1

POモード

EmacsのPOモードで,utf-8で読み書き.

# .emacs
;; po-mode
(setq file-coding-system-alist
(append ' (
("\\.po$" utf-8 . utf-8))
file-coding-system-alist))
(setq po-auto-replace-revision-date t)
(add-hook 'po-mode-hook 'po-replace-revision-date t t)

Catalyst::View::ClearSilverのDBIx::Class対応

Catalyst::View::ClearSilver + DBIx::Class を使いやすくする.
▼前提
HDFはハッシュテーブルであるので,Catalyst::View::ClearSilverは配列が渡された場合,ハッシュテーブルへ自動変換する.

# Catalyst/View/ClearSilver.pm
# $c->stashに渡された値は,_hdf_setValue を再帰的に呼び出して,型チェック,ハッシュテーブルへ変換.
# ARRAY型の場合,0から始まる連番をキーとしたエントリとして表現
sub _hdf_setValue {
my ($hdf, $key, $val) = @_;
if (ref $val eq 'ARRAY') {
my $index = 0;
for my $v (@$val) {
_hdf_setValue($hdf, "$key.$index", $v);
$index++;
}
} elsif (ref $val eq 'HASH') {
while (my ($k, $v) = each %$val) {
_hdf_setValue($hdf, "$key.$k", $v);
}
} elsif (ref $val eq 'SCALAR') {
_hdf_setValue($hdf, $key, $$val);
} elsif (ref $val eq '') {
$hdf->setValue($key, $val);
}
}

▼困ったこと
次の一文はCatalystでよくやる手である.

$c->stash->{foos} = [$c->model( 'FooBarDB::Foo')->all];

$c->stash->{foos} は ResultSet の全要素を含む配列.しかし,この配列の要素はref演算子でパッケージ名 FooBar::Model::FooBarDB::Foo を返すため,Catalyst::View::ClearSilverでは自動変換できない.
▼解決
DBIx::Class::Rowを継承してるので,$val->isa(“DBIx::Class::Row”)の判定を足せばよいです.

# Catalyst/View/MyClearSilver.pm
sub _hdf_setValue {
my ($hdf, $key, $val) = @_;
if (ref $val eq 'ARRAY') {
my $index = 0;
for my $v (@$val) {
_hdf_setValue($hdf, "$key.$index", $v);
$index++;
}
} elsif (ref $val eq 'HASH') {
while (my ($k, $v) = each %$val) {
_hdf_setValue($hdf, "$key.$k", $v);
}
} elsif (ref $val eq 'SCALAR') {
_hdf_setValue($hdf, $key, $$val);
} elsif (ref $val eq '') {
$hdf->setValue($key, $val);
} elsif ($val->isa("DBIx::Class::Row")){
my %columns = $val->get_columns();
while (my ($k, $v) = each %columns) {
_hdf_setValue($hdf, "$key.$k", $v);
}
}

これでTemplate::Toolkit的に使えるかしら.

CREATE TABLE foo (
foo_id VARCHAR(20) BINARY NOT NULL,
foo_nickname VARCHAR(20) BINARY NOT NULL,
PRIMARY KEY(foo_id)
);
(中略)
# foo_list.cs
<?cs each:item = foos ?>
<?cs var:item.foo_id ?> -  <?cs var:item.foo_nickname ?> <br>
<?cs /each ?>

つかこれ,他の人はどうしてるのかしら?
CatalystではあまりClearSilver使われてないってのが一つの答えでしょうけど…….
▼解決その2
ブラザーからDBIx::Class::ResultClass::HashRefInflatorを使ってみたら?とのコメント.
http://search.cpan.org/~ash/DBIx-Class/lib/DBIx/Class/Manual/Cookbook.pod#Skip_object_creation_for_faster_results
Catalyst/View/ClearSilver.pm には手を加えずに,次のコードでOKです.

use DBIx::Class::ResultClass::HashRefInflator;
my $rs = $c->model( 'FooBarDB::Foo');
$rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
$c->stash->{foos} = [$rs->all];

後からget_columns()するよりも.こちらのほうが速かったです.
素敵だ.

Catalyst + ClearSilver

作業ログ.
ClearSilverのPerl XSをインストール
http://www.clearsilver.net/
$ wget http://www.clearsilver.net/downloads/clearsilver-0.10.5.tar.gz
clearsilver-0.10.5 $ ./configure
clearsilver-0.10.5 $ cd perl
clearsilver-0.10.5 $ perl Makefile.PL
clearsilver-0.10.5 $ sudo make install
Catalyst::View::ClearSilverをインストール
$ sudo perl -MCPAN -e ‘install Catalyst::View::ClearSilver’
View作成
$ ./script/xxxxxx_create.pl view CS ClearSilver

Mac版Safari3.1のコンテキストメニュー

oncontextmenuで独自UIを開く場合,一度UIをクリックしてフォーカスを与えないと,onmousemoveが取得できない.開かなかったブラウザのコンテキストメニューにフォーカスを取られてる?
Safari2, Windows版Safari3.1では問題なし.Safari3.0のときも問題なかったよね?
document.oncontextmenu = function{
//
// 独自UI表示用コード
//
return false; // ブラウザのコンテキストメニューを開かない
}