JSTAPdのチュートリアル見ながらJavaScriptのテストをしてみるよ

最近JSTAPdに関するつぶやきを見て
「そうだ!触ろうと思ってインストールしたまま触ってないや!」
と思ったので実際に触ってみた流れとハマった所のメモ。



基本的には

perldocjp JSTAPd::Tutorial::JA

とかやってチュートリアルを見ればいい。
日本語だし簡単ですね!ブラウザで見てもいいと思うよ
この記事の内容もチュートリアルまんまだよ!


テスト用のディレクトリを作成する

 jstapd -n <適当なディレクトリ名>

でテスト用ひな形ディレクトリが作成できる


cd <作成したディレクトリ名>

で中に入って、

jstapd -d .

で現在のディレクトリ内にあるテストを実行できる。
既にサンプルのテストファイルが用意されているので、ブラウザが立ち上がり
http://127.0.0.1:1978/____jstapd/
が表示されると思います。
なので、make testボタンを押せばOK。
(これは試しで使っただけで、実際のテストの時はproveでやっちゃう気がします)


実際にJavaScriptのライブラリを作ってテストしてみる

(さっきのページは閉じてしまって、ここからはテストを書きながら実際にライブラリの作成。)



まず、ライブラリをファイルとして作成したいのでそのための下準備をする。
ここで、簡単に話をすすめるために、

  • 作成するライブラリファイル:my-library.js
  • my-library.jsを作成するディレクトリ:<今居る場所>/jslib

としましょう。



ブラウザからmy-library.jsへアクセスできるようにconf.plにマッピング処理を追記する。
まず、$config内のapiurlにjslibを追加。

    apiurl        => qr{^/(?!____jstapd(?:__api)|jslib/)},

次に、urlmapに実際に存在するディレクトリへのマッピングを書く。

$config->{urlmap} = [
    { qr!^/jslib/! => 'jslib/' },
];

(conf.plが置いてあるディレクトリが基準になるのでjslib/と書いてます)
基本的にはコメントアウトしてあるものを少しいじるだけなので簡単ですね!



あと、今回はsafariで確認したかったので、

$config->{auto_open_command} = 'open -g -a Safari %s';

のコメントアウトも外しました。
(-gを付けるとバックグラウンドでブラウザが起動してくれてフォーカスが当たらないので嬉しい)


さて、conf.plに書いたマッピング処理に合うようにディレクトリを作成してmy-library.jsを作る準備。

mkdir jslib


01_base.tに、そのjsファイルをincludeするための記述をする。

sub include {
    qw(
          /jslib/my-library.js
    );
}

また、一つだけテストをしたいのでテストの数を1とします。

sub tests { 1 }

あとは01_base.jsにテストを記述していきます。

ok(MyLibrary(), 'ok MyLibrary');

(01_base.tにsub client_scriptを定義して、そっちに書いていっても良い)



この状態で試しに

prove -v 01_base.t

と実行してみると、ブラウザがローディング状態のままになりますね。
これはMyLibraryがなくてエラーになっちゃってるからです。
Ctrl-Cして抜けてMyLibraryを作りましょう。



(とりあえずテストだけ試したいのでcatでファイル作成しちゃいます)

% cat > jslib/my-library.js
var MyLibrary = function() { return true };
# ctrl-Dで抜ける

これでtrueを返してくれるMyLibraryができました。



最後にもう一度proveで実行すると、さっきと違いサッとブラウザが出てきてサッと消えて気持ちよくなれます。

% prove -v 01_base.t
01_base.t .. 
1..1
ok 1 - ok MyLibrary
ok
All tests successful.
Files=1, Tests=1,  0 wallclock secs ( 0.03 usr  0.01 sys +  0.36 cusr  0.08 csys =  0.48 CPU)
Result: PASS

ハマった所。

最後に書いた通り、

prove -v 01_base.t

とかやるとサッとブラウザが出てきてサッと消えて、しかもsuccessfulとかなって超気持ちいのだけど、
JavaScriptにundefinedになったりエラーになる場所があるとブラウザがローディング状態になったままになるので、
読み込み中なのかエラーなのかわからなくてちょっとハマった。
(まぁ普通に考えてエラーです。SyntaxErrorが起こってないか確認しましょう。)



あとは、テストの所にも書いたけど.tファイルに

sub tests { 2 }

とか書いているのに、1個しかテストが書いてなかったりすると頑張って2個テストしようとローディング状態になるのでそこも気をつけましょう。


まとめ

チュートリアル通りできて簡単だね!
書き方わからなくなったらチュートリアルに書いてある通りサンプルを見たらいいよ!

cpanm --look JSTAPd
cd eg/simple
jstapd -d .

とかで確認できるよ!

perlでmp3タグをいじって歌詞を追加する

久しぶりに触ったら忘れていたのでメモ。

use MP3::Tag;

my $mp3 = MP3::Tag->new($mp3_filename);

