タグ

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

  • Perlのbug report echo-systemはどのように素晴らしいのか - Islands in the byte stream

    Perlのbug report eco-systemまわりはOSSとしてはわりと理想的だと思っています。つまり有用なレポートを生成する仕組みがあり、perlコア開発者だけでなくライブラリ開発者もその仕組を活用できるため、可搬性のあるソフトウェアとしてメンテナンスし続けやすいのです。もっとこのあたりはもっと真似されるべき。 まずバグレポートには現象と再現手順と環境の情報が必須ですが、環境の情報は perl -V で非常に簡単に取得できます。これは以下の情報を含みます。 ソフトウェアの名前とバージョン (e.g. perl 5.18.1) ターゲットプラットフォーム (e.g. osname=darwin, osvers=12.4.0, archname=darwin-2level) ビルドオプション (e.g. config_args='-Dprefix=/Users/goro-fuji/.

    Perlのbug report echo-systemはどのように素晴らしいのか - Islands in the byte stream
    ziguzagu
    ziguzagu 2013/12/04
  • ISUCON用にNYTProf+Prefork PSGI serverのベストプラクティスをコマンドにまとめた - Islands in the byte stream (legacy)

    これが価値を発揮するような出題ではなかったので結局つかいませんでしたが。あとでCPANizeはするつもりです。 てきとうなところで ^C でとめると結果を自動的に集計してreportをつくるところまでやってくれます。あくまでも開発用で、番用ではありません。 なおこれを使う場合、アプリ側で DB::enable_profile() / DB::disable_profile() を行う必要があります。tokuhiromのエントリも参照のこと。 #!/usr/bin/env perl # usage: plackup-nytprof --port 1982 app.psgi use 5.10.0; use strict; use warnings; use Cwd qw(getcwd); use File::Path qw(rmtree); sub run { my(@args) = @_;

    ISUCON用にNYTProf+Prefork PSGI serverのベストプラクティスをコマンドにまとめた - Islands in the byte stream (legacy)
    ziguzagu
    ziguzagu 2013/11/11
  • bless($args, $class) is a bad practice - Islands in the byte stream (legacy)

    さいきん散見される以下のようなコードは悪いコードです。 # usage: Foo->new({ age => 42 }) sub new { my($class, $args) = @_; return bless $args, $class; } それは、ハッシュリファレンスと想定される$argsのそのままつかっているため、引数としてハッシュリテラル以外の何かを渡すと予期しない動作を引き起こすという点です。 たとえば、以下のような使い方は問題を引き起こします。 my %args = (age => 20); my $o1 = Foo->new(\%args); my $o2 = Foo->new(\%args); # ここで $o1 と $o2 は同じオブジェクトになってしまう このような場合、$argsはコピーすべきです*1。またついでにハッシュリファレンスではなくkey-value

    bless($args, $class) is a bad practice - Islands in the byte stream (legacy)
    ziguzagu
    ziguzagu 2013/08/19
  • overloadプラグマの使い方 - Islands in the byte stream (legacy)

    404 Blog Not Found:紹介 - Software Design 2013年06月号 呼ばれてないけど勝手に添削。 use overload '""' => 'toString', '_' => 'add', ; はないわー。そこは use overload '""' => \&toString, '_' => \&add, ; でしょうが。 いいえ、overloadプラグマの引数は文字列でいいんです。でないとサブクラスでオーバーライドできませんから。 つまり、overloadプラグマへ与えるメソッドの実体$methodは、$obj->$method()として与えられたかのように振舞うのです。コードリファレンスを与えると、メソッドのレシーバが何であろうとそのコードリファレンスが呼び出されてしまいます。文字列であれば、サブクラスでたとえばtoString()メソッドをオーバーラ

    overloadプラグマの使い方 - Islands in the byte stream (legacy)
    ziguzagu
    ziguzagu 2013/05/24
  • Dist::Maker覚書 - Islands in the byte stream (legacy)

    h2xsからModule::Starter、Module::Setupといろいろなディストリ生成ツールを使ってきましたが、ここ半年ほどはDist::Makerという自作ツールを使っています。特にCPANにリリースするつもりはなかったのですが、Dist::Makerが良い。で紹介してもらったのでちょっと手を加えてリリース準備中です*1。 基的な使い方は上記エントリにあるので以下は捕捉です。 サブコマンド 新しいディストリはinitで作ります。最近はinitのあとで自動的に`perl Makefile.PL && make manifest`をしてくれるようになりました。この挙動は`dim config template.dist_init 0`で抑制できます。 また、newで新しいファイルを作ることができます。これは、作成しようとしているファイルの名前に近いものを基テンプレートから探し出

    Dist::Maker覚書 - Islands in the byte stream (legacy)
  • Perlのメモリリークを見つける方法 - Islands in the byte stream (legacy)

    Perlではメモリリーク検出ツールがいくつか開発されているので、top(1)の結果を眺めるよりそういうツールを使うほうが楽である。 さて、メモリリークが発生しているとき、その可能性としてはだいたい以下の4つが挙げられる。 Perlレベルでの循環参照 グローバル変数に値をどんどん足しているとき*1 XSレベルでリファレンスカウントの管理ミス XSレベルでmalloc()したメモリの管理ミス この1-3についてはすべてPerlインタプリタ内の出来事であり、Test::LeakTraceを使って検出できる。4を検出するのは難しいが、Test::Valgrindが役に立つ。 Test::LeakTraceのSYNOPSISは歴史的経緯によりごちゃごちゃしているが、テストで使うべき関数はno_leaks_ok()とleaks_cmp_ok()だけである。 たとえば、以下のようにして使う*2。 #!p

    Perlのメモリリークを見つける方法 - Islands in the byte stream (legacy)
  • 常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream (legacy)

    TwitterのTLで知ったのだが、少し前に海外掲示板で"sleep sort"というソートアルゴリズムが発明され、公開されたようだ。このアルゴリズムが面白かったので紹介してみる。 Genius sorting algorithm: Sleep sort 1 Name: Anonymous : 2011-01-20 12:22 諸君!オレは天才かもしれない。このソートアルゴリズムをみてくれ。こいつをどう思う? #!/bin/bash function f() { sleep "$1" echo "$1" } while [ -n "$1" ] do f "$1" & shift done wait example usage: ./sleepsort.bash 5 3 6 3 6 3 1 4 7 2 Name: Anonymous : 2011-01-20 12:27 >>1 なん…だと

    常識を覆すソートアルゴリズム!その名も"sleep sort"! - Islands in the byte stream (legacy)
  • lib::xi - installs missing libraries on demand - Islands in the byte stream (legacy)

    gistなどで公開されているPerlスクリプトを実行する際、モジュールが足りないことがよくあります。そういう場合はCan't locate Foo.pm ...というエラーメッセージを見ながらモジュールをインストールするわけですが、決まりきった作業にうんざりしたので自動的にそれをするモジュールを書きました*1。 https://github.com/gfx/p5-lib-xi `perl -Mlib::xi script.pl`とするだけで、足りないモジュールをcpanmで適当にインストールしてくれます。 -Mlib::xi=extlibとすれば既存の環境を壊すことなくlocal::lib的にextlib/にインストールして実行できますし、-Mlib::xi=-L,extlib,-qなどとしてcpanmにオプションを渡すこともできます。 これで退屈なインストール作業をしなくてすむはずです。

    lib::xi - installs missing libraries on demand - Islands in the byte stream (legacy)
  • Logic-less templateに関する覚書 - Islands in the byte stream (legacy)

    (This entry is a summary of the conversation to @confound and @miyagawa and the paper of ESMVSTE) @confound氏に「Xslateでpush-style template syntaxをサポートしてはどうか」といわれたので、彼やmiyagawaさんからアドバイスをもらいつつ考えたことのまとめ。ESMVSTE(Enforcing Strict ModelView Separation in Template Engines)の内容もまじってます。 HTML::Templateやmustacheのようなlogic-less templateをpush-style template*1という。これは、必要な計算(logic)をすべて終えたあとにテンプレートにデータを「押しこむ」ことによる。 逆に

    Logic-less templateに関する覚書 - Islands in the byte stream (legacy)
  • YAPC::Asia 2010 Tokyoで発表しました - Islands in the byte stream (legacy)

    至らない点は多々ありましたが無事発表を終えることができました!ありがとうございました! How Xslate WorksView more presentations from gorof.ちょっと捕捉します。 まず会場の質疑応答から(スライドにも簡単に追記しました)。 Q. テンプレートをPerlコードに落とし込んでperlに実行させるというモデルもあると思うが、敢えて独自VMを実装した理由は? A. たしかに、Perlコードに落とし込むテンプレートエンジンはあり、Template::ToolkitText::MicroTemplateなどはそうしています。しかしPerlは汎用のインタプリタであり、テンプレートのレンダリングに特化しているわけではりません。Xslateは汎用性を犠牲にし、高速化を図っています。特に、出力バッファに対する文字列の連結に大きな差があります。なので、独自VMの

    YAPC::Asia 2010 Tokyoで発表しました - Islands in the byte stream (legacy)
  • Re: Perlスクリプトの一行目には何と書くべきなのか - Islands in the byte stream (legacy)

    Re: Perlスクリプトの一行目には何と書くべきなのか もしCPAN形式でスクリプトを配布するなら、それは#!/usr/bin/perlないし#!perlとするべきで、env(1)を使うべきではないと思います。 CPAN形式のディストリビューションでは、インストールするスクリプトのshebang行をインストール直前に修正し、正しいパスに書き換えてくれます。ただし、このルーチン*1はいまのところenv(1)を認識してくれません。つまり、env(1)を使った場合、インストールに使用したperlと実際に実行されるperlが一致するとは限りません。perlを一つしかインストールしていないシステムなら、これでも問題なく動きます。しかし最近では、システムにインストールしてあるperlには触らず、アプリケーション用のperlを別途perlbrewなどでインストールしてそちらを使うということもよく行われ

    Re: Perlスクリプトの一行目には何と書くべきなのか - Islands in the byte stream (legacy)
  • XS基礎文法最速マスター - Islands in the byte stream (legacy)

    元ネタ:Perl基礎文法最速マスター(id:perlcodesample) XSを始めるための手順といくつかの要素の解説です。C言語をある程度知っている人でも,これを読んだだけでXSの基礎をマスターしてXSを書くことができるようにはなっていません。リファレンスでもありません。 XSとは,狭義ではPerlでエクステンションを書くためのマクロ言語の名前ですが,広義ではエクステンションを書くための技術の総称です。ここでは,広義のXSを俯瞰します。 XSはいろいろと特殊なのでテンプレは無視で行きます。 目次: h2xsで空のディストリビューションを作る XSファイルの構成 スレッドコンテキスト SVファミリ GCとスコープ さらなる学習のために h2xsで空のディストリビューションを作る 以下のコマンドで空のXSディストリビューションを作ることができます。 h2xs -A -b 5.8.1 -n

    XS基礎文法最速マスター - Islands in the byte stream (legacy)
  • What's your clone policy? - Data::Clone - Islands in the byte stream (legacy)

    複雑なデータ構造のコピーにはStorable::dclone()やClone::clone()がよく使われてきた。しかし,これらのクローンポリシーには疑問がある。そこで,新しいクローンモジュールを書いてみた。 Data::Clone - search.cpan.org Data::Clone - github.org さて,まずStorableのポリシーはおおむね以下の通り: リファレンスはすべて深いコピー(deep copy) スカラー値に対しては,Perlレベルでの代入に等しい操作を行い,マジックは無視する オブジェクトに対しては,フックが定義されていればそれを使い,未定義であればその他のリファレンスと同じように扱う 次に,Cloneのポリシーはおおむね以下の通り: リファレンスはすべて深いコピー スカラー値に対しては,マジックも含めて可能な限りコピーする オブジェクトもその他のリファ

    What's your clone policy? - Data::Clone - Islands in the byte stream (legacy)
  • File::Spec::Memoized - Makes File::Spec faster - Islands in the byte stream (legacy)

    File::Specはファイルパスを扱うために欠かせないモジュールだが,メソッドによっては非常に遅くプログラムのボトルネックになりかねない。 このようなケースでは,メモイズ(Memoize)というテクニックが役に立つ。メモイズは,引数が単純で副作用を持たない関数の結果をキャッシュして高速化する手法である*1。 メモ化(Memoization) - Wikipedia たとえば,重い処理を行うf()があったとして,そのf()の結果が特定の引数に対して一意に決まり,かつf()に副作用がないとき,以下のように結果をキャッシュしたmemozied_f()を用意したとしても,f()とmemozied_f()の意味は変わらないが,memoized_f()の二度目以降の呼び出しがf()の呼び出しよりも高速になる。 my %cache; sub memoized_f{ # 引数からIDを作成する my $

    File::Spec::Memoized - Makes File::Spec faster - Islands in the byte stream (legacy)
  • Perl Advent Calendars 2009 - Islands in the byte stream (legacy)

    今年のPerl Advent Calendarをまとめてみました。 Perl Advent Calendar 2009 JPerl Advent Calendar 2009 Hacker Track - JPerl Advent Calendar 2009 Casual Track - JPerl Advent Calendar 2009 DBIx::Skinny - JPerl Advent Calendar 2009 Data::Model Track - JPerl Advent Calendar 2009 http://opensource.kayac.com/ja/projects/ark/advent/2009/ Catalyst Advent Calendar RJBS Advent Calendar 2010 Perl 6 Advent Calendar | Somethi

    Perl Advent Calendars 2009 - Islands in the byte stream (legacy)
  • How fast Mouse-XS in applications - Islands in the byte stream (legacy)

    v0.40_06から,Mouseが生成するコンストラクタとデストラクタもXSになった。Mouseが生成するアクセサはすでにXS化しているので,かなりのパフォーマンスが期待できるようになったはずだ。 しかし,いくらコンストラクタやアクセサといった部品が速くても,アプリケーションが高速にならなければ意味がない。 そこで,Any::Mooseを使ったモジュールであるHTTP::Engineで,PP版とXS版の速度差を比較してみた。 結果: Perl/5.10.1 (i686-linux) load HTTP::Engine, new(), and run() Rate PP XS PP 789/s -- -55% XS 1748/s 122% -- load HTTP::Engine, new(), and run() * 100 Rate PP XS PP 16.7/s -- -20% XS

    How fast Mouse-XS in applications - Islands in the byte stream (legacy)
  • Use -w in applications, use warnings in modules - Islands in the byte stream (legacy)

    警告のためには -w ではなく use warnings を使うべき,という意見がある*1。 perl - use warnings; # -w でなくて - 404 Blog Not Found 現代的なPerlの記述方法一覧 + α - Perl入門〜サンプルコードによるPerl入門〜 しかしそれはある意味では正解だが,ある意味では間違いである。正しくは「アプリケーションでは #!行に-wと書き,モジュールではuse warningsを使う」である。 以下のコードではそれを示す。 (1) $ perl -MFile::Spec -E 'say File::Spec->join("foo", undef)' foo/ $ (2) $ perl -MFile::Spec -wE 'say File::Spec->join("foo", undef)' Use of uninitialize

    Use -w in applications, use warnings in modules - Islands in the byte stream (legacy)
  • Type as State, Coercion as Hook - Islands in the byte stream (legacy)

    MooseのTypeConstraintは,型というよりはあるデータの性質を表現したものだと考えられる。また,TypeCoercionは,ある型(=あるデータの性質)に対してフックを掛けるメカニズムと考えられる。 このように考えると,Coercionを利用していろいろと面白いことができるのではないかと思う。 たとえば,以下のようにCoercionを利用してエンコーディングを推測することができる*1。 #!perl package E; use Any::Moose; use Any::Moose '::Util::TypeConstraints'; use Encode qw(encode decode FB_QUIET); subtype 'UniStr', as 'Str', where { utf8::is_utf8($_) }; # define types represent a

    Type as State, Coercion as Hook - Islands in the byte stream (legacy)
  • To repeat testing with different configuration - Islands in the byte stream (legacy)

    構成条件を変えてテストを繰り返したいことがある。 たとえば,XSとPurePerlの両方の実装を持つモジュールなどはそうだし,Any::Mooseを使ったモジュールであれば $ENV{ANY_MOOSE} を変えてテストを繰り返したいと考えるのは当然だ。 この問題は,postamble()*1でMakefileにターゲットを追加することで解決できる。 さて,ここでは,開発者モードのときに $ENV{FOO_PUREPERL}=1 でテストをもう一度繰り返したいものとする。これには,Makefile.PLに以下のように記述すればよい。 # Makefile.PL use inc::Module::Install; # ... if(author_context){ # repeat testing # see also ExtUtils::MM_Any::test_via_harness()

    To repeat testing with different configuration - Islands in the byte stream (legacy)
  • Yet another native traits in Moose - Islands in the byte stream (legacy)

    id:tokuhiromの示唆を得て,Native traits/AttributeHelpersについて考えてみた。 現在MooseではMX::AttributeHelpersが"Native traits"として組み込みになっているが,それにもかかわらずhas()の時点でtraits => ['Array']などとしないと使用できない。これは冗長だ。 use Any::Moose; has foo => ( is => 'ro', isa => 'ArrayRef', traits => ['Array'], # 冗長 handles => { # ... }, ); "isa"でArrayRefを指定しているのだから,traits => ['Array']は明らかに冗長である。 ところで,native traitsの仕組みは委譲の一種と考えることができる。その方向で考えると,既存のM

    Yet another native traits in Moose - Islands in the byte stream (legacy)