タグ

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

  • Re: Perlスクリプトの一行目には何と書くべきなのか - Islands in the byte stream (legacy)

    Re: Perlスクリプトの一行目には何と書くべきなのか もしCPAN形式でスクリプトを配布するなら、それは#!/usr/bin/perlないし#!perlとするべきで、env(1)を使うべきではないと思います。 CPAN形式のディストリビューションでは、インストールするスクリプトのshebang行をインストール直前に修正し、正しいパスに書き換えてくれます。ただし、このルーチン*1はいまのところenv(1)を認識してくれません。つまり、env(1)を使った場合、インストールに使用したperlと実際に実行されるperlが一致するとは限りません。perlを一つしかインストールしていないシステムなら、これでも問題なく動きます。しかし最近では、システムにインストールしてあるperlには触らず、アプリケーション用のperlを別途perlbrewなどでインストールしてそちらを使うということもよく行われ

    Re: Perlスクリプトの一行目には何と書くべきなのか - Islands in the byte stream (legacy)
  • 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)
  • App::ginitというコマンドを書いたッ! - Islands in the byte stream

    gitリポジトリを公開していない、ないしリポジトリがgitでないソフトウェアのソースコードをちょっといじりたいことがあります。そんなときは、大体以下のようにしてgitリポジトリを初期化してからソースコードをいじり始めるのがよくある方法だと思います。 $ curl -LO http://example.com/great-software-2.0.tar.gz $ tar xzf great-software-2.0.tar.gz $ cd great-software-2.0 $ git init $ git add . # どこからとってきたのか明記する $ git commit -m "Initial import from http://example.com/great-software-2.0" # git diff initial で簡単にpatchを作れるようにする $ gi

    App::ginitというコマンドを書いたッ! - Islands in the byte stream
  • How fast system calls are? - Islands in the byte stream (legacy)

    「システムコールは遅い」とよくいわれるけれども、実際どのくらい遅いのかというのは測定したことがなかった。しかし実際に測ってみると、システムコールだからといって、Perlの他の操作と比較して必ずしも遅いとは限らないようだ。特に、time(2)*1は非常に高速で、配列リファレンスの生成("[42]")よりも速い。システムコールはあまねく遅いと思いこんでいたので、この結果は意外だ。 結果(CentOS 5): Perl/5.10.1 on i686-linux Benchmark: running ArrayRef, eval, for/1, open, stat, time for at least 1 CPU seconds... ArrayRef: 0 wallclock secs ( 1.18 usr + 0.00 sys = 1.18 CPU) @ 3332338.98/s (n=39

    How fast system calls are? - Islands in the byte stream (legacy)
  • Xslate now cooperates with Data::Section::Simple - Islands in the byte stream (legacy)

    [twitter:@typester]さんがText::MicroTemplate::DataSectionを書いて気になっていたところ、[twitter:@kazeburo]さんからもXslateの対応について要求があったので、version 0.1043でData::Section::Simpleと協調するようにしました。 ただし、依存モジュールを増やしたくない*1ので直接サポートではありません。 具体的には、以下のように使います*2: #!perl -w use strict; use Text::Xslate; use Data::Section::Simple; my $tx = Text::Xslate->new( path => [ Data::Section::Simple ->new()->get_data_section(), ], ); print $tx->rend

    Xslate now cooperates with Data::Section::Simple - Islands in the byte stream (legacy)
  • Clevyに関する覚書 - Islands in the byte stream (legacy)

    http://github.com/gfx/p5-Text-Clevy XslateのHEADではApp::xslateからも使えるようになってます*1。 コマンドラインから: $ xslate -E Text::Clevy -e 'Hello, {$ARGV.0} world!' Clevy Hello, Clevy world! $ xslate -E Text::Clevy -e '{$smarty.now|date_format:"%Y/%m/%d"}' 2010/07/01 $ xslate -E Text::Clevy -e ' {foreach from=$ARGV item=it name=it -} {$smarty.foreach.it.iteration} - {$it} {/foreach}' foo bar baz 1 - foo 2 - bar 3 - baz

    Clevyに関する覚書 - Islands in the byte stream (legacy)
  • HTML form management on Xslate - Islands in the byte stream (legacy)

    <追記> @typesterさんの指摘を受けて再考中。確かに、気軽にrawを書くようになると、結局「うっかりraw」をする可能性が生じて安全性が下がります。テンプレートではrawを使うべきではない、ということを前提にドキュメントと記事を書き直しました。 参考: @fujiwara: うっかりraw付ける付けないのミスというより、化ける!→rawつけると化けない!→じゃあとりあえずrawつけとけばイイよね! みたいな流れがありがち。@tokuhirom:ていうか、T::MT の思想では、基的に model とか controller 側で raw 属性つける、なんだよね。Xslate上でフォーム処理をしようとしたらいろいろハマったのでCookbook書きました。 The Xslate cookbook http://search.cpan.org/dist/HTML-Shakan=HTML

    HTML form management on Xslate - Islands in the byte stream (legacy)
  • Test::LeakTrace has been improved at 0.11 - Islands in the byte stream (legacy)

    Test::LeakTraceは、主にXSコードのメモリリークを追うために書いたライブラリだが、誤検出(false positive)が多く使いにくかった。今回RTチケットを受け取ったのを機に、検出アルゴリズムを再考したので、誤検出はほぼなくなったはずだ*1。 新しいアルゴリズムは非常に単純である。あるコードブロック(サブルーチン)の前にSVの個数を数えておき、ブロックの実行後にもう一度SVを数え、差があればなにか良くないことが起きている、とみなす。そして、詳しくトレースするために独自のopcode実行ループ*2の制御のもとでもう一度実行し、レポートを作成するというわけだ。あまりにも単純すぎて、なぜ昔はこの方法が思い浮かばなかったのか、不思議なくらいである。 *1:しかし、依然として内部キャッシュは検出する。キャッシュとメモリリークを区別することはおそらく不可能であろう。 *2:runop

    Test::LeakTrace has been improved at 0.11 - Islands in the byte stream (legacy)
  • Xslate vs. JSON::XS - Islands in the byte stream (legacy)

    (追記あり) Xslate 0.1033ではsort/mapにブロックを渡せるようになった。 <: $a.sort( -> $a, $b { $a.title cmp $b.title } ).join(", ") :> <: $a.map( -> $x { $x + 1 } ).join(", ") :>ところで[twitter:@xaicron] さんによれば、JavaScriptが使える端末向けの場合は、テンプレートエンジン使うよりJSONで吐き出すことが多いということであった。それならば、JSON::XSとの差も測定しておいたほうがいいだろう、ということでベンチマークしてみた*1。 $ perl benchmark/json.pl Perl/5.10.1 i686-linux Text::Xslate/0.1033 JSON::XS/2.29 Rate xslate json xs

    Xslate vs. JSON::XS - Islands in the byte stream (legacy)
  • How and when Xslate escapes html special characters - Islands in the byte stream (legacy)

    Xslate のエスケープポリシーについて考えたので、ここでまとめておく*1。 Xslate のエスケープ処理について、覚えることは以下の三つである*2。 テンプテートタグ内で生成した値は自動的にエスケープされる エスケープ処理をさせたくないときはmark_raw フィルタを使う エスケープ処理を強制させたいときは unmark_rawフィルタを使う 以下、詳しく解説する。 まず、基的には Text::MicroTemplate のポリシーを踏襲している*3。すなわち、テンプレートタグ内で生成された文字列については、HTMLのメタ文字(< > & " &apos)が自動的にエスケープされる。エスケープ処理は、一般式に対する出力コマンドが担っている。 # Text::Xslate version 0.1032 $ xslate -e '<foo>' # 地の文字列はそのまま出力 <foo>

    How and when Xslate escapes html special characters - Islands in the byte stream (legacy)
  • Tsukuba.xs #1 無事終了! - Islands in the byte stream (legacy)

    Tsukuba.xs #1 Beer Talksですが、主催者が遅刻*1したりマック勢がプロジェクターへつながらなかったりといろいろハプニングはあったものの、無事終えることができました。 会場を提供していただいたリクルートさんありがとうございました! 無茶ぶりにも関わらず楽しいトークをしてくださった竹迫さんにも感謝致します! 私の発表分の資料は以下のURIからどうぞ。 Inside Xslate ちなみに今回のバズワードは「Don't write XS! 」でしたw (by kazuho, charsbar, and miyagawa)。 *1:すみません!

    Tsukuba.xs #1 無事終了! - Islands in the byte stream (legacy)
  • Crazy module end markers - Islands in the byte stream (legacy)

    先日Classic::Perlというモジュールで奇妙なモジュール終末値*1を見た。 # snip __THE__ => __END__ =head1 NAME この発想はなかった。=>演算子の左辺は裸のワードでよく、しかも演算子の右辺は省略できる*2ため、これは単にリテラルの"__THE__"の後、__END__で通常通りスクリプトの終わりを宣言しているのである。 面白いことを考える人がいるものだ。 *1:真ならなんでもよい *2:つまり、foo(bar =>)という構文が許される。,演算子から類推すると理解できると思う。

    Crazy module end markers - Islands in the byte stream (legacy)
  • 来年から株式会社ディー・エヌ・エーで働きます - Islands in the byte stream (legacy)

    文系・不況・経歴に傷ありと三重苦を負っての就職活動でどうなることかと心配でしたが、無事就職活動を終えることができました。DeNAに就職します。Perlができると就職できるというのは当でしたね。 今回の就職活動においては、竹迫さんと牧さんには具体的な相談に乗っていただくなどお世話になりました。改めて御礼申し上げます。またその他関わった方々にも感謝致します。 私が就職できたのは、Shibuya.pmがあればこそ。Shibuya.pmというコミュニティへの参加が、ソフトウェアエンジニアとして生きることに確信を与えてくれたのです。竹迫さんをはじめとして、tokuhiromや牧さん、宮川さん、Yappo、typesterさんなどから得たものは、それ以前の独学で得たものより遥かに多様でした。特にtokuhiromとの出会ったことで、人とプログラミングについて語る喜びを知ったのは大きな財産です。牧さん

    来年から株式会社ディー・エヌ・エーで働きます - Islands in the byte stream (legacy)
  • XSでメモリークを避けるたった一つの方法 - Islands in the byte stream (legacy)

    XSでメモリリークを避ける基原則は、それほど難しくない。すなわち、作ったSV(およびSVファミリ)はすぐsv_2mortal()するのである。mortalなSVはスコープ*1から抜けるときに解放されるため、メモリリークは起こらない。つまり、あるスコープ内で新しく作ったすべてのSVをmortalな状態にしておくということだ。 この原則のもとでコードを書くと、誤ってリファレンスカウントを増やさなかったケースでは警告が頻繁に起きる。しかし、少なくともメモリリークは起こらない*2。メモリリークの検出は難しいので、警告が出るのは福音であろう。 もちろんこれは原則で、メモリリークにまつわることで覚えなければならないことは決して少なくない。 たとえば、XSUBの戻り値をSV*にするとき、sv_2mortal(RETVAL)してはいけない。これはPerlの仕様ではなくxsubppが勝手にsv_2mort

    XSでメモリークを避けるたった一つの方法 - Islands in the byte stream (legacy)
  • OSDC.TWで発表します - Islands in the byte stream (legacy)

    来週末、4/24に開催されるOSDC.TW(or Shibuya.pm #13)で発表します。 そこでは、高速テンプレートエンジン Xslate を紹介するつもりです。これはまだコードを書き始めたばかりで完成には程遠いものの、すでに従来のテンプレートエンジンと比較すると数倍のパフォーマンスが出ています。 もちろん、いくら高速でも使いにくければ意味がありません。この点では、たとえばText::MicroTemplateなどのように、出力を自動的にHTMLエスケープする機能などもすでに持っています。 とりあえず今のところは以下のようなテンプレートで: http://gist.github.com/367990 Hello, <:= $lang :> world!構文がよく似たText::MicroTemplateや、簡易文字列展開法であるs/%(\w+)%/$vars{$1}/gと比較すると以

    OSDC.TWで発表します - Islands in the byte stream (legacy)
  • Benchmarks to Text::ClearSilver - Islands in the byte stream (legacy)

    Text::ClearSilver(CS)のベンチマークをとってみた。 比較はTemplate-Toolkit(TT), HTML::Template::Pro(HT), Text::MicroTemplate(MT)、およびMobaSiF::Template(MST)と行った。 ベンチマークスクリプトは id:tokuhirom のものをベースに少し複雑にした。 結果: $ perl benchmark/cs_tt_mt_ht.pl 100 # テンプレートの大きさを指定できる 5.10.1 on i686-linux Template: 2.22 Text::MicroTemplate: 0.11 HTML::Template::Pro: 0.94 Text::ClearSilver: 0.10.5.1 MobaSiF::Template: 0.02 Rate TT CS MT HT

    Benchmarks to Text::ClearSilver - Islands in the byte stream (legacy)
  • Text::ClearSilver - New ClearSilver binding in Perl - Islands in the byte stream (legacy)

    id:Craftworks さんから仕事をもらいまして、ClearSilverのPerlバインディングを書きました。 http://search.cpan.org/dist/Text-ClearSilver/ git://github.com/Craftworks/Text-ClearSilver.git ClearSilver はCで実装されたテンプレートエンジンで、高速だという話はあるものの、Yapc::Asia 2007で紹介されたほかはそれほど話題にも上らず、私も今回の話が来るまでは知りませんでした。 もっとも、Perlの世界で流行らないのは当然です。ClearSilver のディストリビューションにはPerlモジュールが含まれているのですが、これの質が非常に低く*1、Perlデータ→HDFデータ*2の変換も用意されていないため、Data::ClearSilver::HDFを使う必

    Text::ClearSilver - New ClearSilver binding in Perl - Islands in the byte stream (legacy)
  • [perl][Yokohama.pm] Yokohama.pm#5に参加しました - Islands in the byte stream (legacy)

    Yokohama.pm#5に参加しました。Shibuya.pmとはまた違った雰囲気で楽しかったです。 Yokohama.pm テクニカルトーク#5 (id:clouder) 内容については id:hiratara さんの記事が詳しいです。 今日は Yokohama.pm #5 の日です 私はPerl 5.12の新機能について発表してきました。 Perl 5.12 features*1 *1:前夜祭を入れると6回目ではないかという声が挙がったため、スライドではIDを5.1にしてあります。5.5という説もあります。

    [perl][Yokohama.pm] Yokohama.pm#5に参加しました - Islands in the byte stream (legacy)
  • Perl 5.11.5 features - Islands in the byte stream (legacy)

    Perlの開発版である5.11系列の最新版がリリースされた。 http://search.cpan.org/dist/perl-5.11.5/ 今回もバグフィクス中心なので,特に列挙すべき新機能はない。組み込みファイルハンドルのクラスが修正されたのが唯一の大きな変更か。 5.11.5までは,組み込みファイルハンドルのクラスは不定だったのだが,5.11.5からは常にIO::HandleとIO::Seekableをスーパークラスとして持つIO::Fileとなる。 不定というの心もとないが,実際に不定だったのだから仕方がない。これは,以下のスクリプトを実行してみるとよくわかる。 #!perl -w use strict; use IO::Handle; open my $io, '<', $0; # open the script while(my $line = $io->getline){

    Perl 5.11.5 features - Islands in the byte stream (legacy)
  • List of MooseX:: modules on CPAN - Islands in the byte stream (legacy)

    何か面白いものはないかと思い,CPAN上の最初のリリースではないMooseX一覧を出力するスクリプトを書いてみた。 #!perl -w use strict; use CPAN; use version; my $hatena = grep{ $_ eq '--hatena' } @ARGV; my %processed; foreach my $m(CPAN::Shell->expand(Module => q{/^MooseX::/})){ my $version = $m->cpan_version; next if $version eq 'undef'; next if $version =~ /\A [0\.]+ 1 0*\z/xms; # maybe the first release my($name) = $m->cpan_file =~ / ([\w-]+) - \Q$

    List of MooseX:: modules on CPAN - Islands in the byte stream (legacy)