タグ

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

  • 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)
    kokogiko
    kokogiko 2011/07/27
  • 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)
    kokogiko
    kokogiko 2011/06/09
  • 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)
    kokogiko
    kokogiko 2011/05/20
    地味に便利な変更がいくつか。
  • 常識を覆すソートアルゴリズム!その名も"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)
    kokogiko
    kokogiko 2011/05/20
    発想おもしろい!/全要素でsleep発行する時間が1秒以上かかったら、ちゃんと動かないよね?
  • コマンドラインから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)
    kokogiko
    kokogiko 2011/05/11
  • 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)
    kokogiko
    kokogiko 2011/03/18
  • IT業界を目指す大学生へ - Islands in the byte stream (legacy)

    新卒準備カレンダー 2011春という企画のエントリです。来であれば3/11日の投稿でしたが、東日大震災があったため日の投稿となりました。 東日大震災を目の当たりにして衝撃を受けつつも、身の回りでは困難があるわけでもないので何もしないのがもどかしく、しかし実のところ何もできることはなく、Twitterを眺める、NHKを眺める、コーディングするなどして過ごしています。しかし、電力不足等の懸念はあるものの、春からは社会人になることは依然として明らかです。であれば、今は粛々と日常生活を送るしかありません。そういう訳で、平常モードでポストします。 お前誰よ? [twitter:@__gfx__]と申します。この春からDeNAで働くPerlプログラマです。Perl好きが高じてPerlの仮想マシンをpure Perlで実装したりしたことがあります*1。Shibuya.pmやYAPC::Asiaで

    IT業界を目指す大学生へ - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2011/03/15
  • 「優れた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)
    kokogiko
    kokogiko 2011/03/01
  • Xslateが特定の条件で落ちる件(fixed in 0.2009) - Islands in the byte stream (legacy)

    Xslateが特定の条件で落ちるという現象がいくつか確認されていました。 Xslateでテンプレート大きいと困った件 ←修正されました - pepponの日記 http://twitter.com/kaz_hosib/status/26527707914:twitter id:pepponさんの記事を参考に巨大なファイルを生成してrender()したところ、5.8.9でSEGV、5.12.2で致命的エラーとなって落ちることを確認したため、修正してXslate 0.2009をリリースしました。ご確認ください。 http://search.cpan.org/dist/Text-Xslate/ これは、Xslateではなくperlの正規表現エンジンのバグ(あるいは限界)であったようです。 5.12.2で出力されるエラーメッセージに対するperldiagのエントリは以下の通り: Complex r

    Xslateが特定の条件で落ちる件(fixed in 0.2009) - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2010/10/07
  • クロージャにバインドされた値を見たい時 - Islands in the byte stream

    Moose/Mouseのmethod modifiersのようにクロージャを多用するプログラミングをしていると、バインドしている変数の中身も含めてDeparseしたいことがよくあります。 そういうケースでは、Data::Dump::Streamerが使えます。 #!perl -w use strict; use feature qw(say); use Data::Dump::Streamer qw(Dump); sub make_counter { my $i = shift || 0; return sub { $i++ }; } my $x = make_counter(); my $y = make_counter(10); say "# x-1:"; Dump $x; say "# y-1:"; Dump $y; $x->(); $y->(); say "# x-2:"; Dum

    クロージャにバインドされた値を見たい時 - Islands in the byte stream
    kokogiko
    kokogiko 2010/09/24
  • XSでCの文字列操作関数を使用するべきでない理由 - Islands in the byte stream (legacy)

    またはRe: PerlとC言語の型に対応する値への相互変換 XSでCの文字列操作関数の使用はなるべく避けるべきです。Cの文字列操作関数は危険で使いにくいものです。その代わりに、Perlが提供する安全で使いやすいSV APIを使ったほうが余計なことを考えずに済みます。 まずC言語でプログラミングする際の一般論として、strcat()やsprintf()などの文字列長を制御できない関数を使用するべきではない、というものがあります。これらの関数を使用して安全なプログラミングをするのは非常に困難であり、代わりにstrncat()やstrlcat()、あるいはsnprintf()といった文字列長を制御できる関数を使うべきです。 またPerl/XSに関して言うならば、そもそもCの文字列操作関数を使う必要はほとんどありません*1。char*の代わりにSV*を使うようにし、なるべくPerl API で文字

    XSでCの文字列操作関数を使用するべきでない理由 - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2010/09/08
  • Xslateのベンチマークについて - Islands in the byte stream (legacy)

    id:tokuhiromたちがベンチマークをいろいろいじったのですが*1、ベンチマークにリアリティを持たせるのはなかなか難しいですね。というわけで、ごちゃごちゃになっていたベンチマークスクリプトを、想定する環境を変えて二つに分けました。 一つは、"rich environment"(benchmark/x-rich-env.pl)。これは、永続的なPSGIアプリケーションでXSも利用可能な環境を想定したものです。テンプレートエンジンのインスタンスは再利用し、キャッシュも最高に効かせています。この状態だとXslateが桁違いに高速で、Template-Toolkitの100倍くらいのパフォーマンスです。 もう一つは、"poor environment"(benchmark/x-poor-env.pl)。これは、CGIスクリプトでしかもXSが利用できない環境を想定してあります。テンプレートエン

    Xslateのベンチマークについて - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2010/08/10
  • Re: CORE::もCORE::GLOBALも動かない? - Islands in the byte stream (legacy)

    CORE::もCORE::GLOBALも動かない? 組み込み関数すべてがオーバーライドできるわけではありません。printはオーバーライドできないもののひとつです。 オーバーライドできるかどうかは,組み込み関数のプロトタイプをサブルーチンプロトタイプで表現できるかどうかによります。以下に示すように,printはサブルーチンプロトタイプで表現できないような引数を受け取ることができるため,オーバーライドが禁止されています。 print "foo", "bar"; # 表現可能 print STDOUT "foo", "bar"; # 表現不可能 同様に,map, system, foreach などもサブルーチンプロトタイプで表現できないため,オーバーライドできません。 オーバーライドできるかどうかのは識別には,prototype組み込み関数が使えます。 use 5.010; sub is_o

    Re: CORE::もCORE::GLOBALも動かない? - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2009/12/16
  • Now Text::MicroTemplate is even faster than HTML::Template::Pro - Islands in the byte stream (legacy)

    前提:Text::MicroTemplateの速度を簡単にベンチマーク Text::MicroTemplateを最適化したので,ベンチマークをとってみた。 スクリプトはほぼ同じだが,loop countは-1*1にした。 http://github.com/kazuho/p5-text-microtemplate/blob/master/author/benchmark_templates.pl キャッシュを有効にした結果*2: $ perl benchmark_templates.pl Perl/5.10.1 (i686-linux) HTML::Template/2.9 HTML::Template::Compiled/0.94 HTML::Template::Pro/0.92 Template/2.22 Text::MicroTemplate/0.09 Benchmark: runn

    Now Text::MicroTemplate is even faster than HTML::Template::Pro - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2009/11/21
  • Perl 5.11.0 features on the syntax - Islands in the byte stream (legacy)

    Perl 5.11.0がリリースされたので,perl5110deltaから構文的な変更をいくつか拾ってみた。 Implicit strictures "use 5.11.0" はstrictも有効にするようになった The yada yada operator ('...') 未実装の機能を示す組み込み演算子が追加された each is now more flexible my($index, $value) = each @array ができるようになった keys @array, values @arrayもできるようだ delete local delete local $foo{bar} ができるようになった なお,これらは5.12.0へ向けた変更ではあるが,必ずしも5.12.0に入るとは限らない。 See also perl5110delta.

    Perl 5.11.0 features on the syntax - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2009/10/06
  • Mooseの速度が遅いという議論のまとめと感想 - Islands in the byte stream (legacy)

    Adam Kennedy (ADAMK)が「Array::CompareでMooseを使わないようにしてくれ」とRTでチケットを作成したことがきっかけとなり,Mooseの速度について議論が起きています。以下ラフなまとめ。 #49270: Remove the use of Moose - RT Array::CompareではMooseを使わないでほしい。Mooseを使いつづけるならばコマンドラインアプリケーションでは使うに堪えないし,PadreでもArray::Compare依存をなくすつもりだ。 Moose or No Moose - Perl Hacks (Array::Compareの作者ブログ) 最近いくつかのモジュールをMoose化しはじめたのだが,「Mooseを使うな」と言われてしまった。Mooseは楽なので使い続けたいが,どうしたものか。 Re: Moose Or No M

    Mooseの速度が遅いという議論のまとめと感想 - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2009/09/03
  • サブルーチンのアトリビュートの信頼性 - Islands in the byte stream (legacy)

    Perl 5.6.0以降にはアトリビュート(Attribute)というメカニズムがあり,変数やサブルーチンの宣言時に呼び出されるコールバックを設定できる*1。 このアトリビュートは実験的に取り入れられたのちに放置されるという不幸な運命をたどってしまい,現状では活用するのが難しい。特に,サブルーチンアトリビュートの扱いは非常に難しく,使用に際しては様々な問題がある*2。 一つの大きな問題は,アトリビュートハンドラが呼び出されるタイミングである。アトリビュートハンドラはサブルーチンオブジェクトの構築中*3に呼び出されるのだが,サブルーチンオブジェクトの構築が不完全なため,そのままではアトリビュートハンドラ内でできることはほとんどないのだ。以下のスクリプトはこのことを示す。 #!perl -w use strict; use Devel::Peek; sub MODIFY_CODE_ATTRIB

    サブルーチンのアトリビュートの信頼性 - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2009/05/14
  • switch文とif連鎖の比較 - Islands in the byte stream (legacy)

    Perl 5.10.0でswitch文が導入されたことにより,ifの連鎖はもっとわかりやすい構文に書き換えられるようになった。 use feature 'switch'; given($foo){ when("bar"){ ... } when("baz"){ ... } default{ ... } } switch文の導入で便利になった一方,このwhen()で使われるマッチングは「スマートマッチ」という特殊な演算子によって行われることのコストが懸念される。 そこで,switch文とif連鎖の速度を比較してみた。 また,かつて単純なif連鎖とよく比較されたのは,ハッシュテーブルを参照する方式である。if連鎖の複雑さがO(n)なのに対し,ハッシュテーブルの参照はO(1)であるため,連鎖が長くなるとハッシュテーブルの方が高速であるとされる。『Perlベストプラクティス』では,ハッシュテーブル

    switch文とif連鎖の比較 - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2009/05/13
  • Pure Perl HTML::FillInForm - Islands in the byte stream (legacy)

    id:charsbar氏のブクマを眺めていたらTowards a Pure Perl HTML::FillInForm: 61% tests passingという記事があった。 HTML::FillInFormが依存するHTML::ParserがXSモジュールであるため,Pure Perlで依存の少ないHTML::Parserを開発し,HTML::FillInFormをPure Perlモジュールにしたいという計画のようだ。 これは私も昔思ったことで,そこでHTML::FillInForm::LiteというPure Perlモジュールを書いたのだった。この時はもうXHTML前提でいいだろうと思いHTML4を入れてもXHTMLを出力するという仕様にしたのだが,HTML4は結局消えそうもないのでもう少し柔軟にしたほうが使いやすそうだ。 それにしてもHTML::FillInFormは古いモジュー

    Pure Perl HTML::FillInForm - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2009/05/02
  • B::Foreach::Iteratorでforeachイテレータを進める - Islands in the byte stream (legacy)

    B::Foreach::Iteratorというモジュールを書いた*1。 use B::Foreach::Iterator 0.02; foreach my $key(foo => 10, bar => 20, baz => 30){ printf "%s => %s\n", $key => iter->next; } iter->next()*2はforeachループのイテレータをひとつ進め、その値を返す。 また、iter->peek()はイテレータを進めることなく、次のイテレータを返す。 このモジュールを実装するにあたってpp_hot.cのpp_iter()を読んだのだが、確かにforeach ($min .. $max)は内部で配列を生成していない。また、foreach (reverse ...)についても最適化が行われており、reverse()した一時配列を作るのではなく、イテレータ

    B::Foreach::Iteratorでforeachイテレータを進める - Islands in the byte stream (legacy)
    kokogiko
    kokogiko 2009/04/02