読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

今日はYokohama.pmの日です。

本日18:30から行われるYokohama.pm #7へ参加する予定です。

Sphinx + blockdiagで始めるドキュメント生活 / @tk0miyaさん

  • 資料は後でTweet予定
  • ドキュメントの種類
    • 納品物としてのドキュメント = お客さんのもの
    • 設計/運用のためのドキュメント = 自分たちのもの
    • 後者が足りない → 辛い現実
  • ドキュメントのメンテ
    • テーブル定義、機能、画面キャプチャがドキュメントに更新されない
    • メンテが必要 → Lightweight が大事
  • Lightweight なドキュメント
    • Sphinex、Wiki、ソースに書く、テンプレ化
  • Sphinx
    • reST形式で書く→XMLLaTeX、PDF、HTMLなどに変換
    • Python
    • reST形式 → 「====」とか「----」とか「*list」みたいなマーキング
    • makeでビルド
    • コードハイライト機能 → Perl, C++, Python, nginx
    • 日本語ドキュメント
  • 他のツールと比べると?
    • Word → 複数人で編集は不向き
    • Excel → 同上
    • POD → VCSを使えば複数人で編集できる
    • Sphinx → 同上
  • Sphinxの利用例
  • Excelよりblockdiag*1Excelは追加削除が面倒
  • blockdiagはテキストを図に変更する
    • blockdiag, seqdiag, actdiag, nwdiag
diagram {
  A -> B -> C;
  B -> D;
}
  • 質疑応答
    • Q. blockdiag で書式を間違えるとどうなる?
    • A. 例外は発生する。もう少しわかりやすいメッセージにする予定

HandlerSocket - 初台旅行土産話 / nekokakさん

  • 負荷対策
    • ベンチマークが重要
    • ORMを使わない → オブジェクト生成コスト削減
    • 既存WAFは使わない → 要件に特化して無駄を排除
  • ボトルネックはデータベース → memcachedの利用
    • ロジックの複雑化 → キャッシュや、更新など → メンテナンスコストの増大
  • DBがもっと高速ならいいのでは → HandlerSocket
    • InnoDBなどストレージエンジンへの非SQLインタフェース
    • TCP/IPで独自プロトコルで通信
    • 単純なCRUD処理を高速に
    • MySQLとデータを共有 → データ管理が簡単
    • 単純、高速な部分だけ置き換え可能
  • 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
    • ORM風のラッパー
  • 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により、ファイル名によってノードが決まる → ディスクキャッシュの有効利用

30万DLされたスマートフォンアプリのバックエンドサーバをAnyEventで書いた話 / @shinpei_cmykさん

  • 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 で設定できる
  • 質疑応答

Lightning Talks

Donburi / kanさん
  • IRCのチャンネルにメッセージの投稿
    • App::Nakanobuみたいなの
    • WEBからチャンネルリストの編集可能
    • AnyEvent::IRC::Client + Twiggy
  • デモ
  • 社内のAlert通知に使える。便利。
  • 今後 → CPANへのリリース, Nakanobu互換API, ボット用のプラグイン
5分で始めるdotcloud / xaicronさん
  • dotcloud
    • GAEっぽいクラウドサービス
    • python。βだけど無料。
    • Plackが動く。miyagawaさんが移った。
  • easy_install で入れて、dotcloud createするだけ
  • app.psgi を用意して、push
  • Makefile.PL に色々書くとインストールされる(inc/ も)
  • __DATA__セクションとかは怒られるかも (uWSGI 上で実行されるので)*3
もっとdotcloud / @myfinderさん
  • memcachedMySQL、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は使える
  • 運営は複数メンバー。釧路も。
  • 内容にはもう少し刺激が欲しい。初心者中級者向け。
  • 飯がうまい → 自費で行くのもいいのでは?
ナカマップの何か / maaashさん
  • ナカマップ?
perlhint.com / @iizukayacさん
  • 書き方がたくさんある。慣習がたくさんある。
  • $| ググれない。(マニュアルをみればよい)
  • perlhint.comPPIモジュールでソースを構文解析し、あのテーションをつける
  • パターンを編集可能。開発者募集。
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の個数で分割
    • ばらばらの個数の配列を、確実に特定の件数にしたい

お知らせ

  • Perl CPANモジュールガイド」 / tomi-ruさん
  • ライブドア技術部会 / @ibuchoさん
    • 勉強会やイベントのお手伝いをします
    • 会場、集客など。
    • Yokohama.pm が最初の事例*4

*1:Python WorkshopのLTも参照

*2:Thanks to @punytan

*3:次のバージョンでは直るとのこと。

*4:素晴らしい会場をありがとうございました!