タグ

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

  • Template Engine Nightで「Xslate振り返り」をしました - Islands in the byte stream (legacy)

    このあたりで一度まとめておこうと思ったのでいい機会でした。@moznionさん、ありがとうございました。 なお、スライド中の「arity」は、この直前のトークで「ASTのnodeの種類を表すのにarityという単語を使っているのは意味が違うのではないか」と質問されたので急遽いれたものです。これは、『ビューティフル・コード』でDouglas Crockfordが演算子優先順位構文解析法によってJavaScriptのparserを実装しており、その中でtokenの種類を表すのにarityという単語を使っていたからなのでした。Xslateはそのparserをもとにしているのでarityという言葉を使っています。 ビューティフルコード (THEORY/IN/PRACTICE) 作者: Brian Kernighan,Jon Bentley,まつもとゆきひろ,Andy Oram,Greg Wilso

    Template Engine Nightで「Xslate振り返り」をしました - Islands in the byte stream (legacy)
    YAA
    YAA 2014/11/28
  • 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)
    YAA
    YAA 2013/12/12
  • 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
    YAA
    YAA 2013/11/20
  • Xslate 3.0.0 released! - Islands in the byte stream

    This is an important release because it could break the existing code. https://metacpan.org/release/GFUJI/Text-Xslate-3.0.0 Includes a bug fix that has changed behavior: if you use a multi-byte string literal for a hash key like $hash["こんにちは"], the key was not dealt as a text string, but as a binary (byte) string. Now the behavior is fixed so "こんにちは" is a text string unless you specify input_layer

    Xslate 3.0.0 released! - Islands in the byte stream
    YAA
    YAA 2013/10/18
  • ISUCON3 に参加しました - Islands in the byte stream (legacy)

    id:yappo & id:kamipo とチーム「潰すつもりで来てください」を結成してISUCON3に参加してきました。結果は(失格にならなければ)11位で予選は通過できそうです。 YappoLogs: ISUCON3 で暫定で戦進出らしいです #isucon 好きな子のことかslow query logのことばかり考えてほかのことがおろそかになる性格なおしたい #isucon - かみぽわーる 選んだ言語はPerlで、できあがったコード(アプリ)はこちら*1: https://github.com/kamipo/isucon3 チーム全体としてはkamipoさんとYappoさんが二人三脚でSQLのクエリ改善をして、ぼくがそれ以外で主にアプリコードところを見るという感じで、役割分担がはっきりできていてよかったかなと思います。 ただ個人的にできなかったことがとてもたくさんあるので課題を感

    ISUCON3 に参加しました - Islands in the byte stream (legacy)
    YAA
    YAA 2013/10/08
  • 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)
    YAA
    YAA 2013/09/10
  • 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)
    YAA
    YAA 2013/08/22
  • Xslateのキャッシュ更新メカニズムの変更 - Islands in the byte stream (legacy)

    1.5015までのXslateのキャッシュ更新メカニズムでは問題があると報告されたため、1.5016で修正しました。 cache => 1 のとき、従来は render() ごとにテンプレートのキャッシュファイルのmtimeとテンプレートファイルのmtimeを比較してキャッシュの更新が必要かどうかをチェックしていたのでした。しかし、これでは以下の様なシナリオの元でキャッシュ更新ミスが発生しうるのでした*1。 foo.tx のmtimeが11:00とする 12:00 に foo.tx を render() する。このときcacheの mtime は 12:00 となる foo.tx を更新し、foo.txのmtimeが 12:00 になる foo.tx を render() すると、cacheはtemplate fileより古くないため、cacheを使う 1.5016では、キャッシュのmti

    Xslateのキャッシュ更新メカニズムの変更 - Islands in the byte stream (legacy)
  • Chrome for iOSのJSエンジンはJITなしのJavaScriptCore - Islands in the byte stream

    Chrome for iOSが発表されたが、スクリプトエンジンのパフォーマンスパターンがUIWebViewと同じである。したがって、アプリケーションの実装はUIWebViewベースで、スクリプトエンジンはJITのないJavaScriptCoreと考えられる。 Chrome for iOS で測定したV8Bench v7の結果は以下のとおり。 Chrome for iOS (iOS4.3.5/iPhone4): Score: 77.9 Richards: 68.1 DeltaBlue: 50.2 Crypto: 47.8 RayTrace: 126 EarlyBoyer: 144 RegExp: 34.2 Splay: 160 NavierStokes: 83.8これはUIWebViewと結果のパターンが同じである*1。 Score: 79.4 Richards: 65.1 DelaBlue

    Chrome for iOSのJSエンジンはJITなしのJavaScriptCore - Islands in the byte stream
    YAA
    YAA 2012/07/02
  • 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)
  • 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)
  • IRC botを駆使すると捗るらしいので手始めにlleval bot作った - Islands in the byte stream (legacy)

    Yokohama.pm#8でのYappoの話によれば、IRC botを駆使すると捗るらしい。 IRC botは作ったことがなかったので練習としてllevalを実行するbotを作ってみた。botのフレームワークとしてはAnySanを使い、llevalへのアクセスはLLEval-Clientを使った。 https://github.com/gfx/LLEval-Client/blob/master/example/irc-bot.pl #!perl -w use strict; use 5.10.0; use AnySan; use AnySan::Provider::IRC; use LLEval; use Encode qw(encode_utf8 decode_utf8); use constant _DEBUG => $ENV{LLEVAL_BOT_DEBUG}; use if _DE

    IRC botを駆使すると捗るらしいので手始めにlleval bot作った - Islands in the byte stream (legacy)
    YAA
    YAA 2011/11/22
  • 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)
    YAA
    YAA 2011/11/16
  • Re: モダンPerl連載第43回 - Islands in the byte stream (legacy)

    モダンPerlの世界へようこそ#43がXslateの話だと思ったらノイズ呼ばわりされたでござる、の巻。 著者であるid:charsbarさんの捕捉によれば以下のとおり モダンPerl連載第43回 - Charsbar::Note 「TTの代用品としての」Template::AlloyとText::Xslateについて簡単にまとめてみました。 ということですが、Catalystをビジネスに使うチームこそがPerlのスタンダードであり「周辺」はスタンダードを重んじるべきという論調には違和感を覚えました。 独自プロジェクトではなく家の改善にリソースを貸すべきという批判はたしかにMouseについては当てはまるのかもしれませんが、XslateはTemplate-Toolkitを代表とする既存のプロジェクトとは全く関係ない文脈で開始したプロジェクトです。TTプロジェクトに関わるという選択肢は考えもし

    Re: モダンPerl連載第43回 - Islands in the byte stream (legacy)
    YAA
    YAA 2011/07/25
  • 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)
    YAA
    YAA 2011/07/14
  • Xslate 1.3000 リリースメモ - Islands in the byte stream (legacy)

    Xslate 1.3000でhtml_builder()に非互換な変更を行いました。 html_builder()で作成したフィルタは、いままではunmark_raw()で型情報を落とした引数を受け取っていました。しかし1.3000からは引数をそのまま受け取るようになります。これによりフィルタが全ての責任を負えるようになりましたが、非互換な変更なので挙動が変わるフィルタも出てくる可能性があります。ご注意ください。 また未修正の問題も幾つかあります。いずれ対応するつもりですが、修正するまではご注意願います。 コメント終端子としてセミコロン(;)を使っているため、コメント内に& < >などが書けません。 TTerseにおいて、変数名として「x」が使えたり使えなかったりします。これはxが演算子であるためです。

    Xslate 1.3000 リリースメモ - 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)
    YAA
    YAA 2011/05/20
    噴いたww
  • DeNAに入社しました - Islands in the byte stream (legacy)

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

    DeNAに入社しました - Islands in the byte stream (legacy)
    YAA
    YAA 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)
    YAA
    YAA 2011/03/28
  • 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)
    YAA
    YAA 2011/03/28