タグ:Perl

ちょっと日があいちゃいましたが、YAPC2日目の感想書いていきます。

IMG_0787.JPG二日目はちょっと出おくれてしまい、11時からになっちゃいました。
(10時からのトークも気になるモノばかりだったので、後から動画でみました)

バウンスメール解析システム"BounceHammer''の紹介 -azumakuniyuki

メール配信システムを作るのっていろいろ面倒なんですよね・・いろいろ。実際作ったことある方は解るとおもうけど、結構なメールが届かない。なんで、そんなメールアドレス変えちゃうんだよってぐらい変えちゃうし。そういうのがバウンスメールとして帰って来るわけですがそれを、解析してくれるシステムです。
 このトークちょっとトラブルがあって、MacのDVI変換ケーブルを忘れたようで、画像なしでスタートしたんです。(Mac使いだとあるあるですよねw)途中でPCを貸してしてくださる方がおられて、映像付きのトークになったという逸話があります。画像が出た瞬間はみんな拍手で、そういう所が暖かくていいなぁと思いましたw
 ちなみにBounceHammerの公式ページで管理画面のデモやAPIのデモがあるんんですが、画面はキレイで見やすいし、jsonで帰って来るAPIあるし、けっこう使いやすそうです。ドキュメントもしっかりしてそうだしいいですね。


Ajax Application Testing -Yappo

途中からですけど、移動してコチラを見てきました。Yappoさんが写真共有サイトのFiciaを作る際に開発されたJSTAPdというAjaxテストツールです。Perlのテストライクにjsのテスト書けて、実行できます。内部的にはPSGI/Plack/Twiggyでテストを実行しているようで、テストスクリプト実行すると裏側でブラウザ立ち上がってバーッとテストしてくれます。これすごく便利そうです。Ajaxでごりごり動くサイト作る際には使ってみたいですね。

Perl5 is Alive! -Jesse Vincent

Perl5の"パンプキン"をされているJesse Vincent氏のトークです。とってもCoolなスライドで、スライドの上にtwitterでの投稿がニコ動のように流れてくるようになっていて、このトークの合間にうっかり食事に行ってしまった人達が、twitterでの反応をみて慌てて帰って来るというような一幕もありました。

 さてこの"パンプキン"という役割、私は今まで全然知らなかったんですが、Perl5の新しいバージョン開発の総責任者とでも言うべき人です。Perlの言語仕様を決め、コード管理をし、開発メンバー間の調整をし、リソース管理から、実際のリリースまでというかなりハードな役割です。PerlだけでなくCのハッカーである必要があり、その役割をこなせる人物が少ないだけでなく、あまりの過酷さ故、多くのパンプキンが"Burn out"(燃え尽きて)しまっているそうです。

 その流れを現"バンプキン"のJesse Vincent氏がいかに変えていこうとしているか、そういったお話です。言語がどのように開発されているかを、実際のメンバーから聞けるという素晴らしい機会でした。ちょっと良い話なので、見ていない方は動画見て頂くと良いと思います。

Perl で自然言語処理 -overlast

自然言語処理の入門で、自然言語処理ってなに?って所から自然言語処理の勉強の仕方から、Webサービスでの使い方まで話されていました。自然言語処理って特殊な事なように聞こえますが、Webサービス作っていたら、必ず何かしら絡んできますよね。検索であったり、はてなダイアリーのキーワード解析あたりがメジャーでしょうか。特殊なケースではRemember the milkの日付処理なんてあたりでしょうか。特に最近のWebサービスでは重要な技術だったりするので、非常に勉強になりました。

「映画にでてくるハッカーになりたい」 -cho45

ネタだろうと思って聞いてみたら、かなり作り込まれていて、ビックリしたトークです。でもやっぱりネタ満載で爆笑が至るところで起こっていました。これ、言語関係なく楽しめるとおもうので、Perl関係ない人でも見てみると楽しいと思います。そういえば、このトークの投票で選ばれていましたね。素晴らしいです。いろいろ言うより見て貰うのが良いと思います。

perl- casual特別企画 Unix Programming with Perl -kazuho

