タグ

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

  • 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)
    mattn
    mattn 2013/12/04
  • 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)
    mattn
    mattn 2013/09/10
  • Perlの m// は中身が固定文字列だと爆速になる - Islands in the byte stream (legacy)

    [追記] 実際に検証してみると、パターンが短いと index() のほう速いこともあるようです。パターンが長いと正規表現のほうが高速になるのでそもそもアルゴリズムが違うようですね。 よってこのエントリの内容は必ずしも正確ではありません! cf. https://gist.github.com/kazuho/5410635 [/追記] Perlの話題を日語で – Lingr で出た話題です。 Perlの正規表現マッチはパターンが単純だと index() とおなじく Boyer-Moorアルゴリズムで検索するので非常に高速です。要は最適化のつもりでパターンマッチをindex()に書き換えるのは無意味なのです。 ソースは pp.c や regexec.c あたりを fbm_instr() で検索かな? ドキュメントもどこかで読んだ気がするのですが思い出せず>< perl -MDevel::Pe

    Perlの m// は中身が固定文字列だと爆速になる - Islands in the byte stream (legacy)
    mattn
    mattn 2013/04/18
  • JSXの補完を強化します - Islands in the byte stream (legacy)

    JSXの補完はいままでシンボルだけでしたが、せっかく型があるのですから関数のプロトタイプや変数の型も表示してほしいところです。 とりあえず以下のように型を表示できるところまではできました。ブランチは JSX / jsx.vim ともに gfx/completion-detail です。 ※ 画面は開発中のものです 流にマージしたらまたお知らせします。

    JSXの補完を強化します - Islands in the byte stream (legacy)
    mattn
    mattn 2012/09/03
    oh...
  • JSX で JSON object mapping する - Islands in the byte stream (legacy)

    JSXのJSON.parse() の戻り値はvariantなので、使用するときはtype castが必要です。そこでクラスにマッピングするのですが、これを自動的にはやってくれないので手動で行う必要があります。 class Name { var firstName : string; var lastName : string; function constructor(data : variant) { this.firstName = data["firstName"] as string; this.lastName = data["lastName"] as string; } } class _Main { static function main(args : string[]) : void { var data = JSON.parse('{ "firstName": "hi

    JSX で JSON object mapping する - Islands in the byte stream (legacy)
    mattn
    mattn 2012/09/02
    それ自動でやってくれるマーシャラがあると便利
  • 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)
    mattn
    mattn 2012/07/31
  • nodejsでprocess.exit()するとstdout/stderrのバッファがflush()されない件 - Islands in the byte stream (legacy)

    この問題はnodejs 0.4.x ではMacOSXでも存在したようなのですが、0.6.xで修正されたようなので安心していたら、Windowsではまだ残っているようです*1。 以下のようにすれば、stdout/stderrr両方確実にフラッシュした後にexit()するようにできます。@mattn_jp++ var exitCode = main(); (function (exitCode) { if (exitCode === 0) { return; } var stdoutIsFlushed = process.stdout.write(""); var stderrIsFlushed = process.stderr.write(""); var exitIfFlushed = function () { if (stdoutIsFlushed && stderrIsFlushed

    nodejsでprocess.exit()するとstdout/stderrのバッファがflush()されない件 - Islands in the byte stream (legacy)
    mattn
    mattn 2012/07/05
  • nodejsでstdinから同期的に全部読み込む - Islands in the byte stream (legacy)

    fs.readFileSync() のようなものがあるのかと期待したら、read(2)相当のものしかなくて困惑した。 #!/usr/bin/env node "use strict"; var fs = require("fs"); var fd = process.stdin.fd; var content = ""; var BUFFER_SIZE = 4096; var buffer = new Buffer(BUFFER_SIZE); var n; while( (n = fs.readSync(fd, buffer, 0, BUFFER_SIZE)) > 0) { content += buffer.slice(0, n).toString(); } process.stdout.write(content); イケてないが仕方がない。

    nodejsでstdinから同期的に全部読み込む - 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)
    mattn
    mattn 2012/02/26
  • ある値を非同期で取ってくる→その値を使ってさらに非同期処理というのを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)
    mattn
    mattn 2012/01/04
    jQueryのwhenとpromiseで良く似た事できそうな気がする。
  • 古いPerl Advent Calendarも案外面白かったりするので - Islands in the byte stream (legacy)

    並べてみました。 Perl Advent Calendar 2011 Perl Advent Calendar 2010 Perl Advent Calendar 2009 Perl Advent Calendar 2008 しかし2009年以前はブクマ数が一覧から見えないのでどれが人気だったのかわかりませんね。

    古いPerl Advent Calendarも案外面白かったりするので - Islands in the byte stream (legacy)
    mattn
    mattn 2011/12/21
    記事をデータとして復元して今のサーバでホストしちゃ駄目なの?
  • quick sortよりも高速でmerge sortのように安定しているソートアルゴリズムtim sort [勘違い] - Islands in the byte stream

    <追記>ベンチマークプログラムに誤りがありました。ソート済のシーケンスに対してソートを掛けていました。ご指摘ありがとうございます>ak氏 そんな夢のようなソートアルゴリズムがあるのかというと、あるらしいんです。それがtim sortと呼ばれるアルゴリズムです。 画期的(?)なソートアルゴリズム「Sleep Sort」:濃縮還元オレンジニュース|gihyo.jp … 技術評論社 このあたりで拾ってきたネタですね。 merge sortを改良したアルゴリズムで、安定*1しており、しかも実行速度にも優れているとか。アルゴリズムの性能の評価は済んでいるらしく、CPythonやJDK7には既に導入済みのようですね。 ならば当然Perlのソートも…と考えるわけですが、まず評価のためにJavaのソースをC++にそのまま移植してみました。それがこれ(いちおうテスト済): https://github.co

    quick sortよりも高速でmerge sortのように安定しているソートアルゴリズムtim sort [勘違い] - Islands in the byte stream
    mattn
    mattn 2011/10/19
  • YAPC::Asia Tokyo 2011 にエア参加しました! - Islands in the byte stream (legacy)

    YAPC::Asia Tokyo 2011お疲れ様でした! 私は参加できなかったものの、Perl道場の問題をいくつか書いたりTLを追ったりしていたのでなんとなくエア参加した気分でした。 ところでPerl道場の問題と回答率を眺めると、たとえば「cpanmとは何か」という問題の正答率が5割しかなかったりと驚き結果だったりします。回答者のステータスとか問題ごとの細かな統計をとれるようにしたりなどして育てれば、もっと面白い事になりそうですね。あるいは、システムのソースコードが公開されているのでRuby道場とかPython道場とかやってみても面白いと思いますし、育て甲斐のあるシステムだと思います。 今年はいつになく話題も豊富でいろいろなアイデアも湧いて来ました。興奮の冷めないうちにいろいろメモして来年ないしAdvent Calendarで何かできたらなあ、と思う次第です! とにかくお疲れ様でした!楽

    YAPC::Asia Tokyo 2011 にエア参加しました! - Islands in the byte stream (legacy)
    mattn
    mattn 2011/10/17
  • 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)
    mattn
    mattn 2011/08/22
    my $line = \&CORE::__LINE__; say $line->(); ってsayの行番号が出るの?
  • 常識を覆すソートアルゴリズム!その名も"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)
    mattn
    mattn 2011/05/20
  • プログラミング初心者にオススメの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)
    mattn
    mattn 2011/05/06
    僕は2冊目持ってて、1冊目3冊目を一切読んだ事もなくて、モダンPerl入門を持ってるというイケナイ子です。
  • DeNAに入社しました - Islands in the byte stream (legacy)

    既に2週間ほど経過していますが、4/1付けでDeNAに入社しました。なかなか刺激的な毎日を送っています。 さて、これからは忙しさが増す一方でしょうから、今のうちに初心を振り返っておきます。 私はこの数年間、コードを書きながら、自分の人生の中でやりたいことはなんだろうかを考えてきました。私は主にソフトウェアのパフォーマンスに興味があります。プログラミング言語やツールに興味があります。また、テストや開発手法にも興味があります。エンジニアのコミュニティのあり方や、ハッカー文化にも興味があります。これらの興味を導きだすもの、それは以下のような考えだと思い至りました。 ソフトウェアエンジニアがもっと幸せになれるような技術を提供する この考えは、以下のid:TAKESAKOさんのインタビューを読んでから鮮明になりました。 Webエンジニア武勇伝 第29回 竹迫良範氏 (2008) 竹迫 日ITエン

    DeNAに入社しました - Islands in the byte stream (legacy)
    mattn
    mattn 2011/04/18
  • 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)
    mattn
    mattn 2011/03/18
    多い日も安心!
  • Growl::Anyが新しくなりました - Islands in the byte stream

    Growl::Any コンストラクタでregister()相当のことができるようになってます。 各バックエンドごとに別モジュールにして、AnyEventのように事前にロードすることで使うバックエンドを選べるようになりました。どのバックエンドも入っていない場合はGrowl::Any::Nullがバックエンドになり何もしませんが、Growl::Any::IOHandleをロードすることでコンソールに対して出力することもできます。使い方は一つ前のエントリ参照のこと。

    Growl::Anyが新しくなりました - Islands in the byte stream
    mattn
    mattn 2011/02/21
    ++
  • Linux::Inotify2+Growl::Anyでファイルの変更を監視する - Islands in the byte stream (legacy)

    Linux::Inotify2ではなくFilesys::Notify::Simpleを使った方がポータブルですが、とりあえずは習作ということで。監視しているディレクトリで何かがあるとピコピコ通知されるので、ああ今PCが頑張っているのだなあという気持ちになれます。 #!perl -w use strict; use Linux::Inotify2; use Growl::Any 0.05; # ※Growl::NotifySend や Desktop::Notify などが必要 my $dir = shift(@ARGV) || '.'; my $w = Linux::Inotify2->new(); my $g = Growl::Any->new( appname => 'inotify-growl', events => ['modify'] ); # copied and modifi

    Linux::Inotify2+Growl::Anyでファイルの変更を監視する - Islands in the byte stream (legacy)
    mattn
    mattn 2011/02/21