hack my life

愛用されている方も多いエネループに限定パッケージがでてました。

8本の単三電池が8本とも違うカラーリング!
これがまたオシャレでカワイイのです。
取りあえず一つ購入しておきました。

SANYO NEW eneloop tones 充電式ニッケル水素電池(単3形8色カラーパック) HR-3UTGA-8TN
三洋電機 (2009-12-12)
売り上げランキング: 43
おすすめ度の平均: 5.0
5 1億個突破記念 10万個限定の eneloop tones
5 わかりやすい
5 電池を見せる工夫をした製品が増えることを期待します
最近Google AnalyticsのMobile版がひっそりと始まりましたね。
ホントにひっそりで、場所がわかり辛いのですが、

https://www.google.com/analytics/settings/check_status_profile_handler


ここの、

  1. Instructions for adding tracking
  2. Advancedタブ
  3. 1 What are you tracking?
  4. A site built for a mobile phone
を選択するとでてきます。

導入方法 Perl編

  1. 「2 Paste code on your mobile site」のコードをviewから呼び出せるところに準備
  2. htmlあたりに<img src="[% google_analytics_get_image_url() %]">書く
  3. 「3 Copy this file to your root directory」にあるga.plをcgi起動出来るように設定するか、同様の内容を作る

さっそく導入してみたんですが、どうもsessionの同定が出来てないっぽいです。
別集計で出したUUが2,000ぐらいなのに、Analyticsだと10,000になっていたりします。
なんでかと思い調べたところ・・・

# Generate a visitor id for this hit.
# If there is a visitor id in the cookie, use that, otherwise
# use the guid if we have one, otherwise use a random number.
sub get_visitor_id {
  my ($guid, $account, $user_agent, $cookie) = @_;

  # If there is a value in the cookie, don't change it.
  if ($cookie ne "") {
    return $cookie;
  }

  my $message = "";
  if ($guid ne "") {
  # Create the visitor id using the guid.
    $message = $guid . $account;
  } else {
  # otherwise this is a new user, create a new random id.
    $message = $user_agent . get_random_number();
  }

  my $md5_string = md5_hex($message);

  return "0x" . substr($md5_string, 0, 16);
}

ん?

# If there is a visitor id in the cookie, use that, otherwise
# use the guid if we have one, otherwise use a random number.

あれ、docomo以外みてくれてない・・

というわけで修正しました。独自でやってもできるけどキャリア判別とかが煩雑だったので、HTTP::MobileAgent使っています。0.27以降がdocomoID対応なんで、それ以降を使います。


--- ga.pl	2009-11-12 21:27:23.000000000 +0900
+++ ga.pl.new	2009-11-12 21:22:04.000000000 +0900
@@ -6,6 +6,7 @@
 use Digest::MD5 qw(md5_hex);
 use LWP::UserAgent;
 use URI::Escape;
+use HTTP::MobileAgent;
 use strict;
 
 # Tracker version.
@@ -59,9 +60,10 @@
   }
 
   my $message = "";