このトーク実は見ていません。というか、入れなくて見れませんでした。ものすごい人気です。今回はperl-casualから入ってきた方が多いのでしょうか、kazuhoさんの人気っぷりでしょうか、どちらもあるんでしょうが、会場からあふれるほど人が来るところがすごいです。あとで動画で見ます。

perl- casual特別企画 PMグループディスカッション

地方PMのリーダー達が一同に介してグループディスカッションするという今までのYAPC Asiaには無かった形式のトークです。なんか地方も盛り上がっていたり、盛り上がっていなかったりという話を聞いて、参加してみたいなーと思いました。実際に参加するのはなかなかに大変ですがw個人的には北海道pmはいつか行ってみたいです。

Inside mbga platform -Toru Yamaguchi

zigorouさんによる、モバゲーの裏側を解説なんですが、めちゃくちゃボリュームがありました。DB周りの話は興味津々ではあるんですが、そこまでのトラフィックがあるサービス事態がなかなかないでしょうね。だいぶ早足で話されていましたが、それでもかなり時間がたりなそうでした。へー、と思ったのは、Shindigを全部まるっと使っている訳ではない点でした。一番実践で参考になりそうな数万ジョブ/秒をさばく非同期ジョブあたりがかなり早足だったので、動画でゆっくりみたいと思います。

Lightning Talks Day Two

いまYAPCのサイトみながら書いているんですが、2日目のリストが無いんですよねー。
この日も爆笑がおこっていたと記憶しています。特に印象的だったのは、DeNAの上田さんのMySQLでwebサーバー動かすwやつと、草とPerlのやつ、これは良い意味でバカだなーってトークでしたね。にぽたんさんの"There Are So Many Ways To Shuffle It"はあれだけの内容を5分でしゃべる、かつ盛り上げる作り込み具合に、流石だなと思わされました。あとtokuhiromさんのトークはアツイトークでしたね、PC壊れてスライドなしでしゃべっちゃう所が、非常にらしいといえばらしいトークでしたが、内容もらしい内容でした。

Keynote -Tatsuhiko Miyagawa

最後のオオトリは宮川さんのトーク。Plackの話ですが、技術的な所ではなく、去年生まれたばかりのPlackがどうしてこんなに成功したのか?という所を分析したないようなんですが、すっごく良い話というか、胸が熱くなるトークでした。すごく印象的だったところは、「"Perl is guru language"(Perlは「ノリ」の言語だ)と言われているけど、そのノリがまた良いところであって、Plackはノリに従って作って成功した面もある。」と言いつつ、「でも、一番の成功の理由はPeople(人)であって、沢山の人達が協力があってこそ、成功したんだと思う。」とまとめ、「ここに居るみんなはおなじPerlという言語を話す仲間であって、"Perl glues people together"そういうノリの言語であるPerlを話すみんなが集まる場がこのYAPCであるんだ」と結んでおられました。すっごく感動するトークなので、見てない方は是非見てください。

まとめ

今までYAPCって、聴衆として"見に来ている"感が強かったんですが、今回のYAPCって、すごくコミュニティ色が強くて、みんなその一員なんだよって感じる所が沢山あったと思います。Perlのコミュニティって活発でまとまりがあって、すごく良いものなんですけど、外部から見るとちょっと近寄りがたいというか、一見さんお断り!みたいな空気感があるんですよね、実際は全然そんなことなくて、いい人ばかりだけど、なかなかとっつき辛い。でも、最近perl-cusualや、地方pmの盛り上がりとかもあって、perl初めての人やYAPC初めての人も多かった気がします。

 そんななかPerlの生みの親であるLarry wallを間近で見て、話して、一緒に写真とったり、Jesse Vincent氏の言語開発の裏側聞いたり、宮川さんの"Perl glues people together"っていう話があって、自分達もPerlを話す一員なんだって思える、素晴らしいYAPCだったと思います。ほかの感想エントリ読んだりしていると、次は発表する側で参加したいって人もたくさんいましたね。私もそう感じた一人です。

 みなさんのトークも素晴らしかったのはもちろん、このトークの順番も秀逸でした。順番組んだMakiさん、お見事でした。
 最後になりますが、941さんはじめ運営のみなさん、そしてボランティアの皆さんお疲れさまでした、とっても素晴らしいYAPCでした。来年も楽しみです。
