タグ

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

  • Perl XS を書くようになったきっかけ - Islands in the byte stream (legacy)

    THE INTERVIEWS がサービス終了ということで、一つだけ消えるには惜しいというか懐かしい記事があったので少し加筆修正して転載します。JHackers でも似たようなことを話してますね。 Perl XS を書くようになったきっかけ、また、どのようにして今のような XS マジシャンになったのか。そのあたりの事をお聞かせください 2000年頃の話です。ぼくはCGIスクリプトでちょっとしたゲームデータの集計サイトをやりたくてプログラミングを覚えたのでした。これがそこそこ重い処理で、次第にもっと高速にしたいと考えるようになりました。一方、当時ぼくはお金もなくVPSも一般的でなかったので、CGIスクリプトしか選択肢はありません。そこで初心者ながらいろいろ調べることにしました。 とりかかったのは行指向のテキストで保存していたデータをSQLiteにすることでした。しかし当時はWindows上で開

    Perl XS を書くようになったきっかけ - Islands in the byte stream (legacy)
    soh335
    soh335 2013/12/04
  • chomp() は $/ に依存していると知れ! - Islands in the byte stream

    perldocにあるように、chomp()の挙動は $/ に依存します。ということは、うっかり local $/ したスコープで chomp() を行うと、何もおきません。 この結果起きる現象がきわめて不可解なので、readlineの直後以外の場面ではchomp()を使わず s/\r?\n\z//xms するのが無難でしょう*1。 use strict; use warnings; local $/; my $s = "Hello\n"; chomp $s; print "[$s]\n"; # => #[Hello #] Xslateがまさにこれにはまっていたので修正しました。 https://github.com/xslate/p5-Text-Xslate/commit/92c7387b0f0ebdad5761c420a54564b9e8d2f635 [追記] *1:はてブのコメントをう

    chomp() は $/ に依存していると知れ! - Islands in the byte stream
    soh335
    soh335 2013/11/16
  • Perlでコールスタック上のサブルーチンの引数を得る - Islands in the byte stream (legacy)

    @DB::args でできます。 use strict; use warnings; use Data::Dumper; sub foo { bar(1, 2, 3) } sub bar { package DB { our @args; my $i = 0; while (() = caller $i) { print "$i: ", ::Dumper \@args; $i++; } } } foo('a', 'b', 'c'); outout: 0: $VAR1 = [ 1, 2, 3 ]; 1: $VAR1 = [ 'a', 'b', 'c' ]; もともとデバッガAPIの一部なので使い方はかなりマジカルで、DBパッケージ内でcaller()に引数を与えてかつリストコンテキストで評価すると@DB::argsにそのコールスタックでの引数がセットされるというものになっています。 以下pe

    Perlでコールスタック上のサブルーチンの引数を得る - Islands in the byte stream (legacy)
    soh335
    soh335 2013/09/30
  • perl v5.18.0 released! - Islands in the byte stream (legacy)

    perl v5.18.0 がリリースされました。 https://metacpan.org/release/RJBS/perl-5.18.0 このリリースでの新規機能はほとんどないものの、二つの非常に大きな変更があります。 ハッシュキーのランダム化 each(), keys(), values() で返されるハッシュキーの順番がハッシュ毎にランダムになりました。同じプロセス内、同じキーセットのハッシュでさえ順番が一致しなくなります。 use 5.18.0; use strict; use warnings; my %a = map { $_ => 1 } qw(foo bar baz); my %b = %a; say join ", ", keys %a; say join ", ", keys %b; 実行例: $ perl randomized-keys.pl baz, bar, f

    perl v5.18.0 released! - Islands in the byte stream (legacy)
    soh335
    soh335 2013/05/20
  • Xslate 1.5008 released - Islands in the byte stream (legacy)

    異常系の振る舞いを少し変えました。 https://metacpan.org/release/Text-Xslate Xslateでは、render()へ渡すテンプレートパラメータや登録関数からの戻り値は必ずEncodeモジュールでデコードしたテキスト文字列であるべきです。しかし、デコードしてないバイト列を渡したときの挙動は未定義で、XS/PPあるいはcacheの有無によって挙動が異なっていました。特にcacheの有無で挙動が変わることがあるのが厄介で、特定の条件が重なるとリロードすると文字化けするという挙動を示すことがありました。 Xslateに限らず、Perlではスクリプト内のテキストの操作はデコードされたテキスト文字列で行うべきで、これを守らなければ文字化けを引き起こします。よって、Xslateでも、上記のようにデコードされていないバイト列を与えると文字化けが起きるのが、Perl的に

    Xslate 1.5008 released - Islands in the byte stream (legacy)
  • ある値を非同期で取ってくる→その値を使ってさらに非同期処理というのをJSDeferredでする - Islands in the byte stream (legacy)

    ユースケースとしては、テストの最初にあるシステムにログインしてユーザIDなりセッションIDなりを得て、それでもって残りのテストを実行するみたいな処理です。 これ、素直にJSDeferredでDeferred.next(...).next(...)と続けても、このnextのコールバックは最初にいきなり呼ばれたあと「待ち」に入るので、非同期で取ってきた値に依存した処理は書けないんですよね。 これは、Deferredオブジェクトを自分で作って制御すればいけるみたいです。 以下サンプルコードです。最初の100msかかる非同期処理で42という値を得て、それを次の処理に渡せることを確認します: #!/usr/bin/env node "use strict"; var Deferred = require('./jsdeferred.js').Deferred; Deferred. next(func

    ある値を非同期で取ってくる→その値を使ってさらに非同期処理というのをJSDeferredでする - Islands in the byte stream (legacy)
  • perlbrew-completionを書いた / またはcompletionスクリプトの開発とデバッグの話 - Islands in the byte stream (legacy)

    きょうびmakeやgitでも補完が効くなか、perlbrewでも補完が効いてほしいですよね。 たとえば私はマシンによってperlbrewで入れたperlはけっこう違っているのですが、どのマシンにどのバージョンのperlを入れたか正確には覚えていません。なのでperlbrew use [tab]で利用可能なperlの一覧が出るなどしてほしいところです。 そこでperlbrew-completionを書きました。pull-req済みなのできっと次のバージョンあたりから使えることでしょう。 $ perlbrew [tab] alias install off available install-cpanm self-upgrade clean install-patchperl switch compgen install-perlbrew switch-off display-bashrc l

    perlbrew-completionを書いた / またはcompletionスクリプトの開発とデバッグの話 - Islands in the byte stream (legacy)
    soh335
    soh335 2011/11/21
  • 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)
    soh335
    soh335 2011/11/11
  • 1