タグ

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

  • How CoffeScript classes work - Islands in the byte stream (legacy)

    CoffeeScriptのクラス機構はどんなものか調べた記録。コード量は少ないが洗練されており効率も良いようだ。 http://coffeescript.org/#classes さて、元のcoffeeスクリプトは単にクラスとサブクラスの定義をするだけのもの。 #!/usr/bin/env coffee class Animal constructor: (@name) -> console.log "constructor of Animal" move: (meters) -> console.log "Animal#move" class Snake extends Animal constructor: (@name) -> super @name console.log "constructor of Snake" move: -> console.log "Snake#move

    How CoffeScript classes work - Islands in the byte stream (legacy)
  • JSにコンパイルされたDartがPerlより速い件 - Islands in the byte stream (legacy)

    Dartのインストールが簡単になっていたので試してみたところ、Perlよりも高速だった。 なにこれ悔しい。 Dart: void main() { final t = new Stopwatch(); t.start(); final a = new List<int>(); for(var i = 0; i < 1000000; ++i) { a.add(i); } for(var i = 0; i < a.length; ++i) { ++a[i]; } var sum = 0; for(var i = 0; i < a.length; ++i) { sum += a[i]; } print(sum); print(t.elapsedMilliseconds / 1000); } Perl: use 5.12.0; use Time::HiRes qw(gettimeofday tv_

    JSにコンパイルされたDartが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)
  • 「優れたPerlプログラマを見分ける27の質問」の日本語訳 - Islands in the byte stream (legacy)

    (追記あり) How to Identify a Good Perl Programmer (by chromatic) が面白かった*1ので、27の質問を訳してみました。chromatic氏によれば、いずれも単純明快な質問でPerlの哲学や特徴をよく現しており、優れたPerlプログラマであれば少なくとも80%は答えられるべきだそうです*2。あなたは全ての質問に答えられますか? Perl5において変数のシジル*3が示すものは何か 配列のアクセスする際の $items[$index] と @items[$index] の違いは何か == と eq の違いは何か ハッシュをリストコンテキストで評価すると得られるものは何か Perlドキュメントからキーワードを検索するにはどのようにするのか Perl5における関数とメソッドの違いは何か Perl5が変数のメモリを再利用するのはいつか 変数のスコー

    「優れたPerlプログラマを見分ける27の質問」の日本語訳 - Islands in the byte stream (legacy)
    joan9
    joan9 2011/03/02
  • Re: バリデーションはどの位置で必要か - Islands in the byte stream (legacy)

    バリデーションはどの位置で必要か - サンプルコードによるPerl入門 バリデーションはアクセサメソッドの内部で行うのではなく、バリデーションの専用のモジュールを使用して、データを受け取った入り口で行うのがよいでしょう。 私はこれには反対です。アプリケーションにせよライブラリにせよ、原則としてすべての公開APIの入力値はバリデーションするのが望ましいと考えます。 すなわち、アクセサメソッドもそれがパブリックなAPIであればバリデーションをしたほうがいいと思います。 とはいえ以下の基的な考え方に異論があるわけではありません。 データのバリデーションを行う主要な目的は、外部から入力されるデータが正しい値かどうかをチェックするためのものです。 問題は、どこまでを「外部からの入力」とみなすかということでしょう。私は、そのプログラム/ライブラリのパブリックなAPIが受け取る値はすべて「外部からの入

    Re: バリデーションはどの位置で必要か - Islands in the byte stream (legacy)
  • What I got in YAPC::Asia 2009, notes, and todo - Islands in the byte stream (legacy)

    今回初めてYAPC::Asiaに参加した。記憶が鮮明なうちに,得たもの,考えたことをメモしておく。ハッカソンにも二日目のみ参加したが,時間があまりとれず,特に成果は出せなかった。 AnyEvent/Coro AnyEvent/Coroのイメージがつかめたのはとてもよかった。特にid:mala氏の高速になる理屈はとても分かりやすかった。具体的にどのくらい高速になるか試してみたい。 Moose高速化計画 nothingmuch, rafl, SartakとMooseについて話せたのは非常によかった。Moose高速化計画の報告がYAPC前にできなかったのは失敗だったが,将来に向けていろいろ話はできた。 New syntaxes 私はDevel::Declareが実用的だとはどうしても思えなかったのだが,この考えは改めることになった。たとえば,もし5.12で新規構文を導入したとしても,Devel:

    What I got in YAPC::Asia 2009, notes, and todo - Islands in the byte stream (legacy)
  • Do not use Devel::Declare, a magical source filter. - Islands in the byte stream (legacy)

    モダンPerlの世界へようこそ 第11回でDevel::Declareが取り上げられていました。 このモジュールは確かに「スゴイ」のですが,個人的には使うべきではないと思っています。もちろん,Devel::DeclareのフロントエンドであるMethod::SignaturesやMooseX::Declareも同様です。 これはDevel::Declareというよりはソースフィルタモジュール一般に言えることですが,問題はコンパイルと実行の間にプリプロセスという処理あることです。そのため,ブラックボックスを増やすことになり,デバッグが困難になります。 また,Devel::DeclareはPerlに新しい機能を追加するためのモジュールというより,Perlの方言を書くためのモジュールといえます。 たとえば以下のコードはMooseX::DeclareのSYNOPSISからとったものです: use

    Do not use Devel::Declare, a magical source filter. - Islands in the byte stream (legacy)
    joan9
    joan9 2009/07/13
  • 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)
    joan9
    joan9 2009/06/09
  • switch文とif連鎖の比較 - Islands in the byte stream (legacy)

    Perl 5.10.0でswitch文が導入されたことにより,ifの連鎖はもっとわかりやすい構文に書き換えられるようになった。 use feature 'switch'; given($foo){ when("bar"){ ... } when("baz"){ ... } default{ ... } } switch文の導入で便利になった一方,このwhen()で使われるマッチングは「スマートマッチ」という特殊な演算子によって行われることのコストが懸念される。 そこで,switch文とif連鎖の速度を比較してみた。 また,かつて単純なif連鎖とよく比較されたのは,ハッシュテーブルを参照する方式である。if連鎖の複雑さがO(n)なのに対し,ハッシュテーブルの参照はO(1)であるため,連鎖が長くなるとハッシュテーブルの方が高速であるとされる。『Perlベストプラクティス』では,ハッシュテーブル

    switch文とif連鎖の比較 - Islands in the byte stream (legacy)
    joan9
    joan9 2009/05/13
  • 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)
    joan9
    joan9 2009/03/29
  • 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)
  • 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)
  • List::Util::firstは遅い - Islands in the byte stream (legacy)

    (追記:この用途ではList::Util::firstを使うのは誤りで,List::MoreUtils::anyが意図されたコードです。効率についての結論は変わりません) List::Util::first{expr}は組み込みのgrep{expr}に似ているが,exprが最初に真になった段階でその値を返すので,grep{expr}よりも効率がいいと説明されることが多い。しかし,実際にベンチマークを取ってみると,多くの場合grep{expr}より遅い。最初の要素が真になるというfirst{expr}にとって最適な条件でさえ,要素数が40を越えたあたりでようやくgrep{expr}とほぼ同程度の速度になる。したがって,List::Util::first{expr}が効果的なケースはそれほど多くないと思われる。 また,もし単なる文字列の検索でよく,その検索をプログラム中で繰り返すならば,gre

    List::Util::firstは遅い - Islands in the byte stream (legacy)
    joan9
    joan9 2009/01/16
  • __PACKAGE__がうざいときにuse component; - Islands in the byte stream (legacy)

    DBIx::Classのシンタクスシュガーがほしいについて。とりあえずJifty::DBIとData::Modelについてはいずれ調べるとして,クラスメソッドのシンタクスシュガーを一般化するモジュールを書いた。 CPANにあげるようなものではないけど。 http://svn.coderepos.org/share/lang/perl/component package DB::Main::Artist; use component qw(DBIx::Class PK::Auto Core); table 'artist'; add_columns qw/ artistid name /; set_primary_key 'artistid'; has_many cds => 'DB::Main::CD'; 1; 内部でcaller()->load_components()してるだけなのでl

    __PACKAGE__がうざいときにuse component; - Islands in the byte stream (legacy)
    joan9
    joan9 2009/01/09
  • Mooseのボトルネック - Islands in the byte stream (legacy)

    Mooseの速度改善の一助になればと思ってData::Utiを書いているのが,最近だいぶ機能が増えてきた。 今のところ,Params::Util+Sub::Identify+Sub::Install+Sub::Delete+Data::OptList+αという感じ。全て基はXSで,コンパイラの無い環境のためのPurePerl実装つき。 とりあえずClass::MOP/Mooseの"bless($x) && $x->isa($y)"を全てis_instance($x, $y)にするだけでもかなり速度は改善するはず。何しろis_instance($x, $y)は$x->isa($y)単体よりも速いからね。 あとはClass::MOP::Class->get_method_map がボトルネックの一つみたいなので時間ができたらXSで書いてみます。

    Mooseのボトルネック - Islands in the byte stream (legacy)
    joan9
    joan9 2008/11/26
  • PerlでAssert - Islands in the byte stream (legacy)

    Perl5.9の時点では,assersionsと-Aコマンドラインスイッチという仕組みでCのassert(3)のようなことができるようになるはずだったらしい。しかし,そのメカニズムはPerl5.10には結局採用されなかった。 開発中はassert()が欲しい,しかし,リリース後の実行時パフォーマンスは落としたくない,というのがAssertを考えるときのジレンマというわけだ。そんななかで,CPANのCapr::Assertは関数呼び出しを完全に消し去ることができるので悪くない方法だと思う。 use Carp::Assert; assert($x > 1) if DEBUG; DEBUGはCarp::Assertの提供する定数関数で,その値が偽ならばこの一文はコンパイル時に完全に削除される。 $ PERL_NDEBUG=0 perl -MO=Deparse -MCarp::Assert \ >

    PerlでAssert - Islands in the byte stream (legacy)
  • 1