2014年07月10日

タイトルですべてを語っていますし、http://blog.livedoor.jp/sonots/archives/32645828.html あたりを読むと良いのですがメモ。

最初にまとめると

  • CORE::print() を使う場合は 4096 or 8192 byte 以下に収めること
  • CORE::syswrite() なら混ざらない
  • 男は度胸。flock(2)する

ということです。
これでわかった人は読む必要ありません。

以下蛇足。

はじめに

perl ではファイルハンドルに書き込むときには何も考えずに CORE::print() を利用しますが、この人はなんかいい感じにバッファリングしたり、長い文字列だったらぶった切ってくれたりしてくれます。

で、普通はバッファリングのことはみんな意識しているので以下のようにヒットアンドアウェイをやったりしますね。close() で自動的に flush されるので、まぁだいたい autoflush(1) しているのと同じでしょうという発想です。

open my $fh, '>>', $file;
print $fh $message, "\n";
close $fh;

大抵のケースでは嬉しい事にこれでログが混ざらずに綺麗に見れます。
しかし、超絶に長いメッセージを書き込もうとした場合にこれだと混ざる可能性があります。

分割されてしまうサイズを調べる

超絶長いのがいくつかというとこれまた環境によって異なるのですが、以下のようにするとさくっとわかります。

$ cat > foo.pl
my $s = 'a' x (1024 * 100);
open my $fh, '>>', "/tmp/$$";
print $fh $s;
close $fh;
^D
$ strace perl foo.pl 2>&1 | grep write
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 8192) = 8192
...

とかなって、write(2) が複数回呼ばれていることがわかりますね。
そして、どうやら 8192byte で切られている模様です。*1

こうなると、普通にマルチプロセスで書き込んでいた場合は context switch が発生してログが混ざること請け合いですね。

具体的には以下のようにすると簡単に確認できます。

$ cat > bar.pl
my $char = shift || 'X';
my $str = $char x (1024 * 10); # 8096 byte 以上書き込む

for (1..1000) {
    open my $fh, '>>', '/tmp/test';
    print $fh $str, "\n";
    close $fh;
}
^D
$ perl bar.pl A &; perl bar.pl B &
$ grep A /tmp/test | grep B | wc -l
13

13行ぐらい混ざっちゃったっぽい!

syswrite を使う

print() では混ざっちゃうことが確認できたので、syswirte を使いましょう。

