2007年8月アーカイブ

naoyaさんが書いてるTTのこの問題。ちょっと調べてみた。

とりあえず.item() がどこなのかを探してみたら、2.15 あたりで Template::Stash で定義されていたのが2.19だと Template::VMethods にうつっているようですね。

で、ロジックをみてみる。
2.15 だと Template::Stash の $HASH_OPTS->{item} の CODEREF が .item() の実体なのですが、この CODEREF 内ではプライベート変数判定用の正規表現が入ってる $PRIVATE がちゃんと参照できるため、プライベート判定できます。

でも、2.19 だと Template::VMethods の hash_item() が .item() の実体になっていて、しかもその中での $PRIVATE が undef になってる(参照できない)ために hash_item() でのプライベート判定でスルーされちゃうようです。

ちなみに、この $PRIVATE は Template::VMethods の最初の方で

our $PRIVATE = $Template::Stash::PRIVATE;

と定義されてますが、これがなぜ機能していないのかというと、たぶん Template::Stash より Template::VMethods の方が先に読み込まれるというロードの順番が問題だと思います。それ以上は深追いしてません。。。

たぶん 2.15 の挙動が正しいんじゃないかと思います。
2.19で.item()でプライベート変数が取れるのはバグなような気がします…。

まぁ、もともと _ つきの変数はプライベート変数なので表示されるべきではないような気もしますが。どうなんですかね。でも別で取れるAPIがあってもいいような気もする。

#TTのソースを見るのは疲れる…。

前のエントリで、Gearman::Clientはtimeoutできないけど、Gearman::Client::Asyncはtimeoutできる。でもすぐに処理が戻ってこない!って書きました。

で、この処理すぐに戻ってこないという問題をもうちょっと調べたら、すぐではないけど処理が戻ってくることが確認できました。設定した秒数が短かすぎて勘違いしていたみたい><

ということで、結論としてはtimeoutさせたかったらGearman::Clientじゃなく、Gearman::Client::Asyncを使おうということですね。


最近Gearmanをいじってるんですが、Gearman::Clientでtimeoutを設定してやってもtimeoutしてくれない。 なぜだー!とソースを見たら
#TODO: timeout isn't supported by this client API yet.
と一番上に書いてあった…。サポートしてないのかよ。PODに書いてくれ!

で、tokuhiromさんのBackPaperのGearman::Client::Asyncの例を元に、文末のようなコードでやってみた。
そしたらtimeoutは効いてくれるみたい。ちゃんと起動して5秒後にはon_failがコールされた。

お、これでいけるかな?と思ったら、on_failしたあとすぐに処理が戻ってこないで10秒経って(worker.plのsleepの時間だけ待って)から「done」が表示された。
timeoutしたあとに、すぐ処理が戻る(下記のコードで言うと「done」が表示される)ようにしたいんだけどどうしたらいいんだろうか。
client.pl
#!/usr/local/bin/perl

use strict;
use Gearman::Client::Async;
use Danga::Socket;

my $client = Gearman::Client::Async->new( job_servers => [ qw(127.0.0.1) ] );
my $result;
my $task;
Danga::Socket->AddTimer(
    0 => sub {
        $task = Gearman::Task->new("sleepcheck", undef, {
            timeout => 5,
            on_fail => sub { print "failed\n" },
        });
        $client->add_task($task);
    },
);
Danga::Socket->SetPostLoopCallback( sub { !$task->is_finished } );
Danga::Socket->EventLoop;

print "done.\n";
worker.pl
#!/usr/local/bin/perl

use strict;
use Gearman::Worker;
use Carp ();

my $worker = Gearman::Worker->new;
$worker->job_servers(qw(127.0.0.1));
$worker->register_function(
    sleepcheck => sub {
        sleep 10;
        return "done sleep check";
    },
);
$worker->work while 1;

ThinkPad X40 を使い始めて、すでに3年ぐらいなのですが最近すごく高い周波数でピーピピピピーピーってモールス信号みたいな音が聞こえるんです。別にデータをロードするのがコケるとかそういうのはないんですが心配です。。。

これはHDDがやばいってこと?同じ症状の人いないかな。

ちょっと前から気になっていた Wii のゲーム「FOREVER BLUE」を買ってみました。

ゲームの内容は、基本的には南の島でダイビングをしたり魚を観察したりするだけなんですけど、暑い夜にクーラーをがんがんかけながら海の中を散歩するっていうのはなんとも癒しな感じです。

ゲームの中では、自分はダイビングのインストラクタという設定になっているため、単にダイビングするだけでなくお客さんに海のいろいろな場所をガイドしたりもします。その際は、お客さんが見たい魚などを見せてあげたりというミッションをクリアしていく感じになります。