-  if ($guid ne "") {
-  # Create the visitor id using the guid.
-    $message = $guid . $account;
+  my $user_id = _get_user_id();
+  if ($user_id ne "") {
+  # Create the visitor id using the uesr_id.
+    $message = $user_id . $account;
   } else {
   # otherwise this is a new user, create a new random id.
     $message = $user_agent . get_random_number();
@@ -192,4 +194,14 @@
   write_gif_data($new_cookie, $utm_url);
 }
 
+sub _get_user_id {
+    my $agent = HTTP::MobileAgent-&gt;new; 
+    return $agent-&gt;user_id
+        if $agent-&gt;is_docomo;
+    return (split('_', $ENV{HTTP_X_UP_SUBNO}, 2))[0]
+        if $agent-&gt;is_ezweb;
+    return substr($ENV{HTTP_X_JPHONE_UID}, 1, length($ENV{HTTP_X_JPHONE_UID}))
+        if $agent-&gt;is_vodafone;
+}
+
 track_page_view();


当て方はga.plと上のga.pl.patchを同じディレクトリに置いて

$ patch -p0 < ga.pl.patch


このパッチでは、端末ID送信しない設定の端末とか、端末ID送信しないwillcomとかをスルーしちゃいます。厳密に計測するには、アプリケーション側で端末IDみて、なければユニークなID(session id)とかを使うべきですが、これだけでもそこそこの制度がでるので、さっくりやりたい人はこっちで良いと思います。

YAPC Asia 2009に参加してきました。

今回のYAPCではAnyEvent,PSGI,Coro,リアルタイムWeb辺りがポイントだったかと思います。
見た物のなかから一部をピックアップして書いておきます。

Yoichiro Tanaka - ‎Webエンジニアのためのmixiアプリ開発ガイド‎

mixiアプリの解説でperlの話しはあまり出てませんでした。
が、個人的には非常に面白かった。mixiアプリを全然チェックしてなかったのですが、
feedとかJSONのAPIあれば簡単に作れてしまう所が良い感じ。

実装的にはXMLのファイルの中のCDATAセクションにjsを書いて、OpenSocialのライブラリを使って、API接続してゴニョっとする感じ。
マイミクやコミュの情報を使うには独自のAPIを使わないとダメ。OpenSocial準拠ではるけれど、各サービスによって独自APIを使っているので、
簡単に移植と言うわけにはいかないそうですけど、mixiの1700万ユーザーというのはやはり魅力。

家にかえってから、思わず勢いで作ってしましました。そのうち別記事として書いてみたいと思います。

Tokuhiro Matsuno (‎tokuhirom‎) - ‎PSGI - Perl Server Gateway Interface‎

コレが、Perlの話しとしては今年の2大トレンドのウチの一つじゃないでしょうか?
PSGIは表題にあるとおり、Perl Server Gateway Interfaceの略で、実装ではなく、あくまで仕様とのこと。

要するに、「Webサーバーやフレームワークが新しく出る度に、コードを書書くのはやめよう」という、Rack/WSGIの思想をPerlで作ろうというもの。
同じ思想でHTTP::Engineが思い浮かぶと思うんですが、HTTP::Engineは仕様+実装+インターフェースが含まれていて、
みんなに使ってもらうには、余分な実装が含まれ過ぎていた事が原因でなかなか浸透しないようで、HTTP::Engineから仕様を切り出してまとめたものだそうです。

このセッションでは、PSGIの概念だけでなく、実際にPSGIに準拠した実装であるPlackによるデモも行われました。
CatalystでかかれたコードをMojoで動かしたり、fastCGIで動かしたりとなかなか面白いデモでした。

Plack::Impl::Sledgeが非常に欲しいですね。

Tatsuhiko Miyagawa (‎miyagawa‎) - ‎Event programming fun with AnyEvent and Coro‎

AnyEventの解説。これが今年のトレンドのもう一つですね。ちょっと前から非常に興味があったんですが、今回のYAPCでも何度となく出ていました。
要するにPerlでEventプログラミングをするためのmoduleです。PerlにはPOEとかEVとかIO::Poll、IO::Async等々色々なmoduleがあるのですが、
AnyEventはどんなEvent系モジュールでも対応できる実装があります。AnyEventには独自のメインループを持っておらず、上記のmoduleをと組み合わせて使います。

AnyEventのメリットはシンプルで非常にわかり易いインターフェースで、POEなどのややこしい構文を書くことなくプログラミングできます。
AnyEventとCoroを使ったプログラミングがかなりアツイんですが、AnyEvent自体の説明が結構ボリュームがあって、Coroの説明は省略されていました。(後述のmalaさんのセッションでCoroの話しがあったから?)

Kazuhiro Osawa (‎Yappo‎) - ‎Key Value Store with O/R Mapper

Data::Modelのお話。いわゆるORMなんですが、Data::Modelは近年のORMとはちょっと違っていますね。実際使うためのチューンが大量にされている感じ。
基本的には、薄く早くと作られたORMで(JOINす削られている)という徹底ぶり。cacheもテーブル名やカラム名をアルファベット1文字や数値に書き換えてキャッシュする事で、サイズを節約してたりするようです。

個人的には一番使ってみたいORMだけど、癖があるので、使いどころをちゃんと考えないと、いけないので、業務でつかうのはちょっとためらう感じ。

Atsushi Kobayashi (‎nekokak‎) - ‎simple or mapper DBIx::Skinny

こちらもORM。Data::Modelと同じく薄く、薄くと意識してつくられたDBM。
実は、DBICが生成するSQLが非常にパフォーマンスがわるいそうで、もっとシンプルで計量なSQLをそのまま実行したい。という思想から作ったそう。
大分安定してそうだし、現在のORMの感覚でつかえそうなので、実際に仕事でつかうなら、コレを使ってみたいです。

Masahiro Nagano (‎kazeburo‎) - ‎大規模画像配信を支えるPerl‎

mixiさんでの画像配信の仕組み。BlogとかでもServer構成がかかれているので、目新しいといより、「ああ、そうですよねー」という感想。
mixiではクオリティと速度を勘案してlmlib2を採用しているそう。弊社のモバイルチームでも最近画像配信系を一新しようと思っているんですけど、
うちもlmlib2で行こうとおもっていたので、妙に納得しちゃいました。

Tokuhiro Matsuno (‎tokuhirom‎) - ‎Asynchronous Database Queries with Perl‎

ここでもAnyEventでてましたね。シリアルでSQL投げると、全部の実行時間の合計が実行時間になってしまうので、重いSQL何個かなげるなら、非同期で処理しちゃおうという話。
PostgreSQLだと非同期に処理するのはDBD::Pgでいけるらしいのですが、DBD::MySQLは非同期で処理できないので、libdrizzleを使うといいらしい。
機会があれば是非使ってみたいところです。

ma la (‎mala‎) - ‎Asynchronous Programming for (A)synchronous Communication‎

AnyEvent+Coroあたりの話しがメイン。以前Shibuya.pmでlivedoor Readerのインターフェース側の話しをされていたのですが、
今回は内部の話し。crawlerのパフォーマンスチューニングにAnyEvent+Coroでシングルプロセスないで、IO非同期化したほうが、
プロセスを沢山あげるよりパフォーマンスが良かったという話しから、非同期プログラミンの今後ロードマップまでするどい視点で考察されてました。

今回のAnyEvent期を総括するようなセッションで、一番面白かったセッションでした。40分のセッションだったのですが、内容盛りだくさんだったので、
後3回ぐらいは動画と資料を眺めてみたいと思いました。

見たセッションのなかからいくつかピックアップして書いてみました。
Lightning Talkでも面白いかったセッション沢山ありました。また後で書いてみたいと思います。

今回のYAPCも非常に刺激的で面白かったです。見れなかったセッションにも面白い物が沢山あったようで、
あとで動画で見させていただこうと思っています。

Imagerで画像を加工して、斜めに20℃傾けてみました。

もと画像はこちら

use Imager;

# 写真の読み込み
my $photo = new Imager;
$photo->read(file => $photo_file) or die $photo->errstr;

# 写真を傾ける
$photo = $photo->rotate( degrees => 20 );

# キャンバスとなるオブジェクト
my $canvas = new Imager( xsize => 300, ysize => 350, channels => 4 );

# 写真のリサイズ
$photo = $photo->scale(
    xpixels => 300,
    ypixels => 300,
);

# キャンバスに写真を貼り付け
$canvas->paste(
    src  => $photo,
    left  => 0,
    top  => 0,
);

# PNGで書き出し
$canvas->write(file=> './result.png', type=> 'png') or die;

上記コードを実行するとこうなります。

斜めにはなるんですが、四隅が黒くなってしまいました。
透明にするにはアルファチャンネルを有効にしてあげれば良いはずなので、


channel => 4に設定してあげればいいんですが。

略

# 写真の読み込み
my $photo = new Imager;
$photo->read(file => $photo_file) or die $photo->errstr;

# 写真を傾ける
$photo = $photo->rotate( degrees => 20, back => [0,0,0,255] );
$photo->img_set( channel => 4 );

略

実行結果はこうなります
背景はあえて不透明にしてあります(白にすればよかった・・)

なぜか写真が透明になってしまいました・・・
なぜかと言うと元の写真にアルファチャンネルが設定されていないからで、


アルファチャンネルが0(透明)に設定されてしまうせいでした。

これを回避するためにImagerにはconvertというメソッドがあります。

略

# 写真の読み込み
my $photo = new Imager;
$photo->read(file => $photo_file) or die $photo->errstr;

# 写真を傾ける
$photo = $photo->convert( preset => 'addalpha');
$photo = $photo->rotate( degrees => 20, back => [0,0,0,0]);

略

結果はこのとおり

思いどうりになりました。
Imagerは色々画像を加工するメソッドが用意されていていいですね。

vimperatorを起動したときに、.vimperatorrcのエラーとか、プラグインのエラーが一瞬出たりするんですけど、
どうやったら見れるんだろう?と思い悩んでいたら、:messageってコマンドがあるらしい。

2.0pre以降の機能なんですが、これがあるとdebug効率が全然違う。
今さっき知りましたw

アドセンス

MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore MoMAstore
MoMAstore
MoMAstore
MoMAstore
MoMAstore

Photos

  • vimparator3.png
  • vimparator2.png
  • vimparator1.png
  • CA350288.JPG
  • CA350256.JPG
  • CA350344.jpg
  • keynote08_2.jpg
  • keynote08.png
  • malanoche.jpg