タグ

ブックマーク / gfx.hatenadiary.org (31)

  • ISUCON3 に参加しました - Islands in the byte stream (legacy)

    id:yappo & id:kamipo とチーム「潰すつもりで来てください」を結成してISUCON3に参加してきました。結果は(失格にならなければ)11位で予選は通過できそうです。 YappoLogs: ISUCON3 で暫定で戦進出らしいです #isucon 好きな子のことかslow query logのことばかり考えてほかのことがおろそかになる性格なおしたい #isucon - かみぽわーる 選んだ言語はPerlで、できあがったコード(アプリ)はこちら*1: https://github.com/kamipo/isucon3 チーム全体としてはkamipoさんとYappoさんが二人三脚でSQLのクエリ改善をして、ぼくがそれ以外で主にアプリコードところを見るという感じで、役割分担がはっきりできていてよかったかなと思います。 ただ個人的にできなかったことがとてもたくさんあるので課題を感

    ISUCON3 に参加しました - Islands in the byte stream (legacy)
    yappo
    yappo 2013/10/08
    コンフリクト怖い問題は単純にチームプレイしてないだけのせいだから本戦でしようず RT @__gfx__: blogged / “ISUCON3 に参加しました - Islands in the byte stream”
  • PerlでWebAppの開発に必要なN個のこと - Islands in the byte stream (legacy)

    あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずPerlについて知っていることを書いた。 パッケージマネージャ まずライブラリの管理。モジュールをインストールし、可能であればバージョンを固定し、適切にロードする機能が必要だ。Perlの場合は cpanm というCPANクライアントでライブラリをインストールする。バージョンの固定とライブラリパスの設定は carton で行う。 https://github.com/miyagawa/cpanminus https://github.com/miyagawa/carton アプリケーションサーバ Webサーバへのインターフェイスとしては、PSGIという仕様がある。PSGIに準拠したツールキットとしてPlack

    PerlでWebAppの開発に必要なN個のこと - Islands in the byte stream (legacy)
    yappo
    yappo 2013/09/10
    やったね!perlネタでも100usersこえたよ!
  • Re: Re: perl 5.16.0 でメモリリーク? - Islands in the byte stream (legacy)

    perl 5.16.0 でメモリリーク - たごもりすメモ Re: perl 5.16.0 でメモリリーク? - tokuhirom's blog 修正してpull-requestを送りました。 https://github.com/mirrors/perl/pull/9 https://rt.perl.org/rt3/Ticket/Display.html?id=114340 ※ githubのpull-req/issuesではなくperlbugでレポートしてほしいとのこと。今回は tokuhiromの報告があったのでそれで。パッチ自体は問題ないようなので、Perl 5.16.1 では修正されるでしょう。 以下蛇足。 せっかくなので、何を考えながらデバッグしたかを記録しておく。 今回のバグはSVのリークではなくmalloc()したメモリの開放忘れだったので、Test::LeakTrace

    Re: Re: perl 5.16.0 でメモリリーク? - Islands in the byte stream (legacy)
    yappo
    yappo 2012/10/05
    @__gfx__ これどうなったかしってる? 5.16.1 の perldelta で言及されてないっぽいけど
  • IRC botを駆使すると捗るらしいので手始めにlleval bot作った - Islands in the byte stream (legacy)

    Yokohama.pm#8でのYappoの話によれば、IRC botを駆使すると捗るらしい。 IRC botは作ったことがなかったので練習としてllevalを実行するbotを作ってみた。botのフレームワークとしてはAnySanを使い、llevalへのアクセスはLLEval-Clientを使った。 https://github.com/gfx/LLEval-Client/blob/master/example/irc-bot.pl #!perl -w use strict; use 5.10.0; use AnySan; use AnySan::Provider::IRC; use LLEval; use Encode qw(encode_utf8 decode_utf8); use constant _DEBUG => $ENV{LLEVAL_BOT_DEBUG}; use if _DE

    IRC botを駆使すると捗るらしいので手始めにlleval bot作った - Islands in the byte stream (legacy)
    yappo
    yappo 2011/11/21
    iine
  • 来年から株式会社ディー・エヌ・エーで働きます - Islands in the byte stream (legacy)

    文系・不況・経歴に傷ありと三重苦を負っての就職活動でどうなることかと心配でしたが、無事就職活動を終えることができました。DeNAに就職します。Perlができると就職できるというのは当でしたね。 今回の就職活動においては、竹迫さんと牧さんには具体的な相談に乗っていただくなどお世話になりました。改めて御礼申し上げます。またその他関わった方々にも感謝致します。 私が就職できたのは、Shibuya.pmがあればこそ。Shibuya.pmというコミュニティへの参加が、ソフトウェアエンジニアとして生きることに確信を与えてくれたのです。竹迫さんをはじめとして、tokuhiromや牧さん、宮川さん、Yappo、typesterさんなどから得たものは、それ以前の独学で得たものより遥かに多様でした。特にtokuhiromとの出会ったことで、人とプログラミングについて語る喜びを知ったのは大きな財産です。牧さん

    来年から株式会社ディー・エヌ・エーで働きます - Islands in the byte stream (legacy)
    yappo
    yappo 2010/05/25
    おめおつこれよろ
  • MouseX::Types 0.04 released with type predicates - Islands in the byte stream (legacy)

    MouseX::Typesに著作権情報を付加するついでに、オリジナルに搭載されている型述語関数も追加した。ただし、オリジナルと異なり、明示的に指定しない限りエクスポートはしない*1。 #!perl -w use 5.010; use Any::Moose; use Any::Moose 'X::Types::' . any_moose() => [qw(is_Int)]; say is_Int(42) ? "ok" : "not ok"; # => ok say is_Int(3.14) ? "ok" : "not ok"; # => not ok これらはMouse::XSの元ではXS関数を直接呼び出すため非常に高速である。 *1:MooseX::Typesは型名を指定すると"is_型名"も同時にエクスポートする。たとえば、use MooseX::Types::Moose qw(Int)

    MouseX::Types 0.04 released with type predicates - Islands in the byte stream (legacy)
  • Mouse 0.37 released - Islands in the byte stream (legacy)

    Mouse 0.30-0.35間で一部後方互換性を壊してしまっていたので,0.36-0.37で修正しました。ご迷惑おかけしました。 まだ完全に自動化はしていないものの,HTTP-Engine*1とArkについてはリポジトリからpullしてmake testを行うスクリプト*2を書いたので,後方互換性の問題は起きにくいと思います。 その他のMouse依存ディストリビューションも順次上記のスクリプトの加えます。 *1:HTTP-EngineやMouseX::Typesについてはテストしていましたが,CPAN上のリリースバージョンを手動でテストしいていただけなので確実とは言えませんでした。 *2:author/test-externals.pl

    Mouse 0.37 released - Islands in the byte stream (legacy)
    yappo
    yappo 2009/09/28
    あざっす
  • Mooseの速度が遅いという議論のまとめと感想 - Islands in the byte stream (legacy)

    Adam Kennedy (ADAMK)が「Array::CompareでMooseを使わないようにしてくれ」とRTでチケットを作成したことがきっかけとなり,Mooseの速度について議論が起きています。以下ラフなまとめ。 #49270: Remove the use of Moose - RT Array::CompareではMooseを使わないでほしい。Mooseを使いつづけるならばコマンドラインアプリケーションでは使うに堪えないし,PadreでもArray::Compare依存をなくすつもりだ。 Moose or No Moose - Perl Hacks (Array::Compareの作者ブログ) 最近いくつかのモジュールをMoose化しはじめたのだが,「Mooseを使うな」と言われてしまった。Mooseは楽なので使い続けたいが,どうしたものか。 Re: Moose Or No M

    Mooseの速度が遅いという議論のまとめと感想 - Islands in the byte stream (legacy)
    yappo
    yappo 2009/09/02
    testが遅いのは耐えられない
  • Released CvGVs could cause SEGV - Islands in the byte stream (legacy)

    型グロブの内部表現であるGVは,そのシンボルで表現されるグローバルなスカラー(SV),配列(AV),ハッシュ(HV),サブルーチン(CV),ファイルハンドル(IO)などのオブジェクトを所有するオブジェクトである。 この「所有」とは,実際にSVへの参照(ポインタ)を持っているという意味のほかに,リファレンスカウントを管理する責任があるという意味もある。つまり,GVが解放された時には,所有しているすべてのSVのリファレンスカウントをデクリメントする。 ところで,他のSVファミリと異なり,CVだけはどのGVに所有されているかを知っている。つまり,CV構造体は所有者であるGVを参照するフィールドを持つ。これにより,Sub::Identityが提供するget_code_info()のようなことが可能となっている。 しかし,もしCVもまたGVを「所有」しているとすれば,それは循環参照になってしまう。こ

    Released CvGVs could cause SEGV - Islands in the byte stream (legacy)
  • Don't write "HTTP::Engine::Response" - Islands in the byte stream (legacy)

    HTTP::Engine::Responseと書かなければならいのがなんだか煩わしい。 HTTP::EngineのSYNOPSISより: sub handle_request { my $req = shift; HTTP::Engine::Response->new( body => Dumper($req) ); } これを↓みたいに書きたい。 sub handle_request { my($req, $res) = @_; $res->print( Dumper($req) ); return; # $resを返す必要すらない } こうなると,まずhandle_request()が完全にHTTP::Engine非依存になるため,たとえばHTTP::Engine::MinimalCGIのようなHTTP::Engine互換のモジュールと自然に切り替えられる。 そのうえ,$resの自由度

    Don't write "HTTP::Engine::Response" - Islands in the byte stream (legacy)
    yappo
    yappo 2009/06/09
    いっぱい handler_request 書く時は面倒くいのは同意だけど、それはアプリでカバーするのが良いんじゃないかとも思ったりするのと、$resの自由度の拡張性の下りがいまいち想像出来なかったのでkwks
  • Yet another alias module: Scalar::Alias - Islands in the byte stream (legacy)

    Lexical::Typesを見て型つきレキシカル宣言の威力を知り,試してみたくなったので一つモジュールを書いてみた。 Scalar::Alias - search.cpan.org この型つきレキシカル宣言はうまく使うといろいろ面白いことができそうだ。しかもオーバーヘッドがコンパイル時のみというのがうれしい。 #!perl -w use strict; use Scalar::Alias; sub inc{ my alias $x = shift; $x++; return; } my $i = 0; inc($i); print $i, "\n"; # => 1 __END__ エイリアスを実現するモジュールは既に数多くあるが,このモジュールは高速であることが特徴となっている。これは,PL_peeppハックによってコンパイル済みの構文木を直接変更しており*1,レキシカル変数の参照と代入

    Yet another alias module: Scalar::Alias - Islands in the byte stream (legacy)
    yappo
    yappo 2009/05/21
  • XSで共有文字列を活用する - Islands in the byte stream (legacy)

    Perl 5.8以降には共有文字列というメカニズムがあり,非常に限定的ながら,うまく使用するとメモリと速度の双方を節約できる。 基的な使い方: SV* sv = newSVpvn_share(pv, len, hash); SV* sv = newSVpvs_share("..."); これでsvの文字列部分がインタプリタ全体で共有されるため,同じ文字列を複数個生成してもmalloc(3)は一度で済む。 実際には,共有文字列SVの生成速度そのものは通常の文字列SVよりも遅いことがある。しかし,共有文字列の真価は,ハッシュキーとして使用する際に発揮される。 ハッシュからキーを検索する際にはキーとなる文字列の照合*1を行わなければならないが,共有文字列はポインタ値がインタプリタを通して等しいので,文字列の照合は行わなくてすむ。また,共有化文字列SVは内部にハッシュ値*2を持っているので,ハッ

    XSで共有文字列を活用する - Islands in the byte stream (legacy)
    yappo
    yappo 2009/05/08
    ruby の :key => 'value' の :key みたいなもんかの
  • Opcodeのトレース - Islands in the byte stream (legacy)

    Perlを-DDEBUGGINGつきでビルドするとPerl体にOpcodeトレース機能が付く。 $ perl -Dts -e 'print "Hello, $ARGV[0] world\n"' Perl EXECUTING... => (-e:0) enter => (-e:0) nextstate => (-e:1) pushmark => * (-e:1) const(PV("Hello, "\0)) => * PV("Hello, "\0) (-e:1) aelemfast => * PV("Hello, "\0) PV("Perl"\0) (-e:1) concat => * PV("Hello, Perl"\0) (-e:1) const(PV(" world\n"\0)) => * PV("Hello, Perl"\0) PV(" world\n"\0) (-e:1) con

    Opcodeのトレース - Islands in the byte stream (legacy)
    yappo
    yappo 2009/04/28
  • リスト代入の不思議 - Islands in the byte stream (legacy)

    スカラーの代入 { x = y } が左辺値そのものを返すというのは分かりやすい。 しかし,リスト代入 { (x) = (y) } が返す値は左辺値ではない。というか,現在の実装は挙動が不安定でバグもある。 左辺値を返すように見える例: #!perl use feature 'say'; say scalar do{ my @a = (1 .. 10) }; # => 10 (要素数) say join(' ', do{ my @a = (1..3) }; # => 1 2 3 (リスト) __END__ ちょっと変な例: #!perl use feature 'say'; say scalar do{ my %h = (a => 1, b => 2) }; # => 4 (要素数?) # 比較 my %h = (a => 1, b => 2); say scalar %h; # => 2

    リスト代入の不思議 - Islands in the byte stream (legacy)
    yappo
    yappo 2009/04/17
  • B::Foreach::Iteratorでforeachイテレータを進める - Islands in the byte stream (legacy)

    B::Foreach::Iteratorというモジュールを書いた*1。 use B::Foreach::Iterator 0.02; foreach my $key(foo => 10, bar => 20, baz => 30){ printf "%s => %s\n", $key => iter->next; } iter->next()*2はforeachループのイテレータをひとつ進め、その値を返す。 また、iter->peek()はイテレータを進めることなく、次のイテレータを返す。 このモジュールを実装するにあたってpp_hot.cのpp_iter()を読んだのだが、確かにforeach ($min .. $max)は内部で配列を生成していない。また、foreach (reverse ...)についても最適化が行われており、reverse()した一時配列を作るのではなく、イテレータ

    B::Foreach::Iteratorでforeachイテレータを進める - Islands in the byte stream (legacy)
    yappo
    yappo 2009/04/02
    nice
  • Pure PerlによるPerl5 Virtual Machineの実装 - Islands in the byte stream (legacy)

    Perl VMの気持ちを知るには、PurePerlで実装してみるとよい。 コード例(PerlVM.pmのコードは記事の末尾にある): #!perl -w use strict; use PerlVM; my $x = shift || 42; PerlVM::call_sv(sub{ print "Hello,", " world!", "\n"; if($x){ print $x, " is true\n"; } else{ print $x, " is false\n"; } }); __END__ 実行結果: $ perl hello.pl Hello, world! 42 is trueむろん、PerlVM::call_sv()の中で引数を呼び出したりはしていない。 Hello, world!くらいならPerlVMの中身も比較的単純だ。そのメカニズムはBモジュールに依存している。B

    Pure PerlによるPerl5 Virtual Machineの実装 - Islands in the byte stream (legacy)
    yappo
    yappo 2009/03/30
  • SYNOPSISの構文を自動でチェックする - Islands in the byte stream (legacy)

    新しいモジュールの使い方を調べるときに真っ先に目を通すのがPODのSYNOPSISセクションである。特に,英語が母語ではないPerlerにとってはPODの中で最も重要なセクションといっても過言ではない。それだけに,自らモジュールを書くときは細心の注意を払う。 ところで,その内容の構文チェックは今まで手動でやっていたのだが,Test::Weakenのテストファイルを眺めていると面白いテストがあった。synpsis.tというのがそれで,PODのSYNPISISセクションの中身を抜き出して実行するというものだ。考えてみれば,構文チェックで十分なら特別なモジュールのサポートを得なくても簡単に書くことができる。 そこで,一般化してModule::Setup用のテンプレートにしてみた。 #!perl -w use strict; use Test::More tests => 1; use [% mo

    SYNOPSISの構文を自動でチェックする - Islands in the byte stream (legacy)
  • 既存の特異メソッドモジュール - Islands in the byte stream (legacy)

    Perlで特異メソッドでは「標準モジュールにも特異メソッドを実現するものはない」と書いたが,そういえばPerl 5.10.0から標準モジュールになったObject::Accessorというものがあることを思い出した。これは直接特異メソッドを定義するのではないが,振る舞いとしては特異メソッドそのものである。実際,Class::Monadicもadd_field()というアクセサを作成する機能を提供している。 Object::AccessorのSYNOPSISより: ### using the object as base class package My::Class; use base 'Object::Accessor'; $obj = My::Class->new; # create base object $bool = $obj->mk_accessors('foo'); # cr

    既存の特異メソッドモジュール - Islands in the byte stream (legacy)
  • Perlで特異メソッド - Islands in the byte stream (legacy)

    Ruby界隈ではあたりまえのように使われる特異メソッド*1だが,Perlでは組み込みでのサポートはなく,標準モジュールにも特異メソッドを実現するものはない。Class::MOP/Mooseの匿名クラスが似た用途を持っている*2が,オブジェクトの実装型に制約がある。たとえば,以下のコードは動かない。 #!perl -w use strict; use IO::File (); use Moose (); my $anonclass = Moose::Meta::Class->create_anon_class( superclasses => [qw(IO::File)], methods => { hello => sub{ my $self = shift; $self->print("Hello, world!\n"); }, } ); my $io = $anonclass->new

    Perlで特異メソッド - Islands in the byte stream (legacy)
    yappo
    yappo 2009/02/14
    Class::Component::Component::Autocall::SingletonMethod っての作った事ある
  • 先の記事のList::Utils::firstの使い方は間違っている! - Islands in the byte stream (legacy)

    先の記事の「List::Util::firstは遅い」でのfirst{expr}の使い方が間違っていました orz first{expr}は+(grep{expr} ...)[0]に等しく,ブールコンテキストでのscalar(grep{expr}...)に等しいのはList::MoreUtils::any{expr}です。ただしパフォーマンスについての結論は同じで,要素数が少なければgrep > anyとなります。 TODO: grep/first/anyその他についてのまとめをあとで書く(perl-users.jp向き?)。

    先の記事のList::Utils::firstの使い方は間違っている! - Islands in the byte stream (legacy)