$ cat > hoge.pl
my $s = 'a' x (1024 * 100);
open my $fh, '>>', "/tmp/$$";
syswrite $fh, $s;
close $fh;
^D
$ strace perl hoge.pl 2>&1 | grep write
write(3, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"..., 102400) = 102400

こうすると、write(2) 一回だけになっていることがわかります。
上記の記事にあるように write(2) 一発は atomic であることがある程度保証されているので、基本的にはこれだけでおっけーでしょう。

ファイルシステムのことを気にしたくないひと

flock(2) しましょう。

まとめ

でかいログを吐かない。

  • *1 : ちなみに 4096 の環境もありました。 PERLIOBUF_DEFAULT_BUFSIZ だと思ったけど違うのかな?


xaicron at 02:40コメント(0)トラックバック(0)Perl  このエントリーをはてなブックマークに追加

2014年04月01日

Web::Query 0.26 より、prev()next() というメソッドが追加されました。
なにかというと、previousSibling と nextSibling のことであります。つまり同一階層の前後の node が簡単に取れるやつですね。

use feature 'say';
use Web::Query;

my $html = << 'HTML';
<div id="container">
  <p class="a1">foo</p>
  <p class="a2">bar</p>
</div>
HTML

say wq($html)->find('.a1')->next->as_html; # <p class="a2">bar</p>

って感じ。



xaicron at 01:31コメント(3)トラックバック(0)Perl  このエントリーをはてなブックマークに追加

2014年01月25日

tag だけ打って CPAN には上げたくないなーってときは

$ FAKE_RELEASE=1 minil release

としますが、仕事のプロダクトとかで絶対に CPAN にあげないようなものの場合は毎回指定するの面倒な上にミスったら死ぬのでなんとかしたいことでしょう。

でも v0.9.0 からは release.do_not_upload_to_cpan という設定が追加されたので、minil.toml に

[release]
do_not_upload_to_cpan= true

とか書いておけばハッピーですね。



xaicron at 01:41コメント(8)トラックバック(0)Perl  このエントリーをはてなブックマークに追加

2014年01月08日

JSON::XS 3.0 から JSON::XS::true|false が JSON::XS::Boolean クラスから JSON::PP::Boolean に変わってたので、Data:Util::is_instance() とかで JSON::XS::Boolean かどうかで分岐していた部分が動かなくなっていて諦めて

if (is_instance $bool, 'JSON::XS::Boolean' or is_instance $bool, 'JSON::PP::Boolean') {
    ...
} 

とかにした。(モジュールのバージョンが環境によって 3.0 だったりその前だったりすることがあるため)

が、JSON::PP::Boolean は Types::Serializer::Boolean の alias であるため

if ($bool && Types::Serialiser::is_bool $bool) {
    ...
}

とかするのがよいのであろうこと請け合い。



xaicron at 20:21コメント(6)トラックバック(0)Perl  このエントリーをはてなブックマークに追加

2013年07月18日

Perl徹底攻略 (WEB+DB PRESS plus) [大型本]

大沢 和宏 cho45(さとう) 小林 篤 和田 裕介 嶋田 裕二(xaicron) 牧 大輔(lestrrat) 奥 一穂 広木 大地 伊藤 直也 長野 雅広 藤原 俊一郎 伊藤 智章 まかまか般若波羅蜜 小飼 弾 近藤 嘉雪 中川 勝樹 宮川 達彦 tokuhirom 藤 吾郎(gfx) 村瀬 大輔
技術評論社


最近の Perl 事情はもとより、第一線で働いている人たちが書いているので、内容は超実用的です。
Perl を書いてる人や、昔書いてた人、さらにはこれからやろっかな〜って人にはおすすめの一冊です。

なにげに描き下ろしもかなり豪華です。



xaicron at 15:20コメント(45)トラックバック(0)Perl  このエントリーをはてなブックマークに追加

2013年06月11日

6/3 〜 6/5 にメインで開催された YAPC::NA 2013 に参加して来ました。特に JPA のなんたらではなく、会社のお金で行って来ました!! DeNA++

日本からは、@yusukebe@tokuhirom と The Perl Foundation の President であるところの Karen が参加していました。

https://lh3.googleusercontent.com/-AUINdfCLbyA/UbRZjBoOAdI/AAAAAAAAB90/z2rXLovjzhk/s640/P1010210.JPG

すでに @yusukebe と @tokuhirom がレポートを書いているので、パクかぶっているところもあるかと思いますが、ご容赦を!

開催場所

今回の YAPC::NA の開催場所は、アメリカはテキサス州にあるオースティン大学でした。日本からだと、成田とかからサンフランシスコ or ヒューストンに行ってから乗り継いでオースティン空港って感じで、すんなり行けば 14時間ぐらいで行ける。すんなり行けば。

https://lh4.googleusercontent.com/-0J9YvqvRw9I/UbRZp0vod0I/AAAAAAAACcA/pFsh81bH7Ks/s640/P1010092.JPG
サッカースタジアムとかあってでかい。(大学の正門撮り忘れました)

ホテル

DoubleTree ホテルっていうのに泊まりました。YAPC::NA の参加者はみんなおんなじホテルに泊まっていたっぽい。ホテルのロビーで @sartak にばったりであったりしました。

https://lh6.googleusercontent.com/-w6BKNL2PVqY/UbRY2XxwDbI/AAAAAAAABxA/nlzX39Za1zg/s640/P1010347.JPG

名だたる Perl Hacker たちは、朝までロビーで Hackathon してた模様だけど、僕ら日本人は時差ボケやら疲れやらで結局ホテルに戻ったら即効で寝てましたね!

朝食が出る

https://lh5.googleusercontent.com/-0VlRuHMYESA/UbRZvMP8rYI/AAAAAAAACBY/7rOkcmUfC2A/s640/P1010103.JPG

YAPC::NA は毎日ケータリングの朝食が出てました。というわけでだいぶ朝早いんですが、完全に時差ボケってたので早起きして食べに行ってました。

https://lh3.googleusercontent.com/-Nd9pIIp3FKY/UbRZwq3MOMI/AAAAAAAACCA/cpkub4ms4ls/s640/P1010107.JPG
スプライトでやたらとはしゃぐ tokuhirom

リスがやたらいる

https://lh6.googleusercontent.com/-m_Uv3Itf0rE/UbRZsvurEdI/AAAAAAAACAo/kJCrD-SpSJk/s640/P1010097.JPG

とにかくやたらめったらリスがいる。初日はパシャパシャとっていたが、二日目以降は全く気にしなくなる。そのぐらいやたらといる。

コーヒーが無限に出てくる

トークが終わるごとに休憩時間が 15分あり、ロビーに行くと無限コーヒーがおいてあるので自然と人が集まって交流が生まれる。

https://lh6.googleusercontent.com/-bKs5NuJrtEE/UbRZvaq8T7I/AAAAAAAACBg/g9Xm9UFZouE/s640/P1010104.JPG

休憩のたびにコーヒー飲んでたら、やっぱり日本人は珍しいのか常に話しかけられる状態になっていて、ぼっち感は全然ありませんでしたね。

ちなみに、初日に LT をやったおかげで二日目以降は「お前の LT 面白かったぜ!!」って気軽に話しかけてくれて嬉しかったですね〜。

Larry Wall がお菓子をこっそりカバンに詰めてた

コーヒーの他にも、お菓子がちょいちょい出てくるのですが、Larry Wall がコソコソしながらカバンに詰め込んでいました。これ、日本でもやってたなーと懐かしい思いに。

https://lh6.googleusercontent.com/-YB_Wg6zlAQk/UbRYDQack4I/AAAAAAAABh4/0n2zeg7-Q1w/s640/P1010225.JPG
お菓子を物色する Larry

ちなみに、「こんにちわ!」って話しかけてくれました!やった〜。

リボン

https://lh6.googleusercontent.com/-hWM0M22IvQU/UbRY7py_2MI/AAAAAAAAByM/d__D1ozNq7U/s640/P1010117.JPG

すごい出来がいいリボンがおいてあって、自分にタグ付けして遊ぶみたいなことをしてました。話のフックにもなるし、本当に出来がいいのでついつい休憩のたびにつけてました。

https://lh6.googleusercontent.com/-USaVDEJl3Uw/UbRX6Jlx0lI/AAAAAAAABfY/VL0UgjHcT90/s640/P1010497.JPG
最終的にはこんなふうになった。

名札

https://lh6.googleusercontent.com/-zMKmbtVs0iw/UbRXSLwt_pI/AAAAAAAABS8/rVRB1JdcMl4/s640/P1010397.JPG
「俺は Patch っていうんだすげーだろ!」ってことを言ってきたので撮らせてもらった。

名札はこんなかんじで本名がでかでかと書いってあって、あんまり id は重要視されてないっぽい感じだった。QR コードを読み取ると、名札の情報がゲットできる。QR コード読み取った人から早速にメール来てたりしてた。

個人的には、id とかもうちょいデカ目であとはアイコンとかが写ってたほうがわかりやすいかな〜とは思ったけど、このへんは文化の違いかも。

あと、思った以上に自分の名前の Yuji っていうのは発音しづらいらしいことがわかりました!ゆーじぇとか言われてた。あと yusuke はユースキーとか。tokuhirom にいたっては「俺のことは J と呼べ!お前のことは T と呼ぶ!」とか言われてて予想以上に日本人の名前難しいことがわかった。

Tシャツとかご自由にどうぞ

もしかしたら、チケットに Tシャツつけたりしちゃいけないとかそういう法律的な話が絡んでるのかもしれませんが、Tシャツとかマグカップとかはその辺においてあるので自由に持っていけ!って感じでした。

「Tシャツもらったら TPF にちょいとでも寄付してね」ってことみたいだったので、paypal でお金を払いましょう!! (thanks tokuhirom)

https://lh6.googleusercontent.com/-zWvwDzYNt5U/UbRY3jzrIPI/AAAAAAAABxU/or0HYDEOuNw/s640/P1010350.JPG

毎日 Keynote がある

Keynote が毎日ありました。このへんは tokuhirom が書いているので割愛。
day1 の FORTRAN!! はマジでビビった。

https://lh3.googleusercontent.com/-MBZidmMmyl8/UbXojubnBoI/AAAAAAAACcg/BG5cyJDbcRc/s800/1370875994tV2gEZkzTqMQF1f1370875993.gif
mst が動く動画が面白かったので、取り急ぎ gif アニメを作っておきました。

day3 の最後の mst の 「Future Perl is You!!!!!!」はやはりとても印象的でした。
「俺が、俺達が Perl だ!」と言えるようになりたいですね。

LT の合間にスポンサートークがある

スポンサーは基本的にあんまり前に出てこない感じなんだけども、LT の切り替えの時に、1分間小話みたいな感じで面白いことを話す!っていうのが印象的だった。LT の転換待ってる間に飽きなくてよいですね。

https://lh4.googleusercontent.com/-Hiv_kHVP5u8/UbRXYqJJHJI/AAAAAAAABU0/1gjozkLEYbY/s640/P1010412.JPG

あとは急に踊り出したりする。

ドラおやじがいる

普通のトークとかは一切タイムスケジュールをする人とかいない、というかスタッフがそもそも話す部屋にいなかったりして勝手に始める感じでだいぶ自由なんだけど、LT はちゃんと時間を計っていて終わる時はおっちゃんがドラを叩いてた。

https://lh5.googleusercontent.com/-MdFktQTkKHM/UbRXpbyvUbI/AAAAAAAABaU/K5AwTA8ZBWw/s640/P1010457.JPG
ドラおやじの中の人

hallway++

アメリカとかだとやっぱり遠くからくる人が多くて、たまにしか会えない感じがある。トークとかは後でビデオで見れるしそんなことよりも俺と廊下で語ろうぜ!みたいな感じな人が結構いましたね。

lunch

ランチは外に行くならこのへんで食え!みたいなのが YAPC::NA のページにあったので、適当にチョイスして行ったりしてました。大学の近くには全然食うような場所なくて、炎天下の中歩きまわったりしてた。

https://lh4.googleusercontent.com/-lJ_G7Ln3H4U/UbRYJB7HHRI/AAAAAAAABjk/NU-yQ1wk_WE/s640/P1010239.JPG

でも最終日になってようやく、ホールの一回に飯を食べるところがあったのを知って、だいぶあれな気持ちになりましたね!

https://lh6.googleusercontent.com/-xKGYKV9ACc8/UbRXK2VOavI/AAAAAAAABQo/rt-Gs1cIDp4/s640/P1010373.JPG

ここで Karen と話をして、かなりカルチャーちがうよね〜的な話をしました。Karen は自腹で着てるけど、@yusukebe とか @tokuhirom は JPA のお金でこれていいですね!海外派遣制度は素晴らしいね!みたいな話もしました。

Dinner

日本と違うなーって思ったのは、みんなお酒飲む時は基本的にご飯食べない。食べる時は食べる。飲む時は飲む。って感じであった。

Day1 は適当にその辺の人と話してて BoF あるからピザ行こうぜ!的な感じでピザに行きました。

https://lh5.googleusercontent.com/-A9diBhCTTss/UbRZcnCK0kI/AAAAAAAAB78/Ca-rWbLUu2Y/s640/P1010195.JPG

うまかったけどだいぶ量が多かった。

https://lh6.googleusercontent.com/-buDsy2fD8Ts/UbRZa_BqjvI/AAAAAAAAB7c/CtobRdXia7E/s640/P1010191.JPG
あと、遠藤ってなんだろうな。

Day2 はスクールバスで Game Bar 的なところに移動。これはスポンサー持ちでタダでした。素晴らしい!

https://lh5.googleusercontent.com/-RRdTnwrr06I/UbRYm_rlpcI/AAAAAAAABs4/02Qfpgt05zQ/s640/P1010313.JPG

なんか、なぞの日本語 Tシャツを着てる人がいて「これはどういう意味だ!」って聞かれたけど「No meaning!」って答えておきました。

https://lh5.googleusercontent.com/-Mfg6keyRuRQ/UbRYxPdMnAI/AAAAAAAABvc/A0CGDBHicpU/s640/P1010333.JPG
タオツポス...?

Day3 は Speaker Dinner だったんですが、+1 連れてきてもいいぜ!ってことでなんとなく付いて行きました。

https://lh5.googleusercontent.com/-28XdAJVbepg/UbRX3nyCbtI/AAAAAAAABek/GC4ne4hnNAQ/s640/P1010491.JPG

Ovid とか ingy とか mst とか sartak とかいろんな人と話せて楽しかった!

トークについて

やっぱり開発者が多いだけ多いだけあって、Perl6 の話がいっぱいありましたね。チュートリアル的なトークも多かったです。

実装については、MoarVM が注目を集めていて、9月ぐらいまでにはそれなりに動くようにする予定だぜ!みたいなことを熱く語っていました。

https://lh6.googleusercontent.com/-1zrs_pBqnsM/UbRYDKFhrCI/AAAAAAAABhw/LWVK4OuSr1U/s640/P1010224.JPG

さらに、Perl5 については、p2, Moe, gperl といろいろとできてきており、定期的に「Future Perl!!」コールも発生していました。

逆に @yusukebe も言っているように、Web 開発とか運用みたいな話は全くといっていいほどなかった感じでした。

LT した

YAPC::NA いこう!と決めたときには、すでに本トークは閉め切っていたので LT に応募してみたところ、初日に登録されていたのでちょこっと話して来ました。

内容は、pm-uninstall の使い方から始まって、cpanm -U があるからもう pm-uninstall を uninstall しちまおうぜ!っていう感じでしたが、予想以上に色んな意味で受けていたのでひと安心しました。

その後、「おまえのトークよかったぜ!」って話しかけてくれる人がいっぱいいて LT 初日にやれて本当に良かったです。

ちなみに、当日話した内容は

見られます。TOEIC 285点なのでヤバイですね!

あと、@tomita さん、許可無く勝手に登場させてすいませんでした!!

まとめ

まだまだ語りたいことはいっぱいあるのですが、疲れてきたのでこのへんで!とにかくいろいろとカルチャーが違ってものすごく刺激的でした!!

今回は、@tokuhirom と飲んでる時に YAPC::NA の話になって、なんかよくわからないけど「xaicron くればいいじゃん!」って言われたので「じゃあ、まぁ行くか」という軽いノリで決めたのですが、そもそもまず間違いなく一人で行くとこはなかったので、JPA の海外派遣++ でありました。今後も是非続けて貰いたいです!!

最後になりましたが、「ちょっと 6月頭に YAPC::NA 行きたいんですけど」って言ったらあっさりと「じゃぁ言ってきなよ」といってくれたアイコンがちょっとアレゲな上司と、「あれ?予算あったかな。。。」と微妙に心配なことを言っていた AKB48 好きの部長。そして、すべての航空券とホテルの手配をして下さったスーパーヘルパー様に感謝を。DeNA にくれば、海外のカンファレンスに会社のお金で行ける予感!!

ちなみに YAPC::NA 2014 は Orlando らしいです。

https://lh4.googleusercontent.com/-0fpJLbtrP20/UbRXp2Tc9UI/AAAAAAAABac/f6OFkCSH-I8/s640/P1010458.JPG

フロリダ遠すぎ\(^o^)/



xaicron at 10:00コメント(34)トラックバック(0)Perl  このエントリーをはてなブックマークに追加

2013年05月23日

いつも忘れるのでメモ。-i lo0 をつければよい。

$ sudo tcpdump -i lo0 -s0 -A port 6379

とかすれば Redis の通信内容とかみれてあら嬉しい。



xaicron at 17:07コメント(31)トラックバック(0)  このエントリーをはてなブックマークに追加
プロフィール

Perlが少しだけ出来る気になってます。
JavaScriptはよくわかりません。
Rubyもちんぷんかんぷんです。
Pythonは難しいです。
ActionScript勘弁してください。
Javaあばばばばば。
低級言語できません。

github
記事検索
ラノベ
コミック
フィギュア
Bru-ray / DVD
  • ライブドアブログ