$mp3->title_set('title');    # タイトル
$mp3->select_id3v2_frame_by_descr("USLT(eng)", 'lyric');     # 歌詞
$mp3->update_tags();    # タグに保存

# get
my($title, ) = $mp3->autoinfo;
my $lyric = $mp3->select_id3v2_frame_by_descr("USLT(eng)");

warn $title, $lyric;

みたいな感じでいける。
歌詞(USLT)の挿入は日本語だとしてもengにしないとダメ。
engに入れないと昔ipod touchで見れなくてハマった覚えがある。
ここにも似たようなことが書いてあった。



ただ、歌詞挿入した時に文字化ける時があるのだけど原因がわからない。

YAPC::Asia2010にボランティアで参加して楽しんで、そして今からYAPC::Asia2011をワクワクして待ってる

超楽しかった!ホントに楽しかった!



去年はYAPC::Asiaに初参加して、わからないながらも色んなセッションをひたすら聞いて、特にTAKESAKOさんのInline::x86 JIT Assemblerは大学の部屋の雰囲気も手伝って
「ホント大学の授業思い出すくらいわからないやぁ」
とか思いながら時間を過ごしたのを覚えています。



今年はというと、6月末で会社を辞めたので時間もあり、ボランティアスタッフの募集があったときに「今年は仕事もしてないしボランティアやりながら見たいもの見よう。タダ見できるみたいだし」
という軽い気持ちで今年のボランティア参加を決めました。



流れとしてはtwitter見ててYAPC::Asiaのボランティア募集をしてるのを知り、
「あ、これ早めに参加メール出さないと締め切られちゃうかもしれない!
あ、あ、でも何か応募資格的なものあるかな?誰でも参加できるのかな?」
みたいなソワソワ感のまま2カ月前の8/13にくしいさん宛てにメール。
そしたら、「9月くらいに説明会を開くのでその時に詳しい話をします」と返信。



9月になるまでボランティアになれるのかどうなのかよくわからずソワソワしていて、
「応募多数で振り落とされることもあるかもだからチケット買っておかなくちゃかな?」
とか考えてました。
チケット販売締め切り後にボランティアになれずだと困るなと思い、
念のためくしいさんにそのこと伝えると「大丈夫です!」と返信貰ったので、あとは安心して説明会まで待ってました。



9/21になり、くしいさんから「10月頭にボランティアスタッフ説明会やります」の案内が送られて来て、
10/5の夜にlivedoorで都合のついた人たちで簡単な顔合わせ+簡単な打ち合わせ。
この時には、

YAPCボランティア説明会ではピザが振る舞われる予定です。
http://twitter.com/941/status/26420552185

@941 ボランティアスタッフも食べられるんですか?!ご飯食べてから行くつもりでした!
http://twitter.com/lesamoureuses/status/26437042630

@lesamoureuses ボランティアスタッフ用に、です!
http://twitter.com/941/status/26437697445

@941 やった!ありがとうございます!ありがとうございます!
http://twitter.com/lesamoureuses/status/26437722182

ということでピザが用意されるという大盤振る舞いでした。
細かい打ち合わせは当日の朝(前夜祭の前)にということでこの日は解散。



ここまで大きいイベントの裏方ってやったことがなかったこともあり、この時には
「事前打ち合わせが全然なくても大丈夫なのかな?」
とかちょっと不安に思ったものでした。
終わってみると、そんなにたくさん打ち合わせをしなくてもいいくらい下準備ができてたんだなぁと思います。



14日の前夜祭は15時集合でしたが、僕がちょうどその時間に行った頃には何人も人が居て、
「あれ、やばい。時間間違えた?」
と思ったほどノベルティ詰め作業の前準備とかが終わってました。
この辺の手際の良さとZIGOROuメソッドのおかげでノベルティ詰め作業は結構楽に終わったと思います。



僕はMacBook持ってくる組だったのでそのまま受付のやり方をつくいさんに教えていただく流れ。
QRコードを読み取るとTシャツのサイズとか、あげるストラップの色とかが出てくる素晴らしい仕組みでした。
(ちなみにストラップは赤がスタッフ、黒が15日のみ、白が16日のみ、青が2日間、緑がスポンサーなどなどという5種類ありました。)
QRコード読み取り機(って言うのかわからないですけど)を初めて使ったので、
それだけでちょっと興奮しました。
商品のバーコードも読み取れたりして「おーおー!」となり、
いくつかピッ!ピッ!て遊んだものです。



そんな感じで「いざチェックイン作業!」となったのですが、
実際にやってみると結構テンパリました。
「ストラップを渡す」「投票用のIDを渡す」「Tシャツを渡す」「ノベルティの袋を渡す」
の流れが上手くいかずあたふたあたふた。
そして英語が喋れないから外国人の方が来た時にはまたもあたふたあたふた。
つくいさんが「wait!」と止めてくれて「まきさーん」と大声で叫ぶという対処で何とかなった感じです。



