Bulknews::Subtech RSSフィード

2008/07/29 (火)

モバイル向けに Encode::find_encoding をオーバーライド 18:29  モバイル向けに Encode::find_encoding をオーバーライド - Bulknews::Subtech を含むブックマーク はてなブックマーク -  モバイル向けに Encode::find_encoding をオーバーライド - Bulknews::Subtech

Encode-JP-Mobile のメンテは tomi-ru さんにおまかせで久しいわけだけど、メールとか Web アプリのフレームワークとかで実際に絵文字処理するときに問題になるのが、Content-Type ヘッダで送出(または受信)する charset 名と Encode-JP-Mobile で利用する encoding 名のミスマッチだ。

たとえば、docomo で絵文字をHTMLにutf-8で埋め込む場合、Content-Type: text/html; chaeset=utf-8 としておきつつ、コード的には Encode::encode("x-utf8-docomo", $html) として print することになる。

この辺の処理を Catalyst の Plugin でやったり、Email::MIME なんかで取り出し、またはエンコードするときの処理をマッピングする必要がある。

でも、それって Encode::find_encodings() をのっとっちゃえばできるんじゃね?とおもってちょろっとコード書いてみた。

use Encode;
use Encode::JP::Mobile;

our $carrier; # current target carrier

my $canon = sub {
    # canonicalize various sjis/utf8 names
    my $enc = shift;
    return "sjis" if $enc =~ /\bshift.*jis$/i or $enc =~ /\bsjis$/i;
    return "utf8" if $enc =~ /\butf-?8$/i;
    return;
};

*Encode::find_encoding = sub($;$) {
    my $enc = shift;
    my $canon_enc;
    if ($carrier and $canon_enc = $canon->($enc)) {
        $enc = "x-$canon_enc-$carrier";
    }
    Encode->getEncoding($enc, @_);
};

{
    local $carrier = "docomo"; # set current
    my $char = decode("sjis", my $b = "\xf9\x5d", Encode::FB_CROAK);
    use Data::Dumper;
    warn Dumper $char; # \x{eb69}
}

{
    my $char = decode("sjis", my $b = "\xf9\x5d", Encode::FB_CROAK);
    # shiftjis "\xF9" does not map to Unicode
}   

ちょっと evil な気がするけど、期待通りに動いた。encoding 名から Encode::JP::Mobile のマッピングをもうちょっとちゃんとして、スコープの制御もきちんとできるようにモジュール化すれば、Catalyst::Plugin::Unicode みたいなモジュールとか、Email::MIME の text/plain を decode するみたいなものを、Encode::JP::Mobile 用に書き換えたりしなくてすむ、ようになって幸せかも?

2008/07/08 (火)

Podtoid-san が面白い 14:14  Podtoid-san が面白い - Bulknews::Subtech を含むブックマーク はてなブックマーク -  Podtoid-san が面白い - Bulknews::Subtech

no title

Podtoid というビデオゲーム Podcast (英語)は同僚の tiff が出てたりして聞いていたんだけど、それのスピンオフなのか、オタク・アニメ専門の Podcast があるのは知らなかった、というわけで iTunes に登録して聞いてみた。週1で1時間前後なので全部継続して聞くのはつらそうだけど、ネタがオタクなので生ぬるく面白い。

ep64 を聞いてみた。オープニングテーマが唐突にニコニコ動画流星群。最初はファンサブの話で、日本のブログ界隈でも一部話題になってたあたり。適当に聞いててうけた内容をメモってみると、

「やあ、おれはもうアニメをダウンロードするのやめるわ。Netflixにする」

「ドルアーガの塔も?」

「あぁ、リーガルにダウンロードできるんだったら、まあ見てみるかも。でも BitTorrent でダウンロードはやめて、Netflix で借りることにしてみるよ。それがどんだけ面倒でどれだけ金がかかるのかとか試してみるわけ。そもそもアニメが毎シーズンいっぱいでてくるけど99%はゴミみたいな番組だしな」

「NetFlix にしたところで問題は解決しないわよ。配給元にはほとんどお金はいらないんだから。唯一できることはライセンスされたDVDを買うことでしょ。でもそもそもダウンロードしてファンサブで見るのは新作とかライセンスされない番組を見るためで、DVDを買うのとは別だと私は思うけどね」

「まあ、アメリカでライセンスされない番組はあるよな、ぽにぽにだっしゅとかね!あれは絶対ねえわ」

「それか、DVDを日本から買ってインポートすればいいんじゃね」

「まあインポート自体は違法じゃないよな。でもリージョンコードを破るのは法律的にはまずいともいえる」

「まあそういう法律もあるが別の法律もあってそれは問題ないとも・・」

「まぁそうなんだ。Blu-ray だとアメリカと日本は同じリージョンだからね。時間が解決するともいうよ」

「DVDを輸入して字幕データを別売りでダウンロードとかできるなら私は払ってもいいわよ」

(中略)

「あ、さっき99%がゴミっていったけど、カイバはいいね!」

「監督のほかの番組もみたけど、ああいう近未来SFはいいわよね」

(中略)

「ちょっと話が長くなってきたんでここで1曲。何かリクエストある?」

「ぽてまよ!」

こんな感じです。なんか後半はらきすたの話してる。

「僕はつかさが一番好きなんだけど」