グラフィック的には思ってたより綺麗ですが、ぐるぐるダイビングしているとちょっと酔いそうな気もします。
ダイビング中は、このゲームのCMでも使われている癒し系の音楽や自分の好きな音楽をSDカード経由で取り込んで流すこともできるようです。

まだちょっとしかやってないので何とも言えないですが、広い海でなかなか会えない魚とか深海魚とかいるっぽいのをネットで見たりしているので、いろんなところを散策してみたいと思います。

日々癒しを求めてたり、暇をもてあましている人にはいいかもしれないゲームになっていると思います。たぶん。

フォーエバーブルー
フォーエバーブルー
posted with amazlet on 07.08.27
任天堂 (2007/08/02)
売り上げランキング: 56
おすすめ度の平均: 4.0
3 初めてグラフィックを気にしました
4 奈落が真っ暗でちょとコワイ!!
4 ここまで楽しいゲームは初めて!

今日のお昼、にぽたんから

「ちゃうだーさん、SixapartとCybozelabとのメシにいくよー」

と、いきなり(※1)言われ、「なに!そんな予定入ってないぞ!」と思ったけど、よい機会だったのでmalahamashunとともに参加させてもらいました。
(※1 実際は、いきなりじゃなく昨日のうちにメッセで話したらしいのだが、僕のメッセが変なことになってて連絡が取れてなかっただけでした。にぽたんすんません。)

ということで、メシを食いに赤坂見付方面の某とんかつ屋へ。


とんかつ屋へ着くと、すでに10人ぐらいの方達が席について話をされてました。

その中には、ZIGOROuさんamachangさんcho45さんをはじめとする有名な方々がいました。
元々、あまり喋らない自分は人数が多かったせいもあり、なかなか喋るスキをみつけられなかったのですが、喋らないなりにも「おぉ、ZIGOROuさんだ、amachangさんだ、cho45さんだ」と心の中でちょっと感動していました。


めしを食ったあとは、Sixapartに行くということで流れに身をまかせてついていきました。

そして数分坂道を登ったころでしょうか。「ここがSixapartです!」と紹介されたのがこれ↓

sixapart-temple.jpg

えぇぇぇぇぇぇ、お寺なの!?と一瞬ちょとびびったけど、このお寺はSixapartのビルの隣にあるお寺らしいです。
(すでにこちらでネタバレしてますけどね)

で、実際のSixapartの中はこんな感じ↓で、とてもオシャレなとこでした。

inside-sixapart.jpg

その後、↑の地べたに座って会議ができる部屋のようなミーティングルーム付近で、皆さんそれぞれに色々な話をしたあと、記念写真を撮ってから会社へ帰りました。
帰り際に頂いたペットボトルの水がとても美味しかったです。にぽたん同様、ほんと外が暑かったので、あの水に命拾いしました。

にぽたんも書いていたけど、突然の訪問にも皆さん親切にしていただき、とても居心地がよかったです。
今日のお昼は、とても楽しかったです。皆さんありがとうございました。また行きましょう。

tokuhiromさんがIRCで、

Nokia6820/2.0 (4.83) Profile/MIDP-1.0 Configuration/CLDC-1.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)

みたいなモバイル用のgooglebotがくるんだけど、これがH::MAではis_non_mobileになっちゃうというのを聞いたので、それをis_non_mobileじゃなくす実装をした。それと同時に以前Kamikuraさんから要望として来ていた

J-Phone/5.0/J-SH03 (compatible; Mozilla 4.0; MSIE 5.5; YahooSeeker)

という、キャリアの名前が「J-PHONE」じゃなくて「J-Phone」になってる微妙なYahooSeekerもモバイルとして認識するように実装しました。

まだCPANには上げてませんが、ここからダウンロードできます。


ていうか、この対応はかなりad hocな対応なので今後こんなヘンテコなUAのbotが増えたら、その都度対応しなきゃならないなんてめんどくさすぎる。

そこで対応策をいくつか考えてみた。

  • 案1
  • H::MA::BotみたいなのつくってBot関連はすべて隠蔽。そんで、基本的にはH::MA::{DoCoMo,EZweb,Vodafone}として振舞うけどis_botがtrueになるみたいな実装。
  • 案2
  • IRCで宮川さんが言ってたけど、そもそもH::MAのキャリア毎に扱うのやめて、H::MAのクラスのオブジェクトにして全部メソットやプロパティで扱う。つまり、キャリアを意識しないクラス構造にするみたいな実装
  • 案3
  • とりあえず、is_non_mobileじゃなければいいんだから、is_non_mobile内でこれはモバイルだよっていう判定関数を作って、それにガシガシ正規表現を追加していく(追加できる機構にする)
  • 案4
  • ごりごり対応していく。

とりあえず考えたのはこんくらいです。
どれにしようかはもう少し考えてみますが、とりいそぎは今の実装で数日中にCPANにアップする予定です。

検索

広告

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.12