3日間通しての受付作業を振り返ってみると、改善する余地があったなぁと思っています。
1つは、「ストラップがチケット代わりですよ」というのを伝えていたつもりだったのだけど、
混雑でテンパってたり、伝え方も悪かったこともあり「ストラップをしなくちゃいけない」
って認識までしてもらえていなかった点。
これはもっと言い方を工夫しなくてはいけなかったんだなぁと思いました。


2つめは、QRコードのおかげでだいぶ楽だったのだけど、
僕はそのQRコードを参加者が実際にどうやって表示するのかを試していなかったので
携帯とかでQRコードを探して苦労している人の助けができなかったということ。
「何日頃メールが来てるはずですよ」
とか
「こういうURLで表示できますよ」
ってことだけでも把握していれば名前の一覧から確認するなんてことをしなくて済んだかもしれないです。



YAPC::Asia2010初日は朝8時集合でした。
受付だったということもあり、また朝8時集合だったということもあり、
そして前の日徹夜で昼夜逆転してたということもあり、
「いつもみたく二度寝したりして寝坊したらやばい!!」
と焦りまくった結果、

「明日受付やるし寝坊できない!早く寝ないと!」で12時に寝る→ふと目が覚めて「やった!寝坊せずに起きれた!」と思って時計見たら2時→「ヤバい。もっかい寝ないと寝坊する」で寝つけないまま4時になった #yapcasia
http://twitter.com/lesamoureuses/status/27367927394

結局目をつむったまま眠りにつけず4時間経ってしまった。。遠足に行く日の子どものようだ。
http://twitter.com/lesamoureuses/status/27375102736

という感じで目が冴えちゃいました。
お祭り前のドキドキ感には弱いタイプです。
遅刻するよりは断然マシですが。



8時にみんな集まって3会場の担当分けとやることの確認。
大講堂のプロジェクタとスクリーンの設置やTシャツを全部畳んでいくという作業をみんなでやり、
あっと言う間に参加者が来る時間になり受付開始。



最初にも書いた通り、元々はボランティアやりつつ、色んなセッションを見ようとしていたのですが、
全部ビデオに撮る(一部公開しないのもあるけど)という話も聞いていたので今回はずっと受付付近にいました。
ボランティア作業を3日間ともできるなんてのは今年だけの貴重な体験かもしれないと思いましたし。
結果、「来年もボランティア参加したい」と思えるほどに楽しかったです。
去年の「一つでも多くセッションを見よう」も楽しかったけど、
セッション見るのが目的になってしまっていたから「お祭りに参加している」感をそこまで楽しめてませんでした。
比べて今回は、スタッフということもあって色んな人に気軽に声をかけられたし楽しかったなぁと。



ということで、サインもいくつか貰いました。
まずはやっぱりラリーのサイン。

次に、去年に引き続いてまかまかさんAcme大全2010を買って、

その中に、まかまかさんとちょ〜なんさんの売り子ペアサイン。

くしいさんがTシャツにmiyagawaさんのサインを貰ってるのを見てうらやましくてサイン貰って、

最後にまかまかさんのところで買ったデコシールにそれぞれラリーサインとdankogaiサイン。

みなさん超気さくにサインくれました。嬉しい。



今回ボランティアをやってみて思ったことは、スタッフって楽しいってことです。
もし「お金がなくて」とか「話している内容全然わからないし」みたいな理由で来れない学生さんとかいるのであれば
まずはスタッフとして参加するっていうのもアリなんじゃないかなと思いました。
3日間全部仕事をやるわけではなく、「この時間はセッション見たい!」って融通もききます。
実際にセッションを見てみて、わからないことがあれば発表者の人に聞いてみると気さくに教えてくれます。
何よりスタッフとして参加しているのでこのお祭り自体を身近に感じられます。
そういう意味でスタッフ参加は超楽しいです。
みんなボランティアスタッフやったらいいんだ!



今回のボランティアをやるにあたって引っぱって指示をしてくれた、
まきさん、くしいさんはじめJPA理事のみなさんと去年から引き続きボランティアをしていたみなさん、
また、一緒に作業をしてくれたボランティアのみなさんに感謝してます。
ありがとうございました。



ということで、
http://yapcasia.org/2011/http://conferences.yapcasia.org/ya2011/http://tokyo2011.yapcasia.org/
の辺りのどれかが200 OK(3つめのURLは既に200 OKですが)で返ってくるのをモニタの前で待ちつつ、
まだまだYAPC::Asiaの余韻に浸りたいと思います。



来年もよろしくお願いいたします。

psgiファイルをCGIで実行するために勉強

Arkの勉強をしようとサンプルいじりながらちょこっとずつ進めていたら、
さっそくエラーが出てしまってどこがおかしいのかわからず挫折しかかってたところに、
さくらレンタルサーバーで動くWebアプリをArkを使って作ってみた - すぎゃーんメモなんていう素敵なエントリーがあがってたのでもうちょい頑張ってみようと勉強してみようと思います。