このエントリーをはてなブックマークに追加

ちょっと時間あいちゃったんですが、今年もYAPC行ってきたので、感想を書いておこうと思います。


IMG_0787.JPG
今回で三回目のYAPC Asia参加です。思い返せば2008年はMoose、2009年はPSGI/PlackとAnyEvent&Coroというすっごいムーブメントがあったんですが、2010年は極端な波はなかった気がします。じゃあ、あんまりインパクトなかったのかと言うと、そんな事はなくて、Perlのコミュニティが持つ力をすごく実感できたイベントだと思います。

実際に当日みたトークを振り返りつつ感想を書いてみたいと思います。




That Goes Without Saying (or Does It?) -Larry Wall

最初のトークはPerl生みの親であるLarry Wall氏。言語の開発者ならではの視点で、Perlの素晴らしさと、ほかの言語に対するDisりが入っていて非常におもしろかったです。たとえば、Javaに対して我々開発者が愚痴を言うとすれば、「オブジェクトの生成がいちいち冗長だ」とか「キャストがめんどくさい」とか、「コンパイラおばさん(私はこう言っている)が口うるさい」なんて良いそうですが、Larryの斬り方は着眼点が違います。「Import java.lang.Mathというアイデアは理解できない、みんあ数学をさんざん学んできたのにもかかわらず、いまさらimportしないといけないのか?」と突っ込んでいましたし、Ozという言語では、関数定義がFun(Functionの略) ~ Endで定義するんですが、「全てのFunがEndしている!」と突っ込んでました。そんな発想は全然なかったので、すっごく新鮮でした。


CloudForecast の紹介 -長野雅広

最近、CloudForecastはいつも仕事でお世話になっているので、聞いてきました。CloudForecastが何かというと、サーバーのモニタリングツールです。livedoorではCactiが主流だったのですが、長野さんが来られてからlivedoorのモニタリングツールの入れ替えがされて、こっちが主流になっています。特徴は軽量かつ高性能で、livedoorでは一台のサーバーで数千台のモニタリングをしているようです(自社ないの事ですが、これは初耳でしたw)。モニター画面はPlackベースで作られていて導入もお手軽なようですので、非常にオススメです。個人モニタリングツール使うとしたらやっぱりコレを選択すると思います。そのぐらい素晴らしいです。


モダンな Perl5 開発環境について - Modern Perl5 Development Environment - 2010年代を生きのびる Perl5 活用術 -Tokuhiro Matsuno

次はtokuhiromさんのトーク、今回のYAPCのテーマは「Wellcome Perl」という事と併せてかもしれませんが、Perlの開発環境のお話でした。tokuhiromさんらしく"モダン"なトピックが盛りだくさんで、perlbrewとかlocal::libとかcpanminusなど、このトークを聞けば最近のPerl5開発環境が解るトークとなっていました。cpanモジュールの選び方あたりも抑えているところが、流石というか、抜け目ないというか、とってもらしいなと思いました。


お昼

前回まではお昼の時間がちゃんとあったんですが、今回は明確なお昼時間がなかったので、ここでお昼に行きました。近場ですませば、次の枠もちゃんとみれたんですが、無性にラーメン食べたくなって、フラフラしていたら次の枠みのがしてしました。動画で確認しようと思います・・・

ちなみに食べたのは「しま坂」というラーメン屋さん。よりによって一番遠い所行っちゃいました・・

IMG_0784.JPG

好みからいうと、ちょっと味濃かったんですが、旨かったです。


DataPortability and SocialWeb Protocols -Lyo Kato

mixiのLyo Katoさん。OAuth::Liteの開発者でも有名です。私もちょっと前にmixiアプリを作ったときに、すっごくお世話になったモジュールです。近年OpenSocialが大流行ですが、OpenSocialを取り巻く技術を紹介されていました。AndoroidとiPhoneでの開発する際のTipsも一緒に紹介していて、どのようにデータを扱うのが好ましいのかセキュリティの観点もはなされていたのが印象的でした。スマートフォン開発者は是非みると良いと思います。


