第6回Yokohama.pm & Perl Casual見てきた
Gearman Workerを今まで「ジャーマン」と読んでいた僕にとってはとても価値あるカンファレンスでした。
(「ギアマン」って読むのね。ドイツに関係があるのかと思ってたよ。つづり調べ直したらジャーマンはGermanだったよ。)
Perl Casualはカジュアルで楽しいですね。
前回前々回の時期は忙しくてすっかり知らなかったため今日は楽しみにしてました。
知ってる内容でもその人の癖が見れるのでライブコーディングとかあると楽しいです。
あと、YAPC::Asiaのアナウンスがあってもう1年経つのかとちょっと驚いた。
去年の研修は超面白かったのでまた行われるようなら参加したいなと。
- YAPC::Asia2009の特別研修「Moose入門、モダーンなオブジェクト指向システム」が超良かった! - こんにちは!こんにちは!monmonといいます!
- YAPC::Asia2009の特別研修「Perl, Unicode, and AJAX」は自由な感じの研修でした - こんにちは!こんにちは!monmonといいます!
それと、iPhoneの話をもう少し聞きたかったけどそういえば今日はPerlのカンファレンスでした。
今回の動画はもう上がっているので動画見るといいです。
Ustream.tv: ユーザー yokohama-pm: 第6回 yokohama.pm & Perl Casual, Recorded on 10/07/23. 会議
以下メモ。
リソース監視ツール・フレームワークCloudForecastの紹介 - id:kazeburo
CloudForecast
- リソース監視
- mixiの監視システムが元
- perl,rrdtoolが使えるsysadminの人だったら使いやすい by id:tokuhirom
監視の基本
- 以下2つの監視がある
- 死活監視
- リソース監視
リソース監視とは
CloudForecast
システム構造
インストール
- CPAN以外のモジュールをどう入れるか
- apt-get、yumでインストールするのが楽
- 本体
- gitから持ってくる
- 依存モジュールについてはcpanmでextlibに入れればOK
cpanm -l extlib --installdeps .
設定
リソース定義
- Basic(CPU,LAV,MEM)、Traffic、Apacheなどなど色々
- perldocで見れるようにする予定
監視項目のカスタマイズ
- ブログに書いてあります
起動
- 巡回デーモンのcloudforecast_radarと、Webサーバのcloudforecast_webがある
- daemontoolsで起動すると便利だと思う
リソース定義・プラグインの作り方
- ブログに例が書いてある
- 必要なもの
- データ定義
- どんなデータを保存するか
- グラフ指定
- どういうグラフを描画するか
- データ取得関数
- どうやってデータを取得するか
- データ定義
- 作った自作プラグインをどこに格納すれば良いか
- site-lib配下に入れればpathが通ってるので動く
例の説明
- 概要
- 以下に出てくるgearman-startter.plでBusyWorkersとIdleWorkersを取得し、グラフ化する
- 監視目的
- リソースの把握
- プロセス数の最適化
例の説明:プラグイン(モジュール)の作成
- use CloudForecast::Data -base;すると必要な関数がimportできる
- データ定義
- rrdにkeyとデータタイプを指定する
- データタイプ(以下の2つだけ覚えておけばいい)
- COUNTER
- カウンターのように増え続けていく値
- グラフでは差分を取って表示
- 例:Traffic
- GAUGE
- その瞬間の値
- グラフではそのままの値が表示
- 例:LAV
- COUNTER
- グラフ定義
- グラフの名前とRRDを結びつける
- データ取得関数
- BusyとIdleの表示行を取得する関数をperlで書く
TODO/Plan
- Webインタフェースの改良
- RRDとSQLiteの組み合わせてチューニング用の情報が出せないか?
- ドキュメントとテスト
まとめ
- CloudForecastはPerlユーザに使いやすいリソース監視
- 個人から大規模まで対応
- アクティブに開発中
WebアプリケーションエンジニアのためのiPhoneアプリ開発入門 - id:typester
- 面白法人カヤックで働いてる
なぜWeb開発者のためのiPhoneアプリ開発?
- WebAPIとiPhoneアプリの親和性の高さ
- Objective-CってLLっぽい(Perlっぽい)
- iPhone持ち歩いてて、そこで自分の作った物が動いてるとたのしい!
WebAPIが必須の条件
- リモートプッシュ
- アプリ内課金
HTTP通信
- NSURLRequest
- 標準API
- 面倒。挫折する
- ASIHTTPRequest
- NSURLRequestをラップしたもの
- libcurl
- Objective-Cはcが使えるので
JSONパース
- JSON Framework
- stringにJSONValueというメソッドが生える
- 戻り値は配列だったりハッシュだったり
- 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]]) { }
お手軽Example
- 以下2つを組み合わせると最強に楽
- libcurl+JSONが楽
- Blocks構文+GCD(Grand Central Dispatch)の存在
- 無名関数みたいなもの
- こんな感じで書ける
// 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のメソッド
- 第一引数のキューに第二引数で渡したブロックを実行させる
- GCDのメソッド
- この書き方が可能になる前は自分でlibcurl用のスレッドを書かないとメインスレッドが止まってしまって大変だった
Blocks構文
GCD
- 処理を別スレッドに渡して実行だとか、全部の処理が終わってからとか色々できて面白い
- PerlでいうAnyEventとかCoroに似てる
dispatch_async(queue, ^{ // ここに処理 });
- リファレンス見てね
リモートプッシュをPerlからやるためには
Any::Mooseではじめるオブジェクト指向プログラミング(10min) - id:gfx
- 筑波大学で学生
- Mouseのメンテナ
Mooseについて
Mooseというクラスビルダー
- コンストラクタやアクセサを作ってくれる
- 拡張しやすいイニシャライザ(BUILD)とデストラクタ(DEMOLISH)も用意
- ロール(またはトレート)によって安全に多重継承もできる
use Any::Moose;
アトリビュート
- 性質(型)
- これが便利なので一旦moose使い出したら戻れなくなる
- 遅延評価
PerlCasual 初心者向け勉強会:Web APIの基礎 - yusukebe(id:kamawada)
前提知識
- Webを支える技術がよくまとまってるので買ってください
- HTTP,URI,GET/POST,JSON
3つの流れ
- リクエスト、GET、JSONなどのレスポンスをパース
Twitter Search API
- ログイン必要ないTwitterのつぶやき検索取得API
- http://dev.twitter.com/doc/get/search
- ドキュメントを読むことは重要
リクエスト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見ましょう
- perldoc Net::Twitter
- 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は死んじゃえばいい
- モダンなブラウザのJavaScriptで実行できる
おや?実際に取得してみるとライブドアの地図情報が違う
位置情報をどう使う?
- どの市町村に含まれているか?など
- この辺はカジュアルじゃないので詳しくはWeb+DB PRESS Vol.57へ。
- iAreaマッピングがそれなりに使える
- CPANもある
住所から緯度経度は?その逆は?
- id:miyagawaさんのGeo::Coder::Google
- googleMapsのAPIで位置情報から住所引くことも可能
まとめ
- Perlで手軽に位置情報を扱う準備はある
ライトニングトーク
みんな大好き Encode - id:xaicron
- DeNAで働いてる
最初に
- decodeしていじってencode
検索するとよく見るやつ
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
- use strict;を速くする→速く打てばいい
- ustrict.tvを作った!
- http://ustrict.tv/
- タイピングしてtwitterに投稿できる
- http://ustrict.tv/