で、その前に。
psgiファイルを「plackup app.psgi」でなくCGIで動かす方法知らなかったのですけど、
上の記事読んだらさくらのレンタルサーバーでArk+CGIのTwitterアプリを作る練習 - すぎゃーんメモにCGIで動かす方法が書いてあったので僕もさくらで試してみました。

ゴール

環境変数を表示するためのenv.psgiの結果を、CGIで実行しても表示できるようにする

まずpsgiの作成

Sunabaにあったhelloworldの中身を少し書き換えて以下のようなenv.psgiファイルを作りました。

use strict;
use warnings;

my $app = sub {
    my $env = shift;

    my $content = << "END_OF_HTML";
<ul>
@{[ map { "<li>$_: $env->{$_}</li>" } keys %{$env} ]}
</ul>
END_OF_HTML

    [ 200, [ "Content-Type", "text/html" ], [ $content ] ];
};

$envの中身をliでリスト表示するだけのアプリ。

psgiを呼び出すCGIの作成

以下のようなenv.cgiファイルを作成。

#!/home/lesamoureuses/perl5/perlbrew/bin/perl
use strict;
use warnings;

use Plack::Loader;
my $app = Plack::Util::load_psgi("./env.psgi");
Plack::Loader->auto->run($app);

CGIからpsgiを呼び出すのは最後の3行みたいにやればいいみたい。
perldoc Plack::Handler::CGIにも例が書いてありました。



あと、あんまり関係ないけど、せっかくなのでこれを機にperlbrewに乗り換えてみました。
なのでシェバン行をperlbrew/bin/perlに。
perlbrewへの乗換えはとか新しいPerlに今まで使ってたモジュールをまとめてインストールする - 酒日記 はてな支店を参考にしました。
(ExtUtils::Installed->new(extra_libs=>\@INC)とかやったら大抵のモジュールはもってこれたみたい)

結果

CGIファイルに実行権限付けてブラウザから確認したらちゃんとリスト表示された!
おぉ。すごい。感動。


psgiの方もplackupで実行してみると見事に見れた。

[4:38@www292]% plackup env.psgi
Plack::Server::Standalone: Accepting connections at http://0:5000/

125.2.97.124 - - [30/ 7/2010 04:38:43] "GET /perl/plack/ HTTP/1.1" 200 1033 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; ja-JP-mac; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8"

おぉ。すごい。
さくらインターネットは5000番ポートが開いてるのですね。)



ということで、cgiからpsgiファイルを実行できました。

LaCoocanでSmart.fmのAPIを使って英単語翻訳

Smart.fmがまだiKnowだった頃に友だちに頼まれて作ったアプリがあり、
それをniftyのLaCoocanで動かしてたので手直ししながらそのまとめ。

流れ

LaCoocanの機能の一つに「メール転送」というのがあって、
取得してあるドメイン(例えばmonm.on.coocan.jp)のメールアドレス(*@monm.on.coocan.jp)に来たメールを、自分の好きなスクリプトに食わせることができるって機能です。

ということで、

  1. 指定したメールアドレスにメールを投げる
  2. メール転送機能を使ってスクリプトに食わせる
  3. スクリプトは与えられたメールから英単語を抜き出しSmart.fmに投げる
  4. Smart.fmで単語の翻訳と、関係する例文を取得する
  5. メールの送信元、もしくは指定されたメールアドレスへ結果を返す

みたいなのを作ってました。
(はじめはgoogle talkのボットにしてたんですけど、プロセス切られちゃうのでメールで。)

できあがり

とりあえず「Smart.fmで単語の翻訳と、関係する例文を取得する」って部分だけ。
monmon/myapp-iknow · GitHub
eg/tr.plにある通り、

MyApp::iKnow->tr('world');

をやると単語と例文の翻訳がTAB区切りで出力されます。


XML::RSS::LibXMLとXML::LibXMLを最初使ってたんですけど、
ライブラリ持ってくのが面倒なのでXML::RSSXML::TreePPにしました。

やってること

MyApp::iKnow->tr()は単語を翻訳するMyApp::iKnow::Itemsと、
例文を翻訳するMyApp::iKnow::Sentencesのsearch()を呼び出してるだけ。


例えばMyApp::iKnow::Sentences->search()は以下のようになってて、

sub search {
    my($class, $word) = @_;
    my $tr_lang = ($word =~ m/[a-zA-Z]+/xms) ? 'ja' : 'en';
    my $base = "http://api.iknow.co.jp";
    my $sentences_uri = URI->new_abs("/sentences/matching/$word.rss", $base);
    $sentences_uri->query_form(
        translation_language => $tr_lang,
        require_translation  => 'true',
    );

    my $file_path = MyApp::iKnow::Cache->get_file_path($sentences_uri);

    my $rss = XML::RSS->new;
    $rss->parsefile($file_path);
    my @res = map {
        +{ 
            en   => __trim($_->{title}),
            ja   => __trim($_->{description}), 
        }
    } @{$rss->{items}}; 

    \@res;
}