Studying HTTP with Perl -mala

続いてはmalaさんのトーク。クローラーなどを書く際に必要となるHTTP系のモジュール(LWPやURI::Fetchとか、WWW::Curlとか)についての解説、AnyEvent::Curlの紹介などから、プロトコルとしてHTTPは非常にシンプルかつ枯れた技術なのでRPCを実装する際も、独自プロトコルよりHTTPでの実装を検討すべきという意見や、HTTPライブラリのテストをどうやれば良いのかを解説していました。普通に外部のデータAPIたたくだけならそれほど考える必要ないかもしれませんが、クローラーやRPCを実装する必要のある人にはとても参考になるトークでした。


非同期タスクの通知処理 with Tatsumaki -keroyonn

すごく時間のかかる処理をユーザーを待たせる事なく行い、かつユーザーにフィードバックさせるための方法を発表されました。非同期で処理するためのジョブキューや、双方向なUIを実装するためのcometとかLong pollingとか言われる手法のお話でした。具体的にはタイトルにもあるけど、非同期WebフレームワークはTatsumakiやジョブキューシステムはGearmanでした。あとTatsumaki::HTTPClientの代わりをこなすためのWebService::Asyncというモジュールの解説もされてました。このkeroyonnさんはわざわざ北海道からこられたそうで、非常に凝った(仕込まれた?)スライドを準備されていて、プレゼン巧いな・・と思わされました。


Web サービスのページング処理について -吉見 圭司(walf443)

Webサービスのページングって、大概どこでも使う割にはあんまり目新しことないので、ちょっと興味を引かれたので聞きにきました。DBIx::Skinny::Pagerというモジュールを紹介しつつ、どんなページャの仕組みあるのかを話されていました。count(*)だけじゃなくていろいろな手法があるんですが、それぞれ特徴があって、甲乙つけがたかったり、多めに引いてcacheしておくとか、やっぱりいろいろ苦労しますよねぇ・・と妙に共感したトークでした。まぁページャおもくて仕方ないよ・・って言うほどのサービスをヒットさせる方が頭痛の種ですけどね・・


Lightning Talks Day One

1日目のラストはライトニングトークです。今回のライトニングトークはレベルがすっごく高かったです。満員となった会場は笑いの嵐、拍手の嵐。すっごく面白かったです。特に笑ったのを紹介すると、


* Ruby プログラマがPHPの会社 入って
  phpでRack/WSGI/PSGI的な環境つくったって話ですが、とにかく面白い!途中でタイムアップしちゃいましたが、最後まですっごく聞きたかった & 最後が気になるという人も多いはず。リベンジ期待ですね!

* 基幹システムがperlでどうしてこうなった
COBOLで動いている基幹システムをperlに!?というビックリな内容ですが、方法もとんでもなくビックリです。どうしてそうなった!?と突っ込まざるを得ない内容でした。


* That Goes Without Alpha-Num (or Does It?)
 竹迫さんのトークは毎回爆笑 > 驚き > 歓声 > 拍手とつながるんですが今回も例に漏れませんね!もう職人というしかないですね。ほんと感服します。

1日目まとめ

一回のエントリで終わらせようと画策してたら見事に失敗しました。それだけ素晴らしいトークが沢山あったということでしょうか。トークはyoutubeに全てあがっているので気になったモノがあれば是非ごらんになってください。

 今回感じたのは「Wellcome Perl」というタイトルだけあって、今回初めて参加の方やPerl以外の言語を普段使っている人の参加が多かった様な気がします(気がするだけで一切裏付けありませんが)。あとすごく関心したのは、トークの順番がよく練られている事です。これは2日目も通して参加するとより強く感じる事ですけど、今回のYAPCがすっごく纏まっていて、中身が濃く思えた一因にもなっていると思いました。

 なんかのびのびになっちゃってますが、感動の2日目のエントリは週中には書こうと思います。(週頭は旅行なもんで・・・)
このエントリーをはてなブックマークに追加

最近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は色々画像を加工するメソッドが用意されていていいですね。

このエントリーをはてなブックマークに追加

↑このページのトップヘ