タグ

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

  • 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)
    Yuichirou
    Yuichirou 2012/03/10
  • RubyのMethod#source_locationをPerlで - Islands in the byte stream (legacy)

    [追記]Cside先生がUNIVERSAL::source_location_forとしてリリースしておりますのでcpanmでご利用ください![/追記] asakusa.rbでsource_locationというメソッドを教えてもらいました。 それによれば、Rubyのメソッドオブジェクト(UnbountMethod, Method, Procなど)にはsource_locationというメソッドがあり、そのメソッドが定義されたファイル名と行番号を取得することができます。これはクラス階層が複雑なときにデバッグに役立ちそうです。 Perlでも標準ライブラリに含まれるBモジュールを使って同様のことができるのでやってみました。 Ruby版: #!/usr/bin/env ruby2 require 'fileutils'; p FileUtils.method(:pwd).source_locat

    RubyのMethod#source_locationをPerlで - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2012/03/07
  • 2012年はプログラミング言語を作りたい - Islands in the byte stream (legacy)

    当は2011年の1-3月の間にやろうと思っていたのだが、卒業の危機などがあり思うように進まなかった。しかし今年Perl/XS以外にもC++, Objective C++, Java, ActionScript, JavaScript, Rubyなどでコーディングする機会があり、自分が欲しい言語が具体的になってきた。 私が欲しいのは、Perlの次を担えるような言語だ。それは必ずしも私の言語でなくてもいいのだが、とにかく「next Perl」が欲しい。 Perl言語のいいところは何か。それは言語に密結合した正規表現構文とテキスト処理機能、シンボルテーブルなど内部データ構造*1や後付けのOOP*2のような原始的な機能の露出、標準ドキュメントフォーマット*3とビューア*4、RAIIとダイナミックスコープだ。私は、これらすべてを備えている言語をPerl以外に知らない。 一方で、不要な機能もある。特

    2012年はプログラミング言語を作りたい - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/12/31
  • Re: use parent と Try::Tiny とか - Islands in the byte stream (legacy)

    use parent と Try::Tiny とか - punitan (a.k.a. punytan) のメモ use parent を使って継承した時に try-catch あたりを継承先に突っ込んだりできないものかと考え倦ねいたけど中途半端なところでギブアップした。 use parent qw(Foo); で関数をインポートできるとなるといろいろぶち壊す気がするので混ぜるな危険だとは思います。 とはいえRubyのinherited()みたいにあるクラスPが小クラスCに継承されたタイミングで呼ばれるPへのフックはあってもいいかなと思いました。 具体的にはこんなの*1: diff --git a/parent.pm b/parent.pm --- a/parent.pm +++ b/parent.pm @@ -25,6 +25,9 @@ sub import { no strict 'r

    Re: use parent と Try::Tiny とか - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/11/27
  • Snow Leopard & Xcode 4+ & system perl でXSをビルドできない問題の修正法 - Islands in the byte stream (legacy)

    MacOSX Snow LeopardでXcode 4以上を使っているとき、system perl向けのXSモジュールがまったくビルドできないという非常に厄介な問題があります。 これは、system perlがユニバーサルバイナリでppc用のバイナリを含むようになっているにも関わらず、Xcode 4以降のgccではppc向けのクロスコンパイラが含まれていないためです。また、system perlのccが"gcc-4.2"となっていますが、Xcode 4以降だとgcc-4.2というコマンドが存在しないことも問題です。 これを解消するためにはConfig.pm/Config_heavy.plをいじって上記の問題を修正します。 以下のコマンドを実行してconfigを修正するのが簡単でしょう。 sudo perl -i -pe 's/gcc-4.2/gcc/g; s/-arch ppc//g' \

    Snow Leopard & Xcode 4+ & system perl でXSをビルドできない問題の修正法 - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/11/15
  • Plack::App::Directoryで簡易静的ファイル配信 - Islands in the byte stream (legacy)

    だいたいaliasしてるらしいです。padでaliasつくると楽ですね。 alias pad="plackup -MPlack::App::Directory \ -e 'Plack::App::Directory->new->to_app'" 参考:第1回 PSGI/Plack―フレームワークとサーバをつなぐエンジン (2):Perl Hackers Hub|gihyo.jp … 技術評論社

    Plack::App::Directoryで簡易静的ファイル配信 - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/11/13
  • Googleのインクリメンタル検索を無効にするたった一つの設定 - Islands in the byte stream (legacy)

    というわけで、Chromeだと[オプション]→[高度な設定]→[コンテンツの設定]→[例外の管理]で特定のドメインのJavaScriptをブロックできます。これで www.google.com と www.google.co.jp のJSをブロックするとインクリメンタル検索を無効にできます。 これで快適だったあの頃に戻れます!やったね!<追記>Googleウェブサイトの検索の設定でもインスタント検索を無効にできるようです。たった一つの設定ではありませんでしたが、好きな方で設定すればいいと思います。

    Googleのインクリメンタル検索を無効にするたった一つの設定 - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/09/07
    見出しは「…にするたったひとつの冴えたやりかた」と修正した方がいいかも
  • Perl 5.15.2 released! - Islands in the byte stream (legacy)

    Perlの開発版である5.15.2がリリースされました。 https://metacpan.org/release/RJBS/perl-5.15.2 このバージョンで組み込み関数のサブルーチンリファレンスが取れるようになっています。 use 5.15.2; # automatically turns on strict my $time = \&CORE::time; say $time->(); # 1313908276 また、__FILE__と__LINE__がtime()同様引数をとらない組み込み関数として解釈されるようになったので、以下のようなことも可能です。 use 5.15.2; # automatically turns on strict my $file= \&CORE::__FILE__; say $file->(); # foo.pl ただし組み込み関数のリファレンス

    Perl 5.15.2 released! - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/08/21
  • Shibuya.pm #16 で発表してきました - Islands in the byte stream (legacy)

    Shibuya.pm Technical Talk #16 夏の正規表現祭りにスピーカーとして参加してきました。mixiさん会場提供ありがとうございました! 私は「Hello, re::engine!」と題してPerlのプラガブル正規表現エンジンについて発表しました。「正規表現」のイントネーションでツッコミを受けたり、スライドが壊れていてライブコミットするハメになったりなどハプニングもありましたが、大いに楽しみました! Hello, re::engine! これはもともと How to Implement World Fastest Grep の [twitter:@shinya8282]くんをShibuya.pmに呼んで正規表現祭りをしたいね、と話していたとき思いついたネタです。つまり、Perlの正規表現エンジンはプラガブルなので、高速な正規表現エンジンがあるならぜひPerlからも使える

    Shibuya.pm #16 で発表してきました - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/07/11
  • 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)
    Yuichirou
    Yuichirou 2011/06/19
  • each()は遅い上に微妙な問題も起きやすい - Islands in the byte stream (legacy)

    特別な条件がないかぎり、each()は使うべきではありません。代わりにkeys()/values()を使うべきです。その理由は2つあります。 each()は遅い each()でハッシュ全体をループするのは遅いです。これは、keys()/values()がその内部の値をそのまま参照する*1のに対し、each()は代入しないとその値を使えないからです。 ベンチマーク: #!perl use strict; use warnings; use Benchmark qw(cmpthese); my %hash = map { $_ => $_ } ( 1 .. 10000 ); cmpthese -1, { each_k => sub { while(my $key = each %hash) { } }, each_kv => sub { while(my($key, $value) = eac

    each()は遅い上に微妙な問題も起きやすい - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/06/04
  • Smart::Commentsでモジュールにサンプルコードを仕込む - Islands in the byte stream (legacy)

    ソースコードを読んでいると、関数の引数や戻り値の具体的な例がほしいと思うことがよくある。。そこで、実行可能なコメントを仕込むモジュールであるSmart::Commentsを使って、モジュール内にテストを兼ねたサンプルコードを仕込めばいいのではないかと考えた。これにより、開発者にとっては簡単なテストコードとして動き、読者にとっては具体例となるコードを簡単にソースコード内に埋め込むことができる。 package MyUtil; use strict; use warnings; use parent qw(Exporter); our @EXPORT = qw(add); use if __FILE__ eq $0, 'Smart::Comments'; ### assert: add(10, 20) == 30 sub add { my($a, $b) = @_; ### add(a, b)

    Smart::Commentsでモジュールにサンプルコードを仕込む - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/05/29
    これは興味深い
  • The three significant features in Perl 5.14 - Islands in the byte stream (legacy)

    perl 5.14.0がリリースされた。Ubuntuなどでは、perlbrew経由でインストールするといくつかテストが失敗するようなので--forceオプションを使わないとインストールできない。 # 念のため-DDEUGGINGもつける。threadは好みで。 $ perlbrew --force install perl-5.14.0 -DDEBUGGING -Duseithreads Task::Plackなどの主要モジュール群ではCoro以外はいまのところ問題なくインストールできている。 さて、このバージョンは数多くの機能がが追加されているが、特に重要な機能が三つある。このエントリではその機能を紹介する。 The package block syntax package宣言が他の言語のクラス宣言に近い形で書けるよう拡張された。特に、以下のような小さなクラスが分かりやすくに書けるように

    The three significant features in Perl 5.14 - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/05/15
  • 最小限のls -laを書いてみた - Islands in the byte stream (legacy)

    プログラミング初心者にオススメのPerlにて、リャマ(『初めてのPerl』)を読了した段階でls(1)やgrep(1)の簡易版を作れるようになっていればよい、と書きました。そこで実装例として、最小限のls(1)を実装してみました。また、リャマ読了程度の知識を前提にすることと、Perl 5.8ベースで標準モジュールを以外は使わない<ことを制約としました。なお、所要時間は一時間程度です。 仕様は最小限ながらそれなりに役立つようにしたかったので、以下のようにしました。 引数としてディレクトリ名をうけとる 引数を省略するとカレントディレクトリ(.)になる オプションは-la(長い出力ですべてのファイルを表示)相当で固定 group名、user名は省略し、パーミッション・ファイル更新日時・ファイル名を出 実装の際のポイントは以下のとおりです。 stat()やlocaltime()の戻り値は扱い

    最小限のls -laを書いてみた - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/05/14
  • コマンドラインからPSGIアプリを一度だけ実行する - Islands in the byte stream (legacy)

    ときどきPSGIアプリをコマンドラインから呼び出したくなる*1ので、ハンドラを書きました。それなり*2に$psgi_envを整えてくれるので便利です。 https://github.com/gfx/p5-Plack-Handler-CLI http://search.cpan.org/dist/Plack-Handler-CLI/ `plackup -s CLI app.psgi`で実行できます。また、以下のようにしてREQUEST_URIやQUERY_STRINGを渡せます。 $ plackup -s CLI app.psgi # Request: / $ plackup -s CLI app.psgi --foo bar # Request: /?foo=bar $ plackup -s CLI app.psgi hoge fuga # Request: /hoge/fuga これを使

    コマンドラインからPSGIアプリを一度だけ実行する - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/05/11
  • プログラミング初心者にオススメのPerl本 - Islands in the byte stream (legacy)

    この時期、Perlを学び始める方も多いと思います。そこでプログラミング初心者がPerlを学ぶのに適したを、私が実際に読んだことのあるものの中から選んでみました。 1冊目 1冊目はなんでもいいと思うのでとりあえず定番としてリャマを挙げておきます。 初めてのPerl 第5版 作者: Randal L. Schwartz,Tom Phoenix,brian d foy,近藤嘉雪出版社/メーカー: オライリージャパン発売日: 2009/10/26メディア: 大型購入: 22人 クリック: 293回この商品を含むブログ (41件) を見るこれで基的なPerlの文法が学べるはずです。この手の入門書は「課題」がつきものですが、すべて解く必要はないと思います。幾つか気になるもの・面白そうなものだけ試してみればいいでしょう。 1冊目読了の辞典では、以下のプログラムの簡易バージョン*1を実装できるよう

    プログラミング初心者にオススメのPerl本 - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/05/05
  • 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)
    Yuichirou
    Yuichirou 2011/03/18
    「足りないモジュールをcpanmで適当にインストールしてくれます」
  • Xslate 1.1000 released! - Islands in the byte stream (legacy)

    リリースしました。中間コードのバージョンが上がっているため、このバージョンを実行すると今まで使用していたテンプレートのキャッシュが破棄されます。 http://xslate.org/ 主な変更点は以下の2つです。 ループ制御文(lastとnext)が追加された for-else構文がサポートされた ループ制御文はPerlのものと同じですが、ラベルはサポートしていません。 例: #!perl -w use strict; use Text::Xslate; my $tx = Text::Xslate->new(); print $tx->render_string(<<'TX'); : for ['foo', 'bar', 'baz'] -> $item { : next if $item == 'bar'; * <: $item :> : } TX __END__ 実行結果: * foo

    Xslate 1.1000 released! - Islands in the byte stream (legacy)
    Yuichirou
    Yuichirou 2011/03/17
  • Parallel module testing in Perl - Islands in the byte stream

    Twitterにて: たしかあったはず*1と思って探してみると*2、Test::Harness にHARNESS_OPTIONSというオプションがありました。以下のようにすると並列でテストで時間を大幅に短縮できます。 $ HARNESS_OPTIONS=j2 make test 実際、Xslateでこれを試してみるとテストの時間が2/3程度になりました*3。これはかなり効果があると考えていいでしょう。 ただし、モジュールが並列実行に対応してないケースがありえるので、すべてのケースで利用出来るわけではありません。すなわち、これはモジュールの作者が指定するのが望ましいオプションだと言えます。そして、Module::Install::TestTarget があればそれが簡単にできるのです。 # Makefile.PL # ... default_test_target env => { HARN

    Parallel module testing in Perl - Islands in the byte stream
    Yuichirou
    Yuichirou 2011/03/14
  • 「優れた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)
    Yuichirou
    Yuichirou 2011/03/01