http://api.iknow.co.jp/sentences/matching/<検索ワード>.rss」っていうRSSを取得し、
titleとdescription抜き出してるだけです。
何度も同じ単語のRSS取得にいかないようにcacheしたりしてますけど、そんな大したことせず。



という感じで、例えば「perl」で検索すると以下のような感じになります。

% perl -Ilib eg/tr.pl perl
perldoc -f join	関数joinを調べる
perldoc	perldocの使い方の表示
perldoc -f rand	perl組み込み関数を調べる(例:乱数生成rand関数の説明)
perlocution	発語媒介行為
perl -wc hello.pl	文法チェックを行う
perldoc -f localtime	localtime()関数について調べる
perldoc perl	perlの概要表示
perldoc perlfunc	組み込み関数一覧を表示 at eg/tr.pl line 7.

ホントは発音してくれるmp3へのリンクも取得して表示してたんですけど、
なぜかそれが取得できなくなってたので英語と日本語だけに直しました。
(そのためにわざわざxmlRSSの取得を分けたんですけど意味なくなっちゃった)



と、今さらこんなの手直ししても「APIが8/31に公開停止になりますよー」ってメールがこの前来てたんで、
いつ使えなくなっちゃうかわからないんですよね。

第6回Yokohama.pm & Perl Casual見てきた

Gearman Workerを今まで「ジャーマン」と読んでいた僕にとってはとても価値あるカンファレンスでした。
(「ギアマン」って読むのね。ドイツに関係があるのかと思ってたよ。つづり調べ直したらジャーマンはGermanだったよ。)


Perl Casualはカジュアルで楽しいですね。
前回前々回の時期は忙しくてすっかり知らなかったため今日は楽しみにしてました。
知ってる内容でもその人の癖が見れるのでライブコーディングとかあると楽しいです。


あと、YAPC::Asiaのアナウンスがあってもう1年経つのかとちょっと驚いた。
去年の研修は超面白かったのでまた行われるようなら参加したいなと。


それと、iPhoneの話をもう少し聞きたかったけどそういえば今日はPerlのカンファレンスでした。


今回の動画はもう上がっているので動画見るといいです。
Ustream.tv: ユーザー yokohama-pm: 第6回 yokohama.pm & Perl Casual, Recorded on 10/07/23. 会議


以下メモ。

リソース監視ツール・フレームワークCloudForecastの紹介 - id:kazeburo

  • 6月にmixiからlivedoorへ転職
  • スケーラビリティの仕事やってる
CloudForecast
監視の基本
  • 以下2つの監視がある
    • 死活監視
    • リソース監視
死活監視とは
  • 種類
  • 瞬間を監視
  • 異常があればアラート
  • 監視するためのソフトウェア
リソース監視とは
  • 種類
  • 状態を記録し続ける
  • 見える化・グラフ化
  • 監視するためのソフトウェア
    • Cacti,munin,Ganglia
    • CloudForecast
CloudForecast
  • 分散処理、高速動作
    • 大規模環境でも十分に使える
      • livedoorではこれで700台監視している。全部回るのに15-20秒くらい
  • YAML
    • 大規模環境だからといってポチポチポチポチ設定するとなると大変だけど、YAMLでさっとできる
  • グラフ表示用のWebサーバ内蔵
    • リソース監視するのに何でApachephp入れるの?って所から。
  • もちろんPerl
CPAN以外の依存モジュール
  • RRDTool,RRDs.pm
    • インストールめんどい
  • SNMP.pm
    • CPANにあるんだけどバージョンが低い
  • Shirahata(WAF)
    • Web表示用
システム構造
  • SNMPやHTTPでデータを取得し、RRDとSQLiteにデータを保存し、Web用に加工して表示
  • Gearman Worker(ギアマンワーカー)で複数プロセスで動作可能
    • 2000台くらいのサーバでも余裕で監視できるのを目標にしている
インストール
  • CPAN以外のモジュールをどう入れるか
    • apt-get、yumでインストールするのが楽
  • 本体
