第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について紹介してある