本日18:30から行われるYokohama.pm #7へ参加する予定です。
- 資料は後でTweet予定
- ドキュメントの種類
- 納品物としてのドキュメント = お客さんのもの
- 設計/運用のためのドキュメント = 自分たちのもの
- 後者が足りない → 辛い現実
- ドキュメントのメンテ
- テーブル定義、機能、画面キャプチャがドキュメントに更新されない
- メンテが必要 → Lightweight が大事
- Lightweight なドキュメント
- Sphinex、Wiki、ソースに書く、テンプレ化
- Sphinx
- reST形式で書く→XMLやLaTeX、PDF、HTMLなどに変換
- Python製
- reST形式 → 「====」とか「----」とか「*list」みたいなマーキング
- makeでビルド
- コードハイライト機能 → Perl, C++, Python, nginx
- 日本語ドキュメント
- 他のツールと比べると?
- Sphinxの利用例
- Excelよりblockdiag*1 → Excelは追加削除が面倒
- blockdiagはテキストを図に変更する
- blockdiag, seqdiag, actdiag, nwdiag
diagram {
A -> B -> C;
B -> D;
}
-
- 質疑応答
- Q. blockdiag で書式を間違えるとどうなる?
- A. 例外は発生する。もう少しわかりやすいメッセージにする予定
HandlerSocket - 初台旅行土産話 / nekokakさん
- 負荷対策
- ベンチマークが重要
- ORMを使わない → オブジェクト生成コスト削減
- 既存WAFは使わない → 要件に特化して無駄を排除
- ボトルネックはデータベース → memcachedの利用
- ロジックの複雑化 → キャッシュや、更新など → メンテナンスコストの増大
- DBがもっと高速ならいいのでは → HandlerSocket
- libhsclient
- クライアントのlibmysql に対応する
- SQLのパースなどがない → パフォーマンスは数倍〜数10倍
- リクエストの集約実行 → CPU、ディスクIO減
- 独自プロトコル → 通信コスト減
- Perlでのベンチマーク → 5倍以上の性能差
- トランザクション不要の更新 → MySQLの1000qps に対して HSは 30000qps
- 通信の最適化 → MySQLの80 + 327byteに対し、HSは 9 + 14byte
- Perl のモジュールは? → Net::HandlerSocket (CPANには上がってない)
- HandlerSocketプロトコル寄りなので、アプリレイヤでは使いにくい
- 戻りも単一のArray-ref → 複数レコードの取得は面倒
- open_index でインデックスを開き、execute_single
- Net::HandlerSocket::Simple
- HandlerSocketの今後の展望
- MySQL 5.6にmemchachedプロトコルが乗るけど? → いまのとこ無視
- 提案すれば、受け入れてもらえるかも
- 例えば、「セッション管理をMySQLでやりたい」
Operation Oriented Web Applications / kazeburoさん
Log::Minimal
- ログがなくて困ることが多い → アプリケーションエンジニアにログを吐いて欲しい
- 適切なログとは?
- 時間、重要度(CRITICAL, WARN, INFO, DEBUG)、場所(トレース)、データ
- Log::Minimal
- warnf, critf, infoff, debugff
- オブジェクトの生成は不要
- $AUTODUMP → 自動でDumper
- $PRINTや$LOG_LEVEL、$TRACE_LEVEL : カスタマイズ
- Log::Minimalの設計思想
- 最近はWAFとModelは疎結合なことが多い
- LogはWAFと密結合なことが多い → 粗結合にする
- Middlewareにて、WAFとModelが吐いたログを集める
- Palck::Middleware::Log::Minimal
DBIx::Sunny
- DBIx::Sunny → DBIのサブクラス。Amon2::DBI を勝手にforkしたもの。
- DBIx::Sunny::Schema → SQLクラスのベースクラス
- DBIx::Sunny
- DBIの設定を自動設定 → AutoInactiveDestroy など
- SQLコメントに実行元情報を追加
- DBIx::TransactionManager組み込み
- last_insert_id (無引数で呼び出し可能)
- ショートカット類 : select_one, select_row, select_all, query など
- DBI->connect の RootClass によってDBIx::Sunny を使うこともできる
- ただし、DBIx::Sunny::db->connect の呼び出し順が違ったりするので注意
- DBIx::Sunny::Schema
- ORMはチューニングが出来ない
- でも、SQLが散らばるのはまずい
- SQLをまとめたクラスを書きやすく
- __PACKAGE__-<クエリタイプ('メソッド名', 引数名 => 型/制約 ..., クエリ)
- readonly 属性で書き込み不可にも
GreenBuckets
- 特徴
- MogileFSのような分散ObjectStorage → WEBサービスの画像保存場所。HTTPアクセス。
- バケット単位で操作可能
- cpanmでインストール完了
- 素のMySQL
- データが小さい → 数億エントリの管理が可能
- 構成要素
- Dispatcher, Job Worker, MySQL
- PUT 時は2サーバにだけ保存し、JobWorkerが残り1サーバへコピーをする
- 使ってるモジュール Digest::MurmurHash
- 1方向ハッシュ関数。32bit UINTを返す。高速。
- この値でノードアクセス順を決める
- fid(MurmurHash) + bucket_id でMySQLへ保存 → varcharに比べると圧倒的に小さい
- MurmurHashにより、ファイル名によってノードが決まる → ディスクキャッシュの有効利用
- TekuHub → (1)OSに依存せず (2)離れた人と (3)リアルタイムで (4)一緒にゲームを
- 通信の方法をどう提供するか → P2Pではなく、C/S型。サーバはAnyEventで。
- C10K問題、プロセス間通信 → Erlang? → 挫折 → AnyEvent (I/O多重化、イベントループ)
- AnyEventの問題 → 1プロセスだけではスケールしない
- routing server を置く。nginx + Starman で
- Messageing Serverを増やしたら、 routing serverへ
- Messaging Server
- AE::Socket → tcp_server 便利
- AE::Handle → push_write でバッファリング
- AE::HTTP → ノンブロッキングで認証サーバへアクセス
- AE::MessagePack → 行指向より柔軟。JSONより小さい。
- 懸念事項 → 速度、メモリ消費量、コネクション数
- →ボトルネックは帯域だった(10Mbpsの回線)
- 60万セッション/1台。
- 並列コネクション数は3000
- 無問題! Perlで十分。CPANはすばらしい。
- ハマりどころ → 1プロセスでopenできるファイルディスクリプタの制限(1024)
- /etc/security/limits.conf で設定できる
- 質疑応答
- Q. メモリリークは?
- A. ハマった。
Util::Scalar*2Scalar::Util::weaken などで対処
Lightning Talks
Donburi / kanさん
- IRCのチャンネルにメッセージの投稿
- App::Nakanobuみたいなの
- WEBからチャンネルリストの編集可能
- AnyEvent::IRC::Client + Twiggy
- デモ
- 社内のAlert通知に使える。便利。
- 今後 → CPANへのリリース, Nakanobu互換API, ボット用のプラグイン
5分で始めるdotcloud / xaicronさん
- dotcloud
- easy_install で入れて、dotcloud createするだけ
- app.psgi を用意して、push
- Makefile.PL に色々書くとインストールされる(inc/ も)
- __DATA__セクションとかは怒られるかも (uWSGI 上で実行されるので)*3
もっとdotcloud / @myfinderさん
- memcachedやMySQL、handlersocket, q4m
- dotcloude → sudo できない ubuntu
- shellは使える。~/local にぶっこむ
- .bashrc とかでLD_LIBRARY_PATHやらPATHやら
- libevent, ncursesを入れる
- --prefix していして make, make install するだけ
- memchached を入れる → 同上
- MySQL::Sandbox を利用 → sandbox ができずセグフォ。今後もチャレンジ。
Hokkaido.pmに行ってきた話 / yusukebeさん
- 3ヶ月前の旅行の話
- JPAから飛行機代。飛行機は早くとった方がいい(早割)。
- charsbarさんとホテルが一緒。
- 会場 → 札幌産業振興センターで9時から
- charsbarさんのハンズオン → 部屋一杯。Ruby+JS。
- 高校生1年生2名。JSONやLWPは使える
- 運営は複数メンバー。釧路も。
- 内容にはもう少し刺激が欲しい。初心者中級者向け。
- 飯がうまい → 自費で行くのもいいのでは?
perlhint.com / @iizukayacさん
- 書き方がたくさんある。慣習がたくさんある。
- $| ググれない。(マニュアルをみればよい)
- perlhint.com → PPIモジュールでソースを構文解析し、あのテーションをつける
- パターンを編集可能。開発者募集。
There was more than one way to #paste it / bayashi_netさん
- paste.la
- 普段使うエディタと似た感じ
- ハイライト。行ハイライトが大変だった
- (なぜか)すでに海外の方も利用している
- エンジニアの十得ナイフ
- Baya
- オレオレフレームワーク → 自由に機能追加できる
- 色んなWAFからpaste すればできる
Latest Mini Modules / zigorouさん
- KeyedMutex::Memcached
- KeyedMutex → 複数プロセスのキー毎のロック。専用のdaemonが必要
- Cache::Memcached::Fast に依存して自前でやった方が管理が楽
- trialパラメータ → ロックの取得をチャレンジする回数
- SQLレベルでロックできないトランザクションなどで利用
- Test::Mock::Guard
- Iterator::GroupedRange
- List::MoreUtils::part → 配列をmaxの個数で分割
- ばらばらの個数の配列を、確実に特定の件数にしたい