cpanm -l extlib --installdeps .
設定
  • YAML
    • 設定ファイル(cloudforecast.yaml)とサーバ一覧ファイル(server_list.yaml)がある
    • 両方ともsample.yamlがあるので、それをcpして使う
    • 監視項目ファイル(basic.yaml
      • 何を監視するか(リソース定義)
      • server_list.yamlから呼び出されるファイル
      • 正規表現を使えば柔軟性上がるけど、シンプルにコロンで指定するようにした
リソース定義
  • Basic(CPU,LAV,MEM)、Traffic、Apacheなどなど色々
  • perldocで見れるようにする予定
監視項目のカスタマイズ
起動
  • 巡回デーモンのcloudforecast_radarと、Webサーバのcloudforecast_webがある
  • daemontoolsで起動すると便利だと思う
リソース定義・プラグインの作り方
  • ブログに例が書いてある
  • 必要なもの
    • データ定義
      • どんなデータを保存するか
    • グラフ指定
      • どういうグラフを描画するか
    • データ取得関数
      • どうやってデータを取得するか
  • 作った自作プラグインをどこに格納すれば良いか
    • site-lib配下に入れればpathが通ってるので動く
例の説明
例の説明:プラグイン(モジュール)の作成
  • use CloudForecast::Data -base;すると必要な関数がimportできる
  • データ定義
    • rrdにkeyとデータタイプを指定する
  • データタイプ(以下の2つだけ覚えておけばいい)
    • COUNTER
      • カウンターのように増え続けていく値
      • グラフでは差分を取って表示
      • 例:Traffic
    • GAUGE
      • その瞬間の値
      • グラフではそのままの値が表示
      • 例:LAV
  • グラフ定義
    • グラフの名前とRRDを結びつける
  • データ取得関数
    • BusyとIdleの表示行を取得する関数をperlで書く
TODO/Plan
  • Webインタフェースの改良
  • RRDとSQLiteの組み合わせてチューニング用の情報が出せないか?
  • ドキュメントとテスト
まとめ
  • CloudForecastはPerlユーザに使いやすいリソース監視
  • 個人から大規模まで対応
  • アクティブに開発中

WebアプリケーションエンジニアのためのiPhoneアプリ開発入門 - id:typester

iPhoneアプリ
  • im.kayac.com
  • ドミノピザ
    • Domino's App
  • 100人のメイド
  • 安心レーダー
    • 近日公開
なぜWeb開発者のためのiPhoneアプリ開発?
  • WebAPIとiPhoneアプリの親和性の高さ
  • Objective-CってLLっぽい(Perlっぽい)
  • iPhone持ち歩いてて、そこで自分の作った物が動いてるとたのしい!
WebAPIが必須の条件
  • リモートプッシュ
  • アプリ内課金
必要な技術
HTTP通信
  • NSURLRequest
    • 標準API
    • 面倒。挫折する
  • ASIHTTPRequest
    • NSURLRequestをラップしたもの
  • libcurl
JSONパース
  • JSON Framework
    • stringにJSONValueというメソッドが生える
      • 戻り値は配列だったりハッシュだったり
#impot "JSON.h"
NSObject* obj = [json JSONValue];
  • ハマりどころ
    • nullの存在でハマる
    • NSArrayにnil(Objective-cのnullのこと)は入れられない
      • 配列の終端を表すので途中に入れられない
    • なので、NSNullというクラスが苦肉の作で入っている
      • ただ、こいつは評価すると真なので以下のように確認する
// fooというkeyでなおかつそれがNSNullではない
if (![[obj objectForKey:@"foo"]
         isKindOfClass:[NSNull class]]) {
}
XMLパース
  • JSON使えるならわざわざ使わない方がいいけど、どうしても使いたいなら、
    • NSXMLParser
      • socksのAPIで、すごく使いづらい
    • libxml
お手軽Example
  • 以下2つを組み合わせると最強に楽
  • こんな感じで書ける
// typesterのつぶやきを取得するAPIを叩いて、結果をonCompleteのコールバックに食わせる
[API tweetsFor:@"typester" onComplete:^(API* res) {
    NSLog(@"api response: %@", res.content);
}]
    • APIは自分で作ったclass
// 簡略化してザックリ
+(void)tweetsFor:(NSString*)screen_name
      onComplete:(void (^)(API*))callback {
    // メインスレッド
    dispatch_queue_t mq = dispatch_get_main_queue();
    // デフォルトのプライオリティのスレッド
    dispatch_queue_t q  =
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(q, ^{
        // curlでHTTPリクエスト
        CURL* curl = curl_easy_init();

        // 終わったらコールバック
        dispatch_async(mq, ^{
	    callback(api);
 	});
    });
}
  • dispatch_async使ってスレッド作る
    • GCDのメソッド
      • 第一引数のキューに第二引数で渡したブロックを実行させる
  • この書き方が可能になる前は自分でlibcurl用のスレッドを書かないとメインスレッドが止まってしまって大変だった
GCD
  • 処理を別スレッドに渡して実行だとか、全部の処理が終わってからとか色々できて面白い
    • PerlでいうAnyEventとかCoroに似てる
dispatch_async(queue, ^{
    // ここに処理
});
  • リファレンス見てね
リモートプッシュをPerlからやるためには
  • AnyEvent::APNS
    • AnyEventのデーモンが立ち上がってて、Apple通知サーバと常時接続している
    • WebアプリからJSONRPCでAnyEventデーモンに情報が行き、Appleに伝わりプッシュされる
まとめ

Any::Mooseではじめるオブジェクト指向プログラミング(10min) - id:gfx

Mooseについて
  • PerlOOP用のフレームワーク
    • 高機能
  • MouseはMooseの計量版
  • Any::MooseはMouseまたはMooseのラッパー
    • Mouseをそのまま使うと嫌がる人がいるので
  • 以降「むーす」はAny::Mooseから使うMouseのことで。
PerlOOP
  • 貧弱
  • 組み込み機能は2つだけ
    • データとパッケージを結びつけるbless()
    • データ消滅時に呼び出されるDESTROY()
  • OOPは必要不可欠なのでCPANにはクラスビルダーがたくさんある
というのは過去の話
  • 今はMooseがある
  • Perlの欠点は気にならなくなった
Mooseというクラスビルダー
  • コンストラクタやアクセサを作ってくれる
  • 拡張しやすいイニシャライザ(BUILD)とデストラクタ(DEMOLISH)も用意
  • ロール(またはトレート)によって安全に多重継承もできる
use Any::Moose;
  • use Any::Mooseする
    • use Any::Moose 'X::StrictConstructor'がオススメ
  • hasでメソッド定義
  • no Any::MooseでDSL関数を削除
  • __PACKAGE__->meta->make_immutable()でクラスを変更不能にする
アトリビュート
  • 性質(型)
    • これが便利なので一旦moose使い出したら戻れなくなる
  • 遅延評価
Moose FAQ
  • Mooseは使うべき?
    • 非常に便利なので試すべき
  • Mooseって重い?
    • Mouse軽いよ
  • 依存モジュールは?
    • Mouseは依存してないよ
  • 安定している?
    • クラスビルダーとして使う分には安定している
  • MooseとMouseの互換性は?
    • 違ってたら実装するので教えてください

PerlCasual 初心者向け勉強会:Web APIの基礎 - yusukebe(id:kamawada)

概要
  • Perl初心者向け
  • WebAPIを学びPerlを学ぶ
前提知識
  • Webを支える技術がよくまとまってるので買ってください
    • HTTP,URI,GET/POST,JSON
3つの流れ
  • リクエスト、GET、JSONなどのレスポンスをパース
Twitter Search API
APIを使う上でのチェックポイント
  • リクエストURI
  • サポートするレスポンスフォーマット
  • リクエストのメソッド
    • GET
  • クエリパラメータ
    • 必須やオプション
Webブラウザを使った検証
  • SafariなどのブラウザのアドレスバーにAPIのURL入れれば試せるよ
リクエストURIの構築
  • 日本語などASCII文字以外は使えない
  • URIエスケープしないとダメ
    • URIモジュール使えば勝手にやってくれるよ(以下のような感じにすればよい)
my $query = 'おはよう';
my $uri = URI->new('http://search.twittter.com/search.json');
$uri->query_form(
    q => $query,
)
WebAPIにアクセスする
  • LWP::UserAgentを使用すれば良い
    • HTTP::Requestでリクエスト作って、メソッド指定して投げて、HTTP::Responseで受け取る
結果をパース
  • cpanm JSONでインストール
    • JSON::XSかJSON::PPが入るはず
  • JSONにおける日本語
    • \uXXXXというUnicodeベースのascii文字へのエスケープ
  • おはよう
    • \u304a\u306f\u3088\u3046
JSONモジュール
  • decode_jsonでパースしてあげて、Encodeモジュールで使いたい文字コードにencodeして出力
WebService::Simple
  • これ使うともっと簡単に作れるよ!
まとめ
  • Web API = 「巨人の肩に立つ」ことができるかもしれない
    • アイザックニュートンが言ったかっこいい言葉
  • Web+DB PRESS Vol.58に記事載る
    • 「yusukebeさんの記事面白かったよ」って投稿すると株が上がるのでよろしくお願いします

PerlCasual 初心者向け勉強会:zenra_botのライブコーディング - id:sugyan

  • use strict;書かないとlivedoorに入れない
  • cpanmをインストール
  • Net::Twitterをインストール
  • 使い方はperldoc見ましょう
  • printデバッグで作り始め
  • ARRAYが返ってきてる
  • 後置forで$_して確認
  • HASHが返ってきてますね
  • YAMLでDumpするのが好きなのでuse YAML;で。
  • Dump結果見るとtextで発言が取れるみたい
  • 認証してみましょう
  • config情報をべた書きしたくないので、Config::Pitをuseしましょう
  • cpanm Config::Pitでインストール
  • pit_get()使って別の場所に入れた情報を$configに入れて認証に使える
ここから全裸
  • Yahoo!に日本語解析のAPIがあるので使う
  • WebService::Simpleを使ってみる
  • Yahoo!のページに使い方があるのでその通りにWebService::Simpleに入れる
    • parse_referenceでレスポンスをパース
  • sub zenrizeを作成して作ったルーチンを詰め込む
まとめ
  • こんな感じで簡単に全裸bot作れるよ

HTML5時代的位置情報 - id:yappo

  • ライブドアでロケタッチがリリースされたので位置情報の話
位置情報の取得
  • Geolocation APIで取得
    • モダンなブラウザのJavaScriptで実行できる
      • IE6は死んじゃえばいい
おや?実際に取得してみるとライブドアの地図情報が違う
  • Geolocation APIlivedoor地図情報の測地系が違う
  • 地球は丸くない
    • 楕円なんで、それぞれの国の事情やらで測量方法が違う
    • 地域によっては海面の高さも変わるので
何が違うか
Perl測地系の変換
  • Geo::Coordinates::Converter
    • フォーマット変換
    • プラガブルなんで、測地系やフォーマットを追加可能
位置情報をどう使う?
  • どの市町村に含まれているか?など
    • この辺はカジュアルじゃないので詳しくはWeb+DB PRESS Vol.57へ。
  • iAreaマッピングがそれなりに使える
住所から緯度経度は?その逆は?
  • id:miyagawaさんのGeo::Coder::Google
  • googleMapsのAPIで位置情報から住所引くことも可能
まとめ
  • Perlで手軽に位置情報を扱う準備はある

ライトニングトーク

みんな大好き Encode - id:xaicron
  • DeNAで働いてる
最初に
  • decodeしていじってencode
検索するとよく見るやつ
  • この辺のはレガシーコードなので忘れてください
    • require jcode.pl;
    • use encodeing 'euc-jp';
    • use open IN => ':encoding(euc-jp)'
    • (use Jcode)
use Encode;
  • バイト文字列をPerlの内部文字列(flagged utf8)に変換/またはその逆
  • octet baseじゃなくcharacter baseのコーディングができる
  • Core Module
  • メンテナがid:dankogai
  • できれば5.8.8以上を使って欲しい
  • 外部から来たものは全てdecodeする
    • 引数、STDIN、DB、HTTP
  • 外部に出力するものは全てencodeする
    • STDOUT/STDERR、ファイル書き込み、DBへの書き込み、HTMLへのレンダリング
decode/encode
  • decode
    • 「任意の」バイト文字列を内部文字列へ変換
  • encode
    • decodeの逆
内部文字列だとどうなる?
  • 一文字がプログラム的に一文字として扱われる
    • lengthで文字数が返ってくる
    • 正規表現とかsubstrとかsplitでウマー
use strict fast - id:piarra
  • Hikaku.comのCTO
  • MD5を暗算でできる人で有名
    • と言う嘘をつく人で有名
  • use strict;
    • 重くない?
  • strict::fastつくった
package strict::fast;

sub import {
    $^H |= 0x000602;
}

1;
    • 6%速くなった!
  • でも、実用的にはuse common::sense;使った方がいいです
use utf8;
use strict; # no 'refs'
use warnings; 
  • 本当の本題。
    • use strict;を速くする→速く打てばいい
      • 略すとust
  • ustrict.tvを作った!
夏コミ新刊Perl同人誌の宣伝 - まかまか(id:makamaka_at_donzoko)
  • Perlの同人誌を出している
    • 去年Acmeの同人誌出した
  • 宣伝
    • Acme大全2010作った
      • 364のAcmeを解説
      • 今年は用語集を付けた。プログラミングPerlと初めてのPerl足した分くらいの。
      • もしかしたらYAPC::Asiaにまた出すかも
  • どんぞこ楽屋に目次がある
    • 例えば、モジュールのインストール
      • cpanm、local::lib、perlbrewについて紹介してある

File::Whichで複数インストールされてるものをwhichするとき

本編に関係ないけどwhichはインストール済みの全てのpath返すのね。/usr/bin/memcachedと/usr/local/bin/memcachedがインストールされてたためにエラーになってしまいしばらくハマってた

自己レス。
Proc::Guard - サーバープロセスを起動するライブラリ - blog.64p.orgを見て、真似して、実行してみたら上手くいかなくて、
netstatしてみるとmemcachedのデフォルトポートの11211がLISTENしてて「あれれ?」となり、
しばらくハマってしまっていた。



で、memcachedを確認してみたら上記の通り/usr/bin/memcachedと/usr/local/bin/memcachedが存在してて、

$VAR1 = [
          '/usr/local/bin/memcached',
          '/usr/bin/memcached',
          '-p',
          10001
        ];

こんな感じでProc::Guardに渡しちゃってたみたい。



File::Whichはscalarで受け取ると初めの一つだけ返すみたいだから、

    my $proc = proc_guard(which('memcached'), '-p', $port); # プロセスを起動する

のwhichをscalarにして、

    my $proc = proc_guard(scalar which('memcached'), '-p', $port); # プロセスを起動する

に書き換えたら上手くいきました。



こういうサンプルコードのコピペ程度でハマっちゃうからダメなんだろうなぁ。