「それってマーケティング的には普通じゃないよね?普通はこなたかかがみじゃない?みゆきは超萌えだからみんな好きだし(Miyuki is so incredibly Moe)」

「そんなことない、つかさのほうが萌えだよ」

「わたし、基本的に萌えキャラあんまり好きじゃないのよ。」

「うそつけ」

「それに、ツンデレキャラもイマイチね。ゼロの使い魔とかさ。つかさが別に嫌いなわけじゃないけどね」

そのあと宮崎アニメの話とかになって、エンディングテーマはJAM Project「明日への咆哮」なにこの番組w 英語の勉強になりますねー(ならんよ

ゆの in Perl 08:32  ゆの in Perl - Bulknews::Subtech を含むブックマーク はてなブックマーク -  ゆの in Perl - Bulknews::Subtech

http://subtech.g.hatena.ne.jp/cho45/20080708/1215450151

#!/usr/bin/perl                                                                                                         
use strict;
BEGIN {
    sub X () { bless \(my $s = "ひだまり"), "X" }
    sub _ () { 1 }
}

package X;
my $i;
use overload
    "/" => sub { ${$_[0]} .= $i++ ? "365" : "スケッチ"; $_[0] },
    "<" => sub { print ${$_[0]}, " ", $_[1], "\n" };

package main;

X / _ / X < "来週も見てくださいね!";

2008/04/21 (月)

YAPC の投票 08:10  YAPC の投票 - Bulknews::Subtech を含むブックマーク はてなブックマーク -  YAPC の投票 - Bulknews::Subtech

Twitter でだけ告知してたんだけど取りこぼしが起こってるみたいなので1日延長&ここでも告知。YAPC::Asia の二次選考(15セッション)の投票は本日24時までです。 http://conferences.yapcasia.org/ya2008/news/113

2008/03/24 (月)

ニコ動.app 18:23  ニコ動.app - Bulknews::Subtech を含むブックマーク はてなブックマーク -  ニコ動.app - Bulknews::Subtech

最近はめっきり週末にしかニコニコみてないんだけど、

問題: ニコニコとか、メディアセンターPC (Mac mini) で操作するのがめんどい

解決策: ニコニコに限らずHuluとか動画サイト全般で、FlashプレイヤーをJavaScriptで操作できれば、GreaseKit と UserScripts でキーバインドあてて http://www.fluidapp.com/ で Site Specific Browser つくって、Remote Buddy でリモコン操作ができる、ようになるとおもうのだ。

いまはRamblePad でみてるのでマウス移動がめんどくさい。バックスペースとスクロールホイールをアナログスティックに当てたらページ移動は少し楽になったけど。

調べてみたらそのものずばり(ニコニコのプレイヤーを GM で操作)の userscript があった。

http://blog.fulltext-search.biz/articles/2008/01/31/nico-nico-player-wrapper

2008/03/06 (木)

Catalyst と MVC 09:02  Catalyst と MVC - Bulknews::Subtech を含むブックマーク はてなブックマーク -  Catalyst と MVC - Bulknews::Subtech

no title

ちょっと盛り上がってるので事例を紹介。

Six Apart では Vox などで Catalyst つかってますが、アプリケーションの下の Model (実際にいうと Vox::App::M 以下) は空っぽです。意味ないから。

Catalyst の Model にもともと自分が期待していたのは Rails でいう ActiveResource (だっけ?名前わすれた)みたいなもので、LDAP にエントリをつくるのも データベースにレコードを追加するのも、

$c->model("DBIC::Foo")->create(context => $c, request => $c->request);
$c->model("LDAP::Foo")->create(context => $c, request => $c->request);

みたいに抽象化されたAPIで出来る、ってのを期待していたんだけど、ちまたにあふれる Catalyst の Model ってそんな賢いものではなくて、

$obj = SomeClass->new(%opt);

のかわりに

$obj = $c->model('SomeClass')

とかけて %opt は設定ファイルに書く、っていう、ただそれだけなんですね。これじゃ全然つかいものにならないし、Model::Adaptor のラッパーで使いたければそれでもいいかもしれないけど、単にオブジェクト生成するところやメソッド通すときにラッパー一段増えるだけで別になにもうれしくない。

で、maki さんが書いてることなんだけどこれはうちもやってます。ただ Model にするんじゃなくて C というクラス (Vox::C::Blog とか) に書いてる。Catalyst の MVC (Vox::App::C) とは違う階層においてあるのでちょっと紛らわしいけど、複数の M (ほとんどが Data::ObjectDriver ベースの Model エンティティクラス) を操作するプロシージャコールみたいなメソッドをまとめて定義したクラスを書いて、それを Web やらバッチ、TheSchwartz のイベントワーカーとかから呼び出す(逆に言うと web の Controller は URL パラメータをそのクラスにマッピングするだけ)、って感じ。

Model に直接メソッドを書いて Controller から呼び出すのも別に悪くはないとおもうけどイベント処理とかいろんなところからメソッド呼んだりするので共通化できるメリットがあるし、 Web コンテキスト関係なくテストできるのでユニットテストも書きやすくなる。これを Model と呼ぶかは微妙ですが、dmaki さんのエントリではこういう抽象化したデータエントリクラスを Model と呼んでいるのであって、おそらくやっていることは同じかと。

これを M と呼ぶか C と呼ぶかは議論がわかれそうですが、Model をコントロールするクラス群であって実際にオブジェクトが生成されることはないので C という風に命名しています。