2010/11/28

sedとperlで置換処理をするとファイルのownerが変更される

HTMLの置換処理をしていたときに,全ファイルのownerが変更されていたので気になって調べたのでメモ.

実行したコマンド

$ find . -type f -name "*.html" | xargs perl -i -pe 's/aaa/bbb/g'

perlをsedに置き換えても同様の現象が起きたので,内部で何が起きているのかstraceで確かめてみた

perlの場合

下記コマンドを実行して,perl-outの中身を確認

$ sudo strace -o perl-out perl -i -pe 's/aaa/bbb/' a.txt 
open("a.txt", O_RDONLY|O_LARGEFILE)     = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbf96cae8) = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(3, 0, [0], SEEK_CUR)            = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
unlink("a.txt")                         = 0
open("a.txt", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbf96cae8) = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(4, 0, [0], SEEK_CUR)            = 0
fstat64(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fcntl64(4, F_SETFD, FD_CLOEXEC)         = 0
fstat64(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fchmod(4, 0100644)                      = 0
fchown32(4, 1000, 1000)                 = 0
read(3, "ddd\nbbb\nccc\n", 4096)        = 12
read(3, "", 4096)                       = 0
write(4, "ddd\nbbb\nccc\n", 12)         = 12
close(4)                                = 0
close(3)                                = 0
exit_group(0)                           = ?
  1. a.txtをO_RDONLYでopen (fd=3)
  2. a.txtをunlink
  3. a.txtを今度はO_WRONLYでopen (fd=4)
  4. fd=3のa.txtからreadして,fd=4のa.txtに書き込み
  5. fd=4, fd=3をclose

2でunlinkして,同じ名前のファイルを再度作成しているのでownerがかわる模様

sedの場合

こんな感じのコマンドを実行して

$ sudo strace -e trace=open,close,rename,write,read -o sed-out sed -i 's/aaa/ddd/' a.txt

set-outに吐き出されたログを確認

open("a.txt", O_RDONLY|O_LARGEFILE)     = 3 
open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 4 
read(4, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 337 
read(4, "", 1024)                       = 0 
close(4)                                = 0 
open("./sedwfohhg", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4 
read(3, "ddd\nbbb\nccc\n", 4096)        = 12
write(4, "ddd\n", 4)                    = 4 
write(4, "bbb\n", 4)                    = 4 
write(4, "ccc\n", 4)                    = 4 
read(3, "", 4096)                       = 0 
close(3)                                = 0 
close(4)                                = 0 
rename("./sedwfohhg", "a.txt")          = 0 
close(1)                                = 0 
close(2)                                = 0 
  1. a.txtをopen
  2. 一時ファイルとして./sedwfohhgをopen
  3. a.txtをreadして,中身を./sedwfohhgにwrite
  4. a.txtをclose
  5. ./sedwfohhgをa.txtにrename

renameしちゃっているのでownerが変わることになる

2010/11/21

Hokkaido.pm #3の感想

スタッフとスピーカー,参加者の皆様,お疲れ様でした.
初心者向けと銘打ったおかげか大変盛況で,今後もこれが続くとよいな思っております.

とりあえず箇条書きでざっくりと
  1. Perlのことを誰に聞けばいいかわからない
  2. Perl Mongerは怖そう 
  3. 初心者向けじゃないと来なかった
  4. 他の言語経験者向けの本ってあるのか
1~3は今後もHokkaido.pmの活動を続けていけば解決してくれるんじゃないかと楽観的に考えてます.

4はPerlクイックリファレンスが良さそうだけど,実際に中身を見たことがない.2000年に出版なんで今だとちょっと内容が古いんじゃなかろうか.
プログラミング初心者には初めてのPerlでいいだろうけど,他言語の経験者にはまどろっこしい気がして勧めづらい

後は私のトークで使ったスライド貼っておきます.

2010/10/24

libnotifyでTwitterのTimelineをデスクトップに通知

最近ときどきUbuntuの入ったノートPCを使っていて,Twitterの投稿がデスクトップに通知されるとうれしいなと思って(何番煎じかわからないが探すのがめんどくさかった)作ってみた.
  1. aptでlibnotifyをinstall
  2. OAuthを利用するためにdev.twitter.comで自分用アプリを適当に登録する
  3. AnyEvent::Twitter::Stream, Gtk2::Notifyをcpanm等でinstall
  4. stream2libnotify.plを実行!
stream2libnotify.pl

2010/10/17

YAPC::Asia Tokyo 2010 二日目

二日目もうp

Web APIのすすめ

自己紹介

  • Yuji Shimada
  • DeNA
  • xaicron

Web APIの例

  • public
    • Google Map
  • 認証
    • twitter
  • 内部向け

Publicなもの

  • 認証が必要ないものは公開しづらい
    • アクセス数が読めない
    • 大手はできる

認証が必要なもの

  • ユーザ登録が必要
  • AccessTokenをもらう
  • ユーザ数からアクセスが予想できる
  • BANできる

内部向け

  • 単一ドメイン
  • ユーザが自分で使わない

Web APIについて

  • Web API は速さが必要
  • 遅くなるとアクセスが下がるので内部向けも速度は重要
  • yusukebe 「使える」Web API はでそろっているのでマッシュアップは詰んだ
  • 何が流行るかわからないのでとりあえず作る!

高速なWeb APIの作り方

既存WAFを使わない

  • 問題が起こったときに内部構造がわからないとだめ
  • Plackがあるので ore ore WAF を作ればいい

WAFの構造

  • Web API はURL:機能は1:1がほとんど
  • Catalyst ディスパッチャしか使っていない
  • 無駄機能を削ぎ落とす
  • ViewらしいViewがない
    • JSONがあれば幸せ
    • XML, YAMLを返しても誰もうれしくない

ここまでのまとめ

  • Plack, Router::Simple, JSON
  • ore ore WAF を書いてしまえばいい

実践編

  • Dispatcherの全体で占める実行時間の割合は低い
    • ここでがんばる必要はない
  • method呼び出しを減らす
    • Devel::NYTProfを使ってから減らすmmethodを選ぶ
  • Objectの生成を減らすのが有効
    • ORMがオブジェクトを生成するので,使わない
    • 生のDBIはいやだ
    • DBIx::Connector, DBIx::DBHResolver, DBIの順にラップ
    • DBIx::Connector DB接続を局所化
  • Object::Containerでsingletonにする
    • preloadオプションがついたのでこれを使うといいかも
    • patchを書いたのはxaicronさん

運用編

  • 次のセッションを聞いてね

まとめ

  • Amon2を読むといい
  • 新しいものを追求すると楽しい
  • ore ore WAFを書くのは怖くない

nginx & Perl

自己紹介

  • fujiwara

about nginx

  • ロシア製
  • 英語のwikiあり
  • だんだん使われるサイトが増えてきた
  • Architecture
    • multi processes + non blocking IO
    • 1 master, x workers

nginx module

  • Upstream
    • mod_proxy_blancer
  • memcached
    • キャッシュにmemcachedを使う
  • empty gif
    • 1x1 gif
  • X-Accel-Redirect
    • X-Sendfile
  • Rewrite
    • mod_rewriteより見やすい
    • PerlっぽいSyntax

embeded perl

  • connfigureで--with_http_perl
  • mod_perlぽいもの
    • accept-encodingで振り分け
    • Imlib2で画像を小さくする
    • HMAC_SHA1
  • blockingする処理は書いては駄目
  • sleepだけはasync.使いどころは不明
  • 組み込んでも誤差程度のベンチ
  • 有効にすると1割減
  • Test::Nginx(CPAN)にある

with Plack/PSGI servers

  • Reverse Proxy
    • P::M::ReverseProxy
  • topディレクトリじゃない場合
    • rewrite /^app(.*) $1 break;
    • plack側はUrlMapをやる
  • CGIは動かせないのでPlack::App::CGIBinを使う

バウンスメール解析システム BounceHammerの紹介

自己紹介

  • azumakyuniyuki
  • サーバ管理者 -

前置き

  • バウンスメールの処理は結構めんどくさい
  • BounceHammerでできるよ
    • 解析したJSON, YANL, CSVで出力可能

BounceHammer

  • バウンスメール解析システム
  • CLIツール
  • Perl
  • 配信機能はないo

バウンスメールについて

  • From
    • Postmaster
    • MailerDaemon
  • Subject
    • エラーっぽいことを英語でかいてある

できること

  • エラー理由特定
  • あて先分類
  • DBに蓄積
  • 解析したJSON, YANL, CSVで出力可能

エラー理由

  • あて先不明
  • ドメイン指定拒否
  • メールボックス一杯
  • メールが大きすぎる
  • セキュリティ的なエラー

役立つ場面

  • 一般的なMTAで配信
    • 特別なMTAだと処理できないかも

対象者

  • コンテンツプロバイダ
  • メールマガジンスタンド
  • メルマガ配信している人
  • バウンス処理をしていない人

放置されると困ること

  • 携帯宛はブロックされる
  • 有効配信数がわからない
  • 遅延がひどい
  • 遅延で配信に時間がかかる

バウンス処理はやるべき

  • 配信数が少なくてもやる
  • 1通でもやる

処理すると

  • バウンスの理由が正確にわかる
  • バウンスの記録を構造化して保存
  • ウェブ管理画面でアドレス管理
  • メール配信の合理化と健全化
  • 自前でバウンス処理実装不必要

インストール

  • 手順通りやればOK

解析済みデータの利用

  • CSV, YAML. JSON
  • MTAでバウンス照合
  • 配信プログラムで照合

動かす

  • mbox || Maildirを引数に
  • STDINからも読める(/etc/aliases)
  • 解析速度

  • mbox 500通/秒

  • Maildir 200通/秒

出力コマンド

  • datadumperというコマンド
  • 携帯だけとか条件指定できる

MTAと強調させる

  • YAMLがでるので適当に処理

ウェブサイトに組み込む

  • HTTPベースのAPIを使う
  • ユーザ毎のページに状態を表示

HTTP API

  • readのみ

今後

  • 2.6.0でエラーの理由を+=4
  • なるべく国産モジュールを使いたい
  • ORMは国産化完了 Skinny
  • CGI::Application::を何かに変更
  • APIで書き込み可能にする

YATT Yet Another Template Toolkit, Designed for WebDesigners

自己紹介

  • h小林
  • HKOBA CPAN
  • @hkoba
  • Perl/Tkの日本語化

YATT, What?

  • CPANにあり
  • 顧客のみ使ってる
  • 実績は2年程度

ガラパゴス

  • 振るカスタムのネットアンケート屋
  • MSワードで入稿
  • 作成2週間 使用1週間
  • 素人を戦力化しなくては生きていけない

戦力

  • プログラマ兼サーバ管理者 1人
  • テンプレートデザイナ 7人
  • 多少プログラミングっぽい感じでもOK

Why New Tempalte System

  • プログラマの視点で既存のモジュールは作られている
  • ページの追加もプログラマが必要
  • HTMLとして汚い

YATTのアプローチ

  • 自分で部品を作れる
  • 外部に計算を追い出せる
  • テンプレートの書き間違いは先に判明してほしい
  • XMLを拡張
  • Widgetが関数を呼び出す
  • ViewがModelをたたく形
  • 変数の自動のエスケープ
  • yatt lint

SYNTAX:LRXML

  • yattのネームスペース
  • yattが正しければ,xmlとして正しくなくてもOK

Componet Model

  • yattファイルにマルチパートっぽく書くと,perlのPackageに展開される

Embedded Variable

  • 型指定ができる
    • x=text, y=html

namespace can be DIR or File

  • yatt:mylib:mypart
  • 継承もできる
  • .yattはpublic, ytmplはprivate

Macro Tag

  • my, if, for

DEMO

  • emacs用のシンタックスファイルが配布されている
  • 存在しない変数を作ると,そのエラー行に飛んでくれるのでわかりやすい

動作速度

  • うまく動かなかったのでカット

YATT::Lite

  • github/hkoba/yatt_lite

Perl5 is Alive

  • Perl is Dead
    • 時代遅れ 薬でもやっているんじゃないか
  • CPANに面白モジュールが一杯ある
    • cpanm
    • Moose
    • Plack
    • AnyEvent
    • Devel::NYTProf
  • 6ヶ月前にperl5.12を出した 
    • 緊張したけど,結果は良好
  • Perl6は?
    • 別の言語だから関係ないよ
    • すごい言語
    • まだ設計中
  • でもPerl5もこれからの言語
  • Perl5,Perl6の5,6はversionじゃなくて,それを含めて言語名

5.12でかわったこと

  • 5.10の機能が安心してつかえる
  • use 5.12.0で自動でuse strictされる
  • Y2038対応
  • Unicode5.2に対応
  • Pluggable Keywords
  • 関数ルックアップがオーバーライド可能になった
  • Dtrace support
  • coreからはずされたモジュールもある
  • yadda yadda ...
  • perldoc perldelta512

リリースに関して

  • Pumpkin
    • patch pumpkin
    • 変なリリースをしないように管理
  • 5.10はリリースまでに5年
    • 間に二人のPumpkinが燃え尽きた
    • 35万行の変更
    • メンテナンス作業が多すぎる
  • 5.10.1ほPumpkinがしんどいと発言
  • Pumpkinの仕事が多すぎる

Pumpkinになるには

  • Hardcore C Hacker
  • 強い責任感
  • ハッカーをつれてきてマネージャーをやらせる
    • 資源の無駄
    • 燃え尽きて繰り返しやれる人はいない

システムの構築しなおし

  • 役割をわける
  • わけられるところは別の人に

リリース

  • リリース感覚が一定になってきた
  • 開発版はリリースマネージャがやる
    • Pumpkinじゃない
  • メンテナンスには機能はあまり追加しないようにした
    • 悩むようなパッチは取り込まれない
    • ポータビリティ
    • セキュリティフィックス
  • 5.13.xは3ヶ月ごとにリリース

5.14.0

  • 2011/04
  • 望むもの
    • IPv6
    • CPANを簡単に
    • HTTP Client
    • SSL

perbrew

  • どんなバージョンのperlもホームディレクトリにインストールできる

Question

  • Unicode6.0に対応するか?
    • 追加したいけど,互換性も問題があるっぽい
    • 問題を把握したい
  • リリースを一定にしているとディストリビューションに新しいのが含まれやすい
  • JSON::PPは入るけどJSON::XSはなんでコアに入らないの?
    • ポータビリティを重視
    • XSがなくても他のモジュールがはいる
    • すげー速いJSONでなくてもいい

Perlで任意精度計算

自己紹介

  • 牧大輔
  • JPA

基本のおさらい

  • float 整数部3桁,小数部7桁
  • データ量がたりないよ
  • エラー幅が大きくなる
    • 1.1 * 1.1はOK
    • 1.0999 * 1.0999だと誤差が大きいよね
  • 整数はいいけど,小数は危ない

なぜ必要なのか

  • DateTime.pmで旧暦をかいてみた
    • CALENDRICAL CALCULATIONS
    • いい本
    • すげー眠くなる

旧暦

  • 月と太陽の緯度
  • 地球から観測した月・太陽の緯度で決まる
    • 24節気

Lunar Phase

  • 月の満ち欠け
  • 定期的な観測
  • 29.5日(平均)

Solar Phase

  • 春夏秋冬
  • 農業用
  • 365.5日くらい

月と太陽の関係

  • 時計の長針が太陽,短針が月

天体の位置計算

  • 高精度が必要
  • 0.000011574ずれると計算が1秒狂う

Perlで計算

  • perlで1/86400をやっても小数の桁が足りない
  • 実際は小数点以下59桁
  • perlは19桁目で丸め込み

Math::BigInt(BigFloat)の問題点

  • 文字列を与える必要がある
  • 数字だとPerlがまるめることがある
  • 1 value = 1 object
    • 遅い!
    • 700倍から600倍とか遅い
  • Math::BigInt::GMPも遅い

Goodbye Perl

  • Cでやる

MPFR

  • GMPじゃなくてMPFR
  • GMP+Higer Level Math
  • 三角関数とか

MPFR vs BigInt

  • 54倍!BigIntより速い!
  • 実用可能なレベル

任意精度計算

  • PerlやLL向きではない
  • Cを使おう
  • Perl側では常に文字列にすること
    • 文字列で数値を返す
  • 精度が高すぎてこまる
    • 自分で丸める必要もある

XSからPPへ

自己紹介

  • まかまか
  • Acme大全 2010
  • CPAN
    • JSON, Text::CSV
  • CPAN XSのもの
    • Thread::State, JSON::PC(削除)
  • github: makamaka

XS

  • PerlとCのグルー
  • メモリリーク
  • 作るの大変

PP

  • Pure Perl
  • XS使ってない
  • Cコンパイラは使わない

メリット

  • 暇つぶし
  • 勉強になる
  • ポータビリティの向上
  • Perl API, XSの知識

デメリット

  • 遅い
  • メンテが大変
  • 車輪の再発明

PP化の流れ

  1. PP化するモジュールを選ぶ
  2. t/*ファイルがたくさんある
    • テスト自体がAPIの一覧になっている
    • typemapを確認
    • やる気が出るか
  3. テストが通るように書く
  4. ブラッシュアップ
  5. パッケージ

PP化時によく使うかもしれないもの

  • B
    • 値のフラグを確認できる
  • pack/unpack
    • バイナリ操作
    • 進数の変換
    • perldoc perlpacktut
  • Config
    • perlのコンフィグを確認

パッケージング

  • バックエンドの統合
  • XSモジュールが使えればXS
  • 駄目ならPP
  • 環境変数の選びかた
    • PERL_をつけるとぶつかりにくい
    • PERL_ONLYとかいいよね

Unix Programming with Perl

正しいコードを書くために

  • testは確認手段
  • OS, Perlの知識が必要
  • OSの話は少ないので今回扱う

エラーナンバーをチェックする

ディレクトリ作成の場合

  • !-d $dirでチェックしてから作成するのは処理の間に別のプロセスが作っているかもしれない
  • とりあえずmkdirしてみて,メッセージを確認
  • まだ駄目.メッセージが異なる(OS, Local)
  • Errnoを使う

$!

  • dualvar
    • 数値と文字列の両方を持っている
  • Errnoが数値定数の一覧を定義

エラーコードを調べる

  • manで調べる
  • man 2 mkdir
  • 2はシステムコードの意味
  • POSIXのはOpenGroupのを参照するといい

forkとファイルハンドル

  • forkしてもファイルハンドルは複製されない
  • 親と子で共有
  • forkしても同じ構造体を指しているため
  • 開きなおせば,別の構造体を作ってもらえる

対策

  • File handleだと単純に閉じればいい
  • DBIはundefしちゃ駄目
    • InactiveDestoryを使う
    • 終了処理をせずにクローズだけする
  • POSX::AtForkとかでforkをフックして処理することもできる

UNIXシグナル

SIGPIPE

  • ファイルハンドルにデータを書こうとしたときに,書けない場合はとめる
  • $SIG{PIPE} = 'IGNORE'

SIGALRM

  • timeoutとか
  • メリット
    • 多くのシステムコールで使える ^ デメリット
    • プロセス毎に1個しか使えない

シグナルで処理をする

  • $SIG{TERM}とかでフラグを立てて,メインループでチェック

注意点

  • waitと相性が悪いのでProc::Wait3をつかう

PMグループディスカッション

Hokkaido.pm

  • onagatani
  • 北海道 帯広
  • Perl 5年
  • とりあえずML作ってみた
  • 人数が集まらない可能性がある
  • JPA 牧さん助けて!
  • メンバー
    • 札幌多数
    • CPAN Autor 4名

Yokohama.pm

  • clouder
  • 在住 世田谷
  • 日本で7つ目
  • 横浜中心のPerl Mongersがゆっくり参加する場がほしい
  • 初心者トークで参加しやすい
  • 開催規模 4,50名
  • 飲み会の参加率が90%以上

NagoyaでPerlをゆるく語る会

  • issm
  • 名古屋在住
  • 多言語の勉強会はあるけど,Perlのはあんまりない
  • 月1回 定期的に
  • 10名前後
  • @yuruperl
  • Nagoya.pmの申請を昨日した

Kansai.pm

  • lapis25
  • 兵庫
  • 2000/03設立
  • リーダーがいない
  • 有志による運営
  • ミーティング 年1,2回
    • 土日開催
  • 勉強会
    • フレームワーク勉強会
    • Perlベストプラクティス勉強会
    • Perl翻訳フェスタ
  • イベント
    • OSC
    • KOF
  • その他
    • 新年会
    • 忘年会
    • ぼたん鍋ツアー

Fukuoka.pm

  • debility
  • Satoshi Hirata
  • 2007/11
  • 懇親会がすごい
  • すぎやまさんありがとう

Okayama.pm

  • @canadie
  • C/PHP/Perl
  • 岡山にpmがないので設立
  • 8人
  • 人が集まらないので問題点もでない

ディスカッション

できること,できないこと

  • 福岡 合同でイベント
  • 横浜 Shibuya.pmから流れるので人は集まる
  • 北海道 札幌以外は会場がない

地方PMのホンネ

  • 名古屋 個人的にはPHPが多く,Perlが少ない
  • 岡山 人がいない.車がメインなので飲み会がない
  • 関西 人が定着しにくい.メンバーの固定化
  • 名古屋 技術レベルは高くなくていいのか?
    • 東京 飲み会がメインなので技術レベルは気にしていない. 二人で飲めばPMだ.気軽に参加できるのがあるべき姿

他のPMへの質問

会場の探し方

  • 北海道 札幌はたくさんあるので苦労はない.地方に行くと会場がない.専門学校に掛け合った.平日は厳しい
  • 関西 企業に借りたりする.借りた場合はお金がかかるので,学生向けに学割を用意する
  • 福岡 誰かの会社
  • 渋谷 miyagawa 会場を先に決めるとリミットが決まるので困るんでない

開催日

  • 横浜 金曜日にやる
  • 岡山 アンケートで平日が多いため
  • 福岡 土曜が多い

他コミュニティとのかかわり

  • 北海道 OSC, localがある
  • 福岡 互いにフレームワークの話.Ruby, PHPとかと
  • 岡山 他のコミュニティはあるので,今後やりたい

メンバーの平均年齢と男女比

  • 男性がたいてい多い
  • 女性は多くて2割

運営の仕方の工夫

  • 北海道 初心者向けにやろうとはしている

省サーバ運用

自己紹介

  • 小林
  • nekokak
  • DBIx::Skinny

きっかけ

  • 退職
  • 一人でシステム開発
  • 大規模サーバ入門
    • この技術が必要か?
    • 圧縮とかいらねーよ
  • NoSQL!!
    • RDBMSを極めよ
  • Mixi/DeNA/Gree/etc
    • システムは大規模か?
  • 情熱プログラマー
  • エンジニアが持つべき意識を共有する場をつくりたい
  • インフラとWebアプリ開発の両方をやってみての感想とか工夫
  • 保守も地味
    • 動いて当然
    • 誰も評価しない
    • でも大事

これからのエンジニア

  • 開発能力
  • インフラへの理解
  • 自分がどれだけの利益を出しているか
  • インフラの費用

基本エンジニアリングのお話

  • サーバ6台
  • 1/2ラック
  • 前職の1/50くらい
  • ベンチャーなのでお金がない
    • 6台でもがんばった
    • 値切りまくった
    • 適正な価格で購入することが重要
  • DB2, Web3, 開発1
  • DBのメモリっが8GB, Webメモリ4GB
  • SlaveのサーバではQudoのJobサーバも兼任
  • LBにPerlbal
    • 安定性抜群
    • Perl製
    • Pluginをかける
  • なぜnginxじゃないのか
    • x-reproxyさせたい
    • x-reproxy-cacheがない

Perlbal

  • シングルスレッドなソフトウェアロードバランサー
  • SSLも使える
  • 他のLBよりノウハウがある
  • Webサーバの機能もある

App

  • Starlet
  • Apache/mod_perlは使ってない
  • Server::Starter + Starlet
  • kazuho製なので安心

画像の管理方法

  • rsyncで動機
    • ないわー
    • ないわー
    • ないわー
    • Web 1.0
  • DBのBLOBに格納
    • 遅い
    • Web 1.5
  • MogileFS
    • おすすめ
  • NFS
  • DRBD

MogileFS

  • X-ReproxyヘッダをLBが解釈する必要がある
    • PerlbalなんでOK
  • 管理用のMySQLが必要
  • 物理的に2台のサーバが必要
    • App*2に同居はいやだ
  • 将来的に移行できる形にすればいいや
  • X-Reproxy-CacheはAppサーバへの問い合わせを回避できる
  • X-Reproxyの先をPerlbal自身にすればいい

まとめ

  • 大規模サービスの中身は気になる
  • 自分の環境にマッチするかを立ち止まって確認する
  • 技術的にとんがってないと生きていけない
  • コスト意識をもって行動/提案できるエンジニアかどうか

Lightning Talk Day Two


Keynote

メモしてないです!!

YAPC::Asia Tokyo 2010 一日目

YAPC::Asia Tokyo 2010に行ってきたので,セッションのメモを記録としてアップします.

Moderl Perl Web Development on Amazon EC2

PSGI

  • PSGI APP = coderef
  • sub { [ $status, [ @Headers ], [ @Body ] ] }

Plack

  • PSGIの実装
  • plackupの使い方
    • サーバ実装を切り替えられる
    • Starman, Starlet
    • gracefulに対応しているかどうか
    • DelayedとShotgunどっちがいいのか
    • ベンチとって使うといい
    • miyagawaさんが解説が違うと突っ込み
  • Server::Starter
    • start_server
    • --port
    • --interval

PSGIアプリの書き方

  • 自分で作るのがお勧め
  • CPAN Moduleを使うと簡単にかける
    • Plack::Request
    • 継承して必要な部分を追加
    • parametersをflagged utf8に変換
    • DBIx::Skinny
    • Router::Simple
    • 昨日も紹介されていた(TODO 後で確認)
    • JSON::XS

daemontoolsとは

  • daemontoolsからstart_server

daemontoolsのコマンド

  • svc
    • -u 起動
    • -h SIGHUPを送信
    • -d 停止

daemontoolsの注意点

  • runファイルでexecする
  • runファイルの書き換え後は-dしてから-u
  • サービス停止時はmvで.hogeにリネーム

cpanmの使い方

  • cpanm -l extlib Starman
  • アプリケーション用のユーザを作成してその$HOME以下でアプリ作成

Amazon EC2環境での構築

EC2のサーバ環境

  • web
    • small instance
  • db
    • large instance
    • mysql5.1

構築の祇園

  • IPアドレスが変わる
  • Disk内容が保持されない
  • 負荷分散
  • アプリケーションのdeploy

IPアドレス

  • Elastic IPでDNS, Global IPを固定
    • webサーバはauto scale
    • dbサーバは使ってる
  • amazonのDNSに対して,ElasticIPで取得したDNS名を問い合わせ

DISKが消える

  • instanceを消すと消える
  • EBSブートを使ってる

負荷分散

  • instanceを増やせばいい
  • オートスケールを使えば自動で負荷分散
  • CPU Usageなどで閾値を設定すると勝手に増減する

デプロイ

  • オートスケールはイメージから起動なので,元のインスタンスイメージを更新する
    • 何かツールは?
  • テスト用にElasticIPをとる
    • ここでテストして問題なければイメージ化
    • 後はオートスケールにまかせる
  • NAS, NFSを使う人もいるらしい

感想

  • 開発作業に得に違いはない
  • daemontools + Server::Sterter + Starman
  • ElasticIP
  • オートスケールが便利

まとめ

  • Plack
  • Starman
  • cpanm
  • daemontools
  • amazon特有の環境に注意

最近のPerlなものづくりの事例

  • RECRUIT
  • Toshimasa Ishibashi

MTLProject

  • 自前サービス運営
    • 演劇ライフ
    • コマーシャライザー
    • ハモニナ(携帯系)
    • docomo公式コンテンツ
    • モバゲー SocialApp
    • ATND
    • 調整さん

個社ホームページサービス

  • Perl CMS
    • suumo.jpからcentury21.on.s-bs.jpとかにデータを抽出
  • TypePad + 検索
  • エントリー入力
    • JavaScriptでごりごり
  • お店のミカタ ほっとペッパーでも同様のサービス
  • 10人前後を色々割り振って開発

VMwareで開発

  • 各個人にVMwareをinstall
  • subversionで管理

Test

  • test code
    • Model(ビジネスロジック) ここは100%にする
    • View + Controller
    • どう書いてるの?
    • production, stagingでもsvn up後にprove -r .
    • staging, productionのsvn upはリーダーが手動!
    • リーダーがmergeをごりごり
    • テスト専用のデータベースが環境ごとにある

CPAN

  • cpan installしたモジュールは全部 svn addする
  • $HOME/site_local_envにPERL5LIB等を追加する
  • make installした*.soもsvn add
    • 全環境でOS等をあわせる必要がある

*.conf

  • ln -s /etc/my.cnf $HOME/etc/my.cnf
  • my.cnf.personal, mmy.cnf.staging, my.cnf.productionを$HOME/etc/my.cnfにln -sする

サーバ環境

  • ユーザ認証はRECRUITでシングルサインオン web apiを用意
  • Perl FrameworkはPlack
  • xen server

その他

  • エンジニアは企画から参加
  • backlogでリポジトリ等を管理

Mashup Awards

  • llevalも使える
  • R25 API
  • mbga
  • NHK

30days Albumの裏側

30daysの裏

  • Web Ruby on Rails
  • mogilefs
  • gearmn
  • schwartz
  • HTTP APIを使用
  • RESTを意識

MogileFSの障害対応

  • コピーを確認
    • file_on
    • X-REPORXY-URLを確認
  • Perlbalを再起動
    • X-REPORXY-CACHE-FOR

MogileFSの利バランス

  • データの平準化
  • バックグランドで動作
  • ストレージを追加・削除時に使う

FLVのストリーミング

  • Perlbal pluginを作成
    • FLVヘッダをボディに追加
    • フックポイントを追加

ソーシャルアプリ向けのシステム監視運用の勘所

  • tcpdumpで確認
  • DBのチューニングが遅かった
  • tcpdump + wiresharkでok
  • リクエストの開始からなのでレイテンシを気にする程度
    • 自宅 10ms
    • EC2 100-200ms

Perl and C binding: new and upcoming ways

  • c_ushort
  • PerlDLL
  • Libperl++
  • goal c++
  • for calling perl xs funxtions
  • provides xs environmenent for called funciton

Libperl++

  • Cからperl packageの呼び出しの例
  • Ref testr = universe.package('Tester').call('new',1);
  • Any Perl Variable have take_ref().
  • custom type convertion
    • structも作れるよ

ExtUtils::XSpp

  • Module::Build::WithXSpp
  • c++をtypemapを用意すればかなり普通に使えるっぽい

質疑

  • crossplat form
  • libffiに依存

Studying HTTP with Perl

PerlにおけるHTTPクライアントの紹介

並列じゃないもの

  • LWP::UserAgent
    • デファクトスタンダード
  • LWP::Simple
  • LWP::RobotUA
    • Robot用
  • URI::Fetch
    • LWPのラッパー
    • Etag, LastModifiedに対応
    • キャッシュ対応
  • HTTP::Lite
    • 依存なし
    • httpsに未対応
  • LWPx::ParanoidAgent
    • ローカルネットワークへのアクセスを拒絶
    • DNSの検証
  • WWW::Curl
    • perl binding of libcurl
    • 速い
    • 癖がある
    • ラッパーがいくつかある

並列リクエスト可能なもの

  • お勧めじゃないもの
    • HTTP::Async
    • みのがした
  • AnyEvent::HTTP
  • Coro::LWP
    • Coroとは
    • Perlでコルーチンを実現するライブラリ
    • お勧めだけど考えて使う必要がある

LLによるネットワーキングプログラミング

  • 相手の処理待ちが多いからLLでもOK
  • だけどLWPは遅い
  • ベンチマークをとる
  • LWPで200req/s

AnyEvent::Curl

  • on github
  • LWPの8倍速い
  • WWW::Curlとの違い
    • ブロッキングしていいのかどうか
    • event駆動のサーバの場合
  • LWP互換機能
  • WWW::Curl::Multiがベース

並列処理

  • thread バグってる
  • forkによるマルチプロセス
    • IO多重化+イベント駆動
  • forkのメリット
    • マルチコアの生かせる
  • forkのデメリット
    • 生成コスト
    • メモリ
  • イベント駆動
    • 省メモリ
  • Perlだとイベント駆動+prefork

Preforkの話

  • prefork型はDoSに弱い
  • フロントにイベント駆動のロードバランサをおく
  • プロセス数を調節する
  • ピークリクエストと処理時間がわかれば,必要なワーカーを計算できる

イベント駆動向きなもの

  • 予想できなければイベント駆動が向いている
  • フラグを使った強調動作
    • 1ホストに対するリクエスト数の管理とか
  • クローラは相手のスペックがわからないのでイベント駆動がいい

チューニング

  • HTTP::Responseが遅い.HTTP::HeadersをXS化
  • 名前解決のコスト
    • WWW::Curlは非同期解決のオプションがある
    • パフォーマンスが劣化する
  • 外向けのクローラーはSquidを通すと楽

RPCのプロトコル

  • HTTPでいいんでない
  • HTTPのメリット
    • みんな知っている
  • HTTPは別に遅くない

テスト

  • Test::TCP
  • Plack/PSGIで簡単サーバを作る
  • ローカル環境だけで動くようにする

非同期処理の通知処理 with Tatsumaki

CGI

  • $|でautoflushをonにする
  • long-polling
  • multipart/mixedで送信
    • クライアント側ではDUI.jsで処理
  • 大量アクセスを裁けない
    • C10K問題

PSGI/Plackストリーミング

  • めんどくさい
    • coderef coderef coderef ...
  • 全部IO処理を非同期にしなければならない

どうやって簡単にするか

  • Tastumaki::Handler
  • Tatsumaki::Application
  • Gearman
    • jobはMyJobとか作ってその中にjob_hogeなメソッドを定義
    • Class::InspectorでMyJobからジョブを読み出す
  • AnyEvent::Gearmanがクライアントにはいい
  • WebService::Async

Writing prefork job workers / servers

Parallel::ForkManager

  • 便利
  • shutdown方法がない

Parallel::Prefork

  • シグナルで子プロセスを制御できる
  • 親が受け取ったシグナルを子プロセスのシグナルに対応づける
  • graceful
  • dynamic scaling
    • P::P::SpareWorkers
    • 非推奨

Server::Starter

  • 去年のLTと一緒
  • 環境変数をみてfd_openですでに開いているソケットを使うだけでSS対応できる

Parallel::Scoreboard

  • リソース監視
  • mod_statsuっぽいものを作成しやすくする
  • 監視側
    • Paralle::Scoreboard::PSGI::App
    • Paralle::Scoreboard::PSGI::App::JSON

2010/10/08

How to use App::CLI

App::CLIの使い方

前置き

Web Applicationを書いていると管理用だったり,集計用だったりのscriptが必要になります.
今まではこれをbatch/とかに書き散らかしていました
これはメンテナンス性も悪いし,svnとかgitみたいにサブコマンドでなんとかしたい

そこでApp::CLI.

  • メリット

    1. 簡潔にCLIプログラムを作成することが可能.
    2. 依存モジュールも少ないため気兼ねなくインストールもできる.
    3. SVKとかで使われてるようなので多分それなりに安定しているはず.
    4. コマンドラインオプションの書き方はGetopt::Long
  • デメリット

    1. ドキュメントが少ない

実際に使ってみる

大きなモジュールじゃないので使いながら覚える. とりあえずこんな感じになるようなCLIを作ります

 
$ myapp.pl help
# なんかヘルプメッセージ表示
 
$ myapp.pl print hoge
hoge
$ myapp.pl print --uc hoge
HOGE
$ myapp.pl print --ucfirst hoge
Hoge
 
$ myapp.pl sum 1 2 3
Sum 6

できた!!

こんな感じのファイル構成.

 
yoshi@mb app-cli% tree
.
|-- lib
|   `-- MyApp
|       |-- Command
|       |   |-- Help.pm
|       |   |-- Print.pm
|       |   `-- Sum.pm
|       `-- Command.pm
`-- script
    `-- myapp.pl

解説

起動スクリプト

script/myapp.plの中身はすっきり

 
#!/usr/bin/env perl
 
use strict;
use warnings;
use FindBin qw($Bin);
use File::Spec::Functions qw/catfile/;
use lib catfile($Bin,'../lib');
use MyApp::Command;
 
MyApp::Command->dispatch;

Dispatcher

DispatcherのMyApp::Commandの中身もすっきり
App::CLIを継承して終了

 
package MyApp::Command;
 
use strict;
use warnings;
use base qw(App::CLI);
 
1;

Command

では肝心のコマンド部分.
こちらはApp::CLI::Commandを継承して作成する

myapp.pl print hoge

このprint部分がucfirstされ,MyApp::Commandとあわせてクラス名を生成する.
結果,MyApp::Command::Print->run(@args)が実行されます.
runは固定.

MyApp::Command::Printはこちら.

 
package MyApp::Command::Print;
use strict;
use warnings;
use base qw(App::CLI::Command);
 
sub subcommands {
    qw/uc ucfirst/;
}
 
sub options {
    ( 'strings|s=s' => 'strings' );
}
 
sub run {
    my $self = shift;
    my $strings = shift || $self->{strings} || $self->usage;
 
    print $strings, "\n";
}
 
package MyApp::Command::Print::uc;
use strict;
use warnings;
use base qw(App::CLI::Command);
 
sub run {
    my $self = shift;
    my $strings = shift || $self->{strings} || $self->usage;
 
    print uc $strings, "\n";
}
 
package MyApp::Command::Print::ucfirst;
use strict;
use warnings;
use base qw(App::CLI::Command);
 
sub run {
    my $self = shift;
    my $strings = shift || $self->{strings} || $self->usage;
 
    print ucfirst $strings, "\n";
}
 
1;
 
__END__
 
=head1 NAME
 
MyApp::Command::Print - apply uc(first)? to string and print it
 
=head1 SYNOPSIS
 
myapp.pl [--strings|-s STRINGS] [--uc] [--ucfirst] STRINGS
 
=cut

順番に解説

  1. options
  2. subcomands
  3. pod

options

Getopt::Longに食わせるオプション設定を配列で定義する.
細かい使い方はGetopt::Longを参照すること

指定したオプションはモジュール内で$self->{$key}で利用できる.

subcommands

ここで定義したサブコマンドはそのままBool型のコマンドラインオプションになる.
この場合は--uc, --ucfirstがオプションに追加される.

定義したサブコマンドはMyApp::Command::Print::$subcommandとして実装する.

注意点はこのサブコマンド側でオプション定義等ができないこと.
必要であれば親コマンド側で定義しなければならない

pod

helpコマンドで表示されるのでNAME, SYNOPSISは書いておくといい感じ.

 
yoshi@mb app-cli% perl script/myapp.pl help
   help - show help message
   print - apply uc(first)? to string and print it
   sum - sum rest arguments
yoshi@mb app-cli% perl script/myapp.pl help print
NAME
 
    print - apply uc(first)? to string and print it
 
SYNOPSIS
 
    myapp.pl [--strings|-s STRINGS] [--uc] [--ucfirst] STRINGS
 

最後にhelpコマンドの実装

これだけ特殊.
最初からApp::CLI::Command::Helpというモジュールがあるので,これを継承して終了.

MyApp::Command::Helpの中身

 
package MyApp::Command::Help;
use strict;
use warnings;
use base qw(App::CLI::Command::Help);
 
1;
 
__END__
 
=head1 NAME
 
MyApp::Command::Help - show help message
 
=head1 SYNOPSIS
 
myapp.pl COMMAND
 
=head1 COMMAND
 
help, sum, print
 
=cut

まとめ

思ったより小粒なモジュールなので楽に読めた.
依存が少ないのは利用しやすい.
App::Cmdよりわかりやすい.

他にお勧めフレームワークがあれば教えてください.

作成したコードはgithubにupしてあります.
URL: http://github.com/ysasaki/p5-testing-app-cli

2010/10/06

Test::Fixture::DBI::Console

作成の動機

Test::Fixture::DBIには既存のDBからテーブル定義と中身をdumpするツールが付属しています.

これを使うとさくっとテスト用のfixtureが生成できます.

生成したFixureを書き換えて使ってもいいのですが,yamlだと量が増えたときに閲覧性が低いと感じました.


そこで使い慣れたmysqlのconsoleっぽく見れると便利なんじゃないかと思い,Test::Fixutre::DBI::Consoleを作成しました.


追記
これは内部でTest::mysqldを使ってfixutre作成専門のmysqldを立ち上げます.


配布場所

現在はgithubのみです.PAUSE IDが貰えたらCPANも考えます.

Test::Fixutre::DBI::Console 

使い方

Test::Fixture::DBI::Consoleをinstallすると"test_fixture_console"コマンドもinstallされます.

このコマンドでshellに入ります.


まずはテーブル定義とデータを生成します.
yoshi@mb yoshi% test_fixture_console mysql
fixture> create table hoge (id int primary key auto_increment); 
Affected 0 rows
fixture> show tables;
+----------------+
| Tables_in_test |
+----------------+
| hoge           |
+----------------+
Affected 1 rows
fixture> insert hoge (id) values (1),(2),(3);
Affected 3 rows
fixture> select * from hoge;
+----+
| id |
+----+
| 1  |
| 2  |
| 3  |
+----+
Affected 3 rows

# DBと中身をyamlに書き出し
fixture> make_database test1.yaml
Create database schema file: test1.yaml
fixture> make_fixture test1_fixture.yaml
Create fixture file: test1_fixture.yaml


先ほど書き出したyamlの中身
yoshi@mb yoshi% cat test1.yaml
---
- 
  data: "CREATE TABLE `hoge` (\n  `id` int(11) NOT NULL AUTO_INCREMENT,\n  PRIMARY KEY (`id`)\n) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1"
  schema: hoge
yoshi@mb yoshi% cat test1_fixture.yaml
---
- 
  data:
    id: 1
  name: 1
  schema: hoge
- 
  data:
    id: 2
  name: 2
  schema: hoge
- 
  data:
    id: 3
  name: 3
  schema: hoge

test1.yamlとtest1_fixture.yamlをloadしてみます.
yoshi@mb yoshi% test_fixture_console mysql
fixture> show tables;
+----------------+
| Tables_in_test |
+----------------+
+----------------+
Affected 0 rows
fixture> construct_database test1.yaml
Load database schema from test1.yaml
fixture> show tables;
+----------------+
| Tables_in_test |
+----------------+
| hoge           |
+----------------+
Affected 1 rows
fixture> construct_fixture test1_fixture.yaml
Load fixture from test1_fixture.yaml
fixture> select * from hoge;
+----+
| id |
+----+
| 1  |
| 2  |
| 3  |
+----+
Affected 3 rows

TODO

  • テスト足りなすぎ
  • PODもちゃんと書く
  • SQLiteでも動かしたい
  • モジュール名はこれでいいのか
  • 明らかにリファクタリングが必要

2010/10/03

Hokkaido.pm #2

関係者の皆様,昨日はお疲れ様でした.

今回は初めてスピーカーをやらせて頂いて大変勉強になりました.
需要があるかわかりませんが,一応slideshareにアップロードしましたので
興味のある方はご覧ください.

2010/09/09

SQLiteのデータをCSVで出力する

sqliteで管理しているデータをCSVで出力する必要があったので,sqlite3にmysqlの-eオプションみたいなのが無いのか確認したところ,下記の方法で出力先と出力方法を変更できた.

sqlite> .mode csv
sqlite> .output hoge.csv

後は普通にselectを発行するとSTDOUTじゃなくてhoge.csvにデータが書き込まれる

他のmode等は.helpで確認可能.

2010/09/08

Iterator::ToArray

Iterator::ToArrayを作成した。
名前の通りIteratorをArrayに変換する。

作成の動機はHTML::Template::Proに直接IteratorやORMのrow objectを渡せないのでiteratorをarray(ref)?に変換したかったから。

use HTML::Template::Pro;
use MyDB; # using DBIx::Skinny
use Iterator::ToArray qw/to_array/;

my $db = MyDB->new(...);
my $iter = $db->search(
    'hige_tbl',
    { length >= 30 }
);

my @array = to_array $iter, sub {
    +{ id => $_->id, 'length' => $_->length }
};

my $html = HTML::Template::Pro->new(
    filename => $file
);
$html->param( hige_loop => \@array );

毎回↓みたいにwhileで$iter->next()を呼ぶのにいい加減あきた。
my @array;
while ( defined ( my $row = $iter->next() ) {
    push @array, {
        id     => $row->id,
        length => $row->length,
    };
}

2010/08/24

HTTP::Request::AsCGIでCGIのテスト

HTTP::Request::AsCGIとHTTP::Requestを使うとCGIのテスト時に環境変数等をよしなにセットアップしてくれる。
前に使ったことがあったはずなのに、モジュール名が全然思い出せなかったのでメモ。

以下、使い方
use strict;
use warnings;
use HTTP::Request::AsCGI;
use HTTP::Request::Common;
use CGI;
use Test::More;
{
    my $req = POST 'http://example.com/',
        Content_Type => 'form-data',
        Content      => [ file => ['t/test.gif'] ];
    my $c = HTTP::Request::AsCGI->new($req)->setup;
    my $q = CGI->new;
    my $filename = $q->param('file');
    is( $filename, 't/test.gif', 'filename ok' );
}

done_testing;

2010/08/08

Hokkaido.pm #1

昨日のHokkaido.pm #1のメモ

非同期プログラミング
--------------------
講演者: 牧さん

複数URLにたいしてリクエスト
- LWPで順にリクエスト 
- 遅い場所があると詰まる
- read(2)でブロック

イベント駆動
- イベントループ
- callbackを登録
- socketの読み込み可能とかで発火

AnyEvent
- POE, Danga::Socket, IO::Async,
- ↑互換性なし
- 汎用API
- バックエンドを選べる
- Standard API++
- 新規ならAnyEvent
- AnyEvent vs AE
- 牧さんはAE派

Watcher
- IO watcher + callback等
- Timer
- signal
- idle 待機状態
- AnyEventで注意すること
- guardオブジェクトを利用している
my $timer;
$timer = AE::timer 0, 1, sub {
    # callback無いで必要なくなったらオブジェクトを削除する
    # そのために先に$timerを宣言しないとcallback内から呼べない
    undef $timer;
};

コンディション変数
- $cv = AE::cv {};
- $cv->recvでイベントループに入り,$cv->sendをwatcherのcallbackから呼ぶ
- 複数のwatcherに対応するためには$cv->begin, $cv->endを使う
- $cv->send(@args)でAE::cvのcallbackの引数に値を渡せる

AnyEvent::\*の名前空間にいろいろ入ってる

サーバサイドだとTwiggy
- plackup -s Twiggy
- longpoll
- ブラウザゲームのイベントサーバ

非同期の注意
- 「やりたいから」だと失敗する
- 「必要がある」ときだけ使う
- リアルタイム性
- I/O待ちが多い
- コードが複雑になるから,必要なときだけにしよう


LAPPによるWebアプリケーション
-----------------------------
ここは諸事情によりカット
Imager::DTPは意外と使えるのかも


Perl6 Pattern Match
-------------------
講演者: 山川さん

Perlの正規表現の問題
- なぞの記号
- /xとか←個人的によく使う
- 使用頻度と記号の長さが適当
- ?? ?;とかわからん
- /gとかで動作がかわりすぎ
- ネストしたパターンが困難
- 変数展開がめんどい,サブルール
- 正規表現からPerlを簡単に呼べない
- バックトラッキングの制御がない

Perl6の挑戦
- マッチ演算子が ~~ に
- スペースは常にトークンの区切り文字 /xがデフォルト
- コメント #
- [...]が文字クラスではなく(?:...)に相当
- 文字クラスは<[...]>, 否定 <-[...]>
- 足し引きができる <[a..z]-[aeiou]>
- \**n で {n}, \**n..mで{n,m}
- :s :i //s //i
- 変数キャプチャ $/にマッチ結果 $/[0]でアクセス
- 名前つき正規表現 regexで作成
- 置換がs/からrx/
- /eがなくなった m/pat/{ code }/
- マッチ条件にコードを使える
- 構文解析
- PEG Parserが使える
- 再帰下降パーサ+memo化
- Perl6っぽくする Regexp::Grammer


Perlロギング
------------
講演者: keroyonnさん
- ゆとり系プログラマー
- twitterのクローラとか

前提知識
- print debug
- debugger lvalueにバグあるらしい
- Data::Dumperはちょっと不便
- YAML::Syckだとdumpも読みやすい
- 時間もほしい Time::Pieceが5.10からコア入り
- warn, carp
- exit 1; die, croak
- dieはステータス 255固定
- $!に自分で入れられる

Log::Dispatch
- newしてaddでOutputのサブクラスを追加していく
- Log::Dispatch::Config
- 書式設定とかできる
- Log::WarnDie
- warn, dieをLog::Dispatch等に送る

Log::Dispatch::Outputのサブクラス
- Email系が多すぎ.日本語も通らない
- Email::EmailSender
- エンコード指定できる
- githubにあり
- http://search.cpan.org/~keroyon/Log-Dispatch-Email-EmailSender-0.03/README.pod

Log::Dispatch::Config::Watcher
- L::D::Configを継承してるから使い方は一緒
- 拡張パラメータはWatchに詰め込む
- functionsで監視するファンクションを指定できる
- main::test1とか
- Hook::LexWrapでメソッドの起動,終了をフック


DB処理におけるFixtureの勧め
---------------------------
講演者: ZIGOROuさん

Test::mysqld
- DBIx::Connector
- SQL::SplitStatement
- レプリケーションもできる

MySQLを使ったFixture
- Test::Fixture::DBI - 生DBI用のFixture
- triggerの例
- デモ
- Test::Fixture::DBIにはmake\_database\_yaml.plとかのツールが付属していて,Fixtureデータ等を簡単に作成できるようにしてる


----------------------------------
ここからLT

はじめてのしー・じー・あい
--------------------------
講演者: hotwatermorning

- バグ票→Perl+CGIで作ろう
- まとめて見られない→バグ表だった
- 課題 DB
- プログラミングの魔道書 今回はC++
- PDF版が1000円

画像のモノクロ変換の高速化
--------------------------
- 割り算をビットシフトに
- 早くならない
- 手数を減らす
- for を map
- 配列をscalarに
- 最初からビットシフトしておく
- 一行にまとめた
- 最適化 = ロマン

2010/08/06

Webテクノロジーセミナー

今日はWebテクノロジーセミナー行ってきました!

ZIGOROuさんの公園が一番エンジニア向けの内容で楽しめました。
客層がエンジニアメインじゃなかったのかあまりウケはよろしくなさそうだったけども……。
今日とったメモを一応載せておく。

後、Six apertさんからWe ♡ blogって書いてあるエコバッグ?っぽいノベルティ頂いた!
あざーっす!

--------------------------------------------------------
ここからメモ
--------------------------------------------------------


Webテクノロジーセミナー
=======================

- MovableTypeで作るスマートフォン対応サイトのセッションは中止
- 質疑応答を伸ばす

開催理由
--------
- スカイアーク紹介
- solanowa
- MT CMS
- 7年目

- 4187億円 北海道ITの売上高
- 食品,鉄鋼,石油・石炭,紙,IT
- ニアショアで道外の仕事が増えている
 - 88.7% 札幌の売り上げ
- 札幌に一極集中はどうなの?
- 北海道のITを盛り上げる会 東京でやってみた
 - 北海道に戻れない理由
- 地元にIT企業が少ない
  - 技術レベルが下がりそう

- 盛り上げるきっかけとしてセミナー開催
- CSS3でドラえもん
- JPA 牧さん
- DeNA 山口さん
- Six apart 金子さん


ビジネスでPerlを使うために知っておくべきPerlの現在と未来
--------------------------------------------------------
講演者 牧さん

2000年代に暗黒期
- 活動が表に見えなかった
- クレーム
- Perl6ぐだぐだ
- 5.8から5.10が5年!!
- FUDがいっぱい

ここ一二年はいい感じ
PerlMongersも一杯
Perl5開発体制が刷新
- 機能ベースから時限ベース
- 安定版を毎年
- 開発版を毎月
- リリース担当が毎回かわる等の変化
- commitもコンスタントにある

Perl6 Rakudo 1.0
- 基本的には姉妹言語
- 別言語なので別にアップグレードの必要はない
- gfxのコメントを引用

情報発信
- blogサイト立ち上げ
- perl.orgとかも刷新
- マーケティングに力を入れたい
- http://bit.ly/cUyzVa

団体・法人
- OSSでも団体が必要
- 会社の上司「サポートされてんの?」に対抗
- YAPC
- The Perl Foundation 権利関係とかをアメリカでやっている
- ヨーロッパでも団体ができた
- 日本ではJPA(社団法人)
- 有料だけど研修もやってるよ!!
- perlを使う企業を増やしたい

今後の話し
- Perl5はまだまだ活発なんで安心

Perlを続ける理由

メリット
- 楽ができるからで終了
- Perl 10年
- 現実,いいコードの再利用,様々な用途に使える,テスト
- 言語は表現のためのツール
- 拡張 => モジュール化
- 問題を解けなきゃはじまらない

デメリット
- CPANがないと大変
- エンジニア側がルールを作る必要性がある
- ツールでカバー(cpanm, perltidy, perlbrew)

CPAN
- hackerのコードを再利用して楽ができる
- 生態系
- author -> upload -> test -> feedback -> author
- 自浄作用,多様性

テスト文化が強い
- Test::
- テスト方式がある
- 簡単にテストできる
- Free QA
- CPAN Testers
- いろんなOSとPerl Version



モバゲーオープンプラットフォームとPerl
--------------------------------------
講演者: 山口さん(ZIGOROu)

OpenSocail?
- ソーシャルデータを利用
- mixiapp

Gadget
- XML
- HTML+JavaScript+CSS, Flash
- gadget server -> Apache Shinding(Java or PHP)

JavaScript API
- SocalDataにアクセス
- 裏ではJSON-RPC API

Spec
- 決まってるからサイトで見れる

mbga OpenPlatform
- mobile向け

JSON-RPC 2.0
- request, responseにvesionとか入ってる
- batchリクエスト idをつけて送れば,idがついてかえってくる

JSON-RPC -> Perl実装
- Chariot RESTful API
- Chariot2 JSON-RPC

設計方針
- 速い・軽い
- 富豪的なモジュールは避ける
- メンテナンスしやすい
- テストもしっかり.テストしやすいインターフェイスで
- frontend lighttpd
- backend Plack + Starman

モジュールの選択
- WAFはいらない
- POPO Class::Accessor::Fastは使ってる
- viewいらん
- PSGIにすれば柔軟に後で変更できる
- Dispatcher Router::Simple
- O/R mapperは小中規模まで
- SQL::Abstractを使ってる
- DBIx::Connector 接続のリトライ等
- Time::Piece
- データ構造は生にHashref等
- Object::Container
- データチェック Data::Util 速い is_array_ref($data)
- Config Loader
- 環境が4つ
- sandbox, sandbox stage, service, service stage
- Config::Any, Hash::Merge::Simple
- Object::Contener
- 遅延実行でsingleton
- 設定ファイルはperl形式. coderefを渡せるから
- preload機能

未来の話
- memcachedは厄介
- cacheのexpire, updateがめんどくさい
- handler socket plugin
- SQLを使わずに直接MySQLのstrage apiをたたける
- gearman
- 並列に処理
- mysqlとの接続を維持できる

まとめ
- 軽く速いのを使う.作る
- 基本を意識 CoW,テスト
- CPANから探そう


Movable TypeとPerl
------------------
ブログ,twitter, cmsなにがいいの?

- 全部やれ
ブログは継続して書かないと成果がいまいち
コンテンツ・テンプレートの更新履歴機能
- バージョン管理して,すぐ過去のバージョンに戻せる
管理画面にコンテンツ絞込みのフィルタ機能が5.1で入る
- フィルタは保存可能
FogBugzでバグトラッキング
Glo-bish 1500語程度の簡易英語

2010/07/30

海だよりのアサリの酒蒸しが旨い

一昨日に続いて、今日も海だよりに行ってきた。
アワビの刺身が目的だったわけだけど、
タコしゃぶとアサリの酒蒸しが旨すぎてしょうがない。
ほっけの焼き物も旨かった。

少しでも貢献できればいいなと思ったのでブログに書いてみる。
サイト: http://www.umidayori.sakura.ne.jp/
住所: 北海道札幌市北区北23条西3丁目 ダイアパレス北23条1F

地下鉄 南北線の北24条駅の4番出口から東に10mくらい行った場所にあります。

8月からマグロ祭(予定)らしいので待た行ってきます!

2010/07/28

YAML 0.71でutf8 flagが自動で付与される

今日、はまったのでメモ
YAML 0.71からLoadFileで読みこんだデータはutf8 flaggedになっている。

まずは検証の準備
yoshi@mb yaml% cpanm -l 0.71 http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/YAML-0.71.tar.gz
yoshi@mb yaml% cpanm -l 0.70 http://search.cpan.org/CPAN/authors/id/A/AD/ADAMK/YAML-0.70.tar.gz

チェック用の簡単なスクリプトを用意


読み込むデータをdata.yamlとして保存
---
hoge: fuga

実行結果
yoshi@mb yaml% perl -I0.70/lib/perl5/ yaml-utf8-check.pl  
SV = PVMG(0x1008a5280) at 0x100830040
  REFCNT = 1
  FLAGS = (POK,pPOK)
  IV = 0
  NV = 0
  PV = 0x1006af9f0 "fuga"\0
  CUR = 4
  LEN = 8
yoshi@mb yaml% perl -I0.71/lib/perl5/ yaml-utf8-check.pl
SV = PVMG(0x1008a56a0) at 0x100988908
  REFCNT = 1
  FLAGS = (POK,pPOK,UTF8)
  IV = 0
  NV = 0
  PV = 0x1006dec10 "fuga"\0 [UTF8 "fuga"]
  CUR = 4
  LEN = 8

2010/07/12

MyOpera BlogをMT形式でExport

Opera BlogでJavaScirptが使えないのでBloggerに移行した。

しかしOpera Blogにはexport機能がないので、
  1. 過去データをmetaWeblog APIとWeb::ScraperでMT形式に変換
  2. http://code.google.com/p/google-blog-converters-appengine/のmovabletype2blogger.shでxmlに変換
MT形式に変換するスクリプトは以下

2010/07/05

Plack::Middleware::Parallel::Scoreboard

ちょうどPlackでServerStatus表示機能が欲しかったところで、Parallel::Scoreboardの話しを聞いのでPlack::Middlewareにしてみた。

http://gist.github.com/464066

Opera blogはJavascript使えないから困る

2010/03/30

MySQL Proxyをちょっと触った

MySQL Proxyを少し触ったのでメモ

MySQLサーバとクライアントに入るミドルウェア。
現在のversionは0.8.0でbeta状態。

--proxy-addressで自分の待ち受けポート等を指定できる。
FAQだとsocketで待ち受けはできないって書いてあるけど、すげー下の方にあるコメントを読むと待ち受けできるよ!って書いてあった。
実際できる。

ただし作成されるsocketの権限が1755で、オーナーが--userで指定したユーザではなく起動ユーザになっているので、
他のユーザから書き込めない可能性がある。
CentOS 5.4Finalのyumから入れたmysqld-serverだとデフォルトで作成されるsocketは1777になっていた。
同じパーミッションに変更してあげると普通にmysql-clientからも接続できた。

またmysqlはデフォルトでsocketとTCP接続の両方で待ち受けるけど、MySQL Proxyはどちらか片方でしか待ち受けできない。
localhost上にあるMySQLへの接続をProxyしようとすると、MySQL Proxyを二つ走らせる必要がありそう。

シグナルの処理がおかしい気がする SIGTERMとかSIGHUPを送っても反応がなかったりとか。

2010/03/05

Mojoliciousのメモ

Mojoliciousをちょっと使ってて覚えたことをメモ。

まずリダイレクトではまった

Apache(mod_proxy)+Mojolicious(daemon_prefork)の構成


ProxyRequests Off
ProxyVia On
ProxyPass /hoge/ http://localhost:3000/
ProxyPassReverse /hoge/ http://localhost:3000/

上記のように設定して、http://example.com/hoge/をhttp://example.com/hoge/fuga/xxxxxにredirectしようとredirect_toを使ったら、http://example.com/fuga/xxxxxにredirectされた。

原因はMojoliciousのredirect_toが吐き出すLocation headerが相対URLだったため、ProxyPassReverseでドメインが書き換えられなかったことだった。

解決策としてMojolicious::Controllerを継承したクラスにredirect_to_absを実装した。


package MyApp::Controller;

use strict;
use warnings;
use base 'Mojolicious::Controller';

sub redirect_to_abs {
my $self = shift;
my $url = $self->url_for(@_);
return $self->redirect_to( $url->to_abs->to_string);
}
1;


次にpathのcaptureで時間を食ったのでメモ

pathをcontroller側でパラメータとして受けとる場合は下記のようにしないといけない。

my $r = $self->routes;
$r->route('/hoge/:id')->to('example#hoge', id => undef);

"id => undef"がポイント。デフォルト値を与えない場合は明示的にundefを渡してやらないと、controller側で値を取得できない。

controller側では下記のようになる。

package MyApp::Example;

use strict;
use warnings;
use base 'Mojolicious::Controller';

sub hoge {
my $self = shift;
my $id = $self->param('id');
}
1;

Catalystみたいに$cに続いてキャプチャできるのかと思ってたら、全然違ってハマった。

2010/02/04

VMware上のUbuntuの移行でnetworkに接続できない

会社で使用しているPCがリースアップするため、新PCに移行作業中におきた現象。

旧PCで使用していたUbuntuのイメージを新PCへコピーしたところ、ネットワークに接続できなかった。
原因はNICのMACアドレスが変更されていたため、eth0になるべきところがeth1になっていたことだった。

検索すると同様の現象が結構でてきた。
VMWareのUbuntuは複製するとNetwork設定変更が必要

udevのruleを書きかえて再起動で無事ネットワークに接続可能になった。