タグ

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

  • 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)
    punitan
    punitan 2014/10/20
  • DalvikバイトコードのMethod数65k制限について - Islands in the byte stream (legacy)

    Androidアプリケーションにはアプリケーションのメソッド数が65kを超えられないという制限があるのだけど、その詳細を知らなかったので調べた。 参考: Does the Android ART runtime have the same method limit limitations as Dalvik? まとめると メソッド数制限の実体は(VMとしての)DalvikではなくDalvik bytecodeのinvoke系で使うmethod idが16bit intであること つまり、アプリケーションで定義したメソッド数が65kを超えるかどうかではなく、ひとつのdex fileで参照しているメソッド数が65kを超えるときに問題が起きる ARTもDalvik bytecodeを一旦介する以上、同じ制限をもつ という感じか。さらに手元で試してみたところ、問題が起きるケースではdx(1)が例外

    DalvikバイトコードのMethod数65k制限について - Islands in the byte stream (legacy)
    punitan
    punitan 2014/07/04
  • WEB+DB PRESS Vol.81にAndroidの記事を書きました - Islands in the byte stream (legacy)

    Google I/O 2014が来週に迫った今日このごろですが、I/Oの前日に発売されるWEB+DB Vol.81に同僚たちとAndroidの特集記事を寄稿しました。私の担当はAndroid Studio+Gradleについてです。 とにかく変化の早いAndroid開発環境ですが、この一年で開発環境周りは格段に良くなってきています。また、いまから開発を始めるアプリなら2.x系のサポートも必須ではないでしょう。今回の記事ではそのあたりを踏まえて、Android開発の知見をまとめました。Androidの特集記事は以下の様な構成です。どうぞよろしく! Androidアプリ開発最前線 設計,実装,デザインの新定石! 第1章:最新Android開発環境構築ガイド Android StudioとGradleの基礎知識……藤 吾郎 第2章:あとで苦労しないための設計と実装 簡単なルールの導入で,可読性,

    WEB+DB PRESS Vol.81にAndroidの記事を書きました - Islands in the byte stream (legacy)
    punitan
    punitan 2014/06/20
  • 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)
    punitan
    punitan 2013/10/08
  • PerlIO::scalar でopenできるのはバイト列だけ! - Islands in the byte stream (legacy)

    Perl 5.18 からは、PerlIO::scalarでopenできるのはバイト列だけになるようです。wide characterを含んだスからリファレンスをopen()しようとしても警告と共にopen()が失敗します。 perldialog: Strings with code points over 0xFF may not be mapped into in-memory file handles (W utf8) You tried to open a reference to a scalar for read or append where the scalar contained code points over 0xFF. In-memory files model on-disk files and can only contain bytes.See perl5179

    PerlIO::scalar でopenできるのはバイト列だけ! - Islands in the byte stream (legacy)
    punitan
    punitan 2013/04/26
  • 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)
    punitan
    punitan 2013/04/18
  • strict無効化の誤謬 - Islands in the byte stream (legacy)

    シンボルテーブルを操作するときに"no strict 'refs'"で一時的にstrictを無効化することはよくあるが,デバッグしにくいバグが紛れ込む可能性がある。 たとえば,以下のようにアクセサを動的に生成するコードはCPANのそこかしこにある。 sub make_accessor{ my($class, $property) = @_; no strict 'refs'; # simple read-only accessor *{$class. '::' . $property} = sub{ my($self) = @_; return $self->{$property}; } } このようなコードによって生成されたメソッドを,正しくオブジェクトに対して使う分には問題ない。しかし,このメソッドをクラスメソッドとして呼び出すと,グローバル変数${$self}を参照し,その値をハッシ

    strict無効化の誤謬 - Islands in the byte stream (legacy)
    punitan
    punitan 2013/04/07
  • Mouseで「あるメソッドを持ったオブジェクト」という制約をつくる - Islands in the byte stream (legacy)

    互いに継承関係がなくてもRoleを適用していなくても duck_type() を使えばOK!しかも自前で can() するより高速なスグレモノ*1。 use strict; use warnings; package Foo { use Mouse; sub x { 1 } __PACKAGE__->meta->make_immutable(); } package Bar { use Mouse; sub x { 2 } __PACKAGE__->meta->make_immutable(); } package Baz { use Mouse; __PACKAGE__->meta->make_immutable(); } package Main; use Mouse; use Mouse::Util::TypeConstraints; duck_type 'MyApp.TypeWit

    Mouseで「あるメソッドを持ったオブジェクト」という制約をつくる - Islands in the byte stream (legacy)
    punitan
    punitan 2013/03/21
  • CPAN Testersの紹介 - Islands in the byte stream (legacy)

    最近Perlのネガティブな話が話題ですが、ちょっとCPANまわりのサービスの自慢をさせてください。それは CPAN Testers です。 CPAN Testers *1 とは、CPANに公開したモジュールがどの環境で動きどの環境でどういうエラーがでるのかを集積するサービスです。 よく「Perl/CPANは枯れている」といいますが、それを支えているのはPerl歴史とかPerlerの性格といった形のないものではなく、この CPAN Testers なのです。これがすごくいいんですよ。 特徴をざっと並べるとこんな感じ: Social testing service for CPAN Testerたちがモジュールを手元の環境でテストしてそのレポートをサーバに送る CPAN.pm のプラグインとしてレポートモジュールが存在する 同じ環境でもビルドオプションが違うパターンもあるので、自分ひとりで様

    CPAN Testersの紹介 - Islands in the byte stream (legacy)
    punitan
    punitan 2013/03/10
  • Data::Dumper が壊れているという惨事 - Islands in the byte stream (legacy)

    あるいは PERL_CPANM_OPT=-n は危険だという話。 それはこのtweetから始まった。 結局これは Data::Dumper 2.143 が壊れていたからなのだが、そこに至るまでがちょっと大変だったので記録しておく。 まず、再現スクリプトは以下のものだった。 # executed in perl 5.10.1 use strict; use warnings; use Data::Dumper; use Text::Xslate; my $tx = Text::Xslate->new({ syntax => 'TTerse' }); my $template = <<TMPL; [% value | dump %] TMPL my $value = +{ 'ab' => 'c', }; print Dumper($value); my $ret = $tx->render_s

    Data::Dumper が壊れているという惨事 - Islands in the byte stream (legacy)
    punitan
    punitan 2013/03/07
  • B::Size2 をデバッグしたときのメモ - Islands in the byte stream (legacy)

    B::Size2 で問題が起きるという報告を受けて修正するまでのメモ。 まず再現ですが、これは標準モジュールを使っても簡単に再現できたのでテストに追加してこれを使います。 diff --git a/t/002.terse.t b/t/002.terse.t index ccf6a99..02de21a 100644 --- a/t/002.terse.t +++ b/t/002.terse.t @@ -6,7 +6,7 @@ use Test::More tests => 1; use B::Size2; use B::Size2::Terse; -foreach my $pkg (qw(main B::Size2 B::Size2::Terse)) { +foreach my $pkg (qw(main B::Size2 B::Size2::Terse Test::More)) { my

    B::Size2 をデバッグしたときのメモ - Islands in the byte stream (legacy)
    punitan
    punitan 2013/02/01
  • Released B::Size2, forked from B::Size 0.09 - Islands in the byte stream (legacy)

    B::Size が2006年のリリースを最後にメンテナンスされておらず、最近のPerlではビルドできないという問題がありました。そこで何年か前にパッチを書き、patched verをgithubにあげてはいたのですが、CPAN経由でインストール出来ないとどうにも不便です。 そこで、B::SizeをforkしてB::Size2とし、メンテナンスを継続することにしました。 https://metacpan.org/release/B-Size2 https://github.com/gfx/p5-B-Size2 B::Size2 2.00時点では機能的にはB::Sizeとまったく変わりありませんが、今後きちんとメンテナンスして精度を高めたり使いやすくしたりするつもりです。 参考文献: packageごとのメモリ使用量(と増分)を確認できる Plack::Middleware::MemoryUs

    Released B::Size2, forked from B::Size 0.09 - Islands in the byte stream (legacy)
    punitan
    punitan 2013/01/17
  • MonoでCのstdioを呼び出してみる - Islands in the byte stream (legacy)

    MonoはMono.Posixアセンブリを使うとPOSIXの関数を呼び出せるようだ。 そこでCのstdioを使ってcat(1) を実装してみた。 https://github.com/gfx/mono-cat // $ mcs -r:Mono.Posix Cat.cs using System; using Mono.Unix.Native; public class Cat { public static void Main(string[] argv) { foreach (var file in argv) { var fp = Stdlib.fopen(file, "r"); Int32 c; while ( (c = Stdlib.fgetc(fp)) != Stdlib.EOF ) { Stdlib.putchar(c); } Stdlib.fclose(fp); } } }

    MonoでCのstdioを呼び出してみる - Islands in the byte stream (legacy)
    punitan
    punitan 2012/12/12
  • perl Makefile.PL | cpanm # for devel requires - Islands in the byte stream (legacy)

    Makefile.PL自身のためのモジュールをどう管理するかが結構面倒なわけです。M::IのプラグインでいえばModule::Install::AuthorRequiresがあるのですが、これは単にインストールされていないモジュールを報告するだけで、結局インストールは手作業で行わなければならない。 これについては過去に考えたこともあります。 Install developper's prerequisites with cpanm - Islands in the byte stream しかし上記の方法では結局二度手間なので気に入らないんですよね。 そこで今日思いついたのが以下の方法。Makefile.PLに記述します。これなら一ファイルですみますし、モジュール名の入力は一度だけですから管理の手間もかかりません。しかも、一度Makefile.PLを実行してエラーになったら`perl Ma

    perl Makefile.PL | cpanm # for devel requires - Islands in the byte stream (legacy)
    punitan
    punitan 2012/09/01
    perl Makefile.PL | cpanm # for devel requires - Islands in the byte stream (via Instapaper)
  • 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)
    punitan
    punitan 2012/08/05
  • 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)
    punitan
    punitan 2012/07/31
  • 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
    punitan
    punitan 2012/06/29
  • XSで共有文字列を活用する - Islands in the byte stream (legacy)

    Perl 5.8以降には共有文字列というメカニズムがあり,非常に限定的ながら,うまく使用するとメモリと速度の双方を節約できる。 基的な使い方: SV* sv = newSVpvn_share(pv, len, hash); SV* sv = newSVpvs_share("..."); これでsvの文字列部分がインタプリタ全体で共有されるため,同じ文字列を複数個生成してもmalloc(3)は一度で済む。 実際には,共有文字列SVの生成速度そのものは通常の文字列SVよりも遅いことがある。しかし,共有文字列の真価は,ハッシュキーとして使用する際に発揮される。 ハッシュからキーを検索する際にはキーとなる文字列の照合*1を行わなければならないが,共有文字列はポインタ値がインタプリタを通して等しいので,文字列の照合は行わなくてすむ。また,共有化文字列SVは内部にハッシュ値*2を持っているので,ハッ

    XSで共有文字列を活用する - Islands in the byte stream (legacy)
    punitan
    punitan 2012/06/29
  • 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)
    punitan
    punitan 2012/03/29
  • 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)
    punitan
    punitan 2012/03/07