タグ

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

  • 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)
  • 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)
    TMTL
    TMTL 2012/08/01
  • 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)
    TMTL
    TMTL 2012/03/07
  • JavaScriptのthisの扱いが難しすぎる件 - Islands in the byte stream (legacy)

    [再々追記] (o.f = o.f)()の結果は右辺値・左辺値というルールで説明できるようです。コメント欄参照のこと。 [/再々追記] [再追記] これの解釈はどうすれば…。 [/再追記] [追記] ([o.f][0])() -> o.f は ([o.f, "a"][0])() とすると分かりやすいが、単にレシーバがArrayになっているだけらしい。 また (o.f)()と(tmp = o.f)の違いはブコメで指摘されているとおり、 o.f が (C++的な意味での)参照を返すと考えると理解できる。 [/追記] だれかこの現象を説明できる人はいませんか。私には難しすぎます。 In node: #!/usr/bin/env node var o = {}, tmp; o.f = function() { console.log(this.toString()) }; o.toString =

    JavaScriptのthisの扱いが難しすぎる件 - Islands in the byte stream (legacy)
  • Sugarを介さずMouseを使う - Islands in the byte stream (legacy)

    「MouseはいいけどDSLはちょっと」とbonnuさんやxaicronに言われたのですが、実はDSLを介さずにもMouseは使えます。使い方はMouse.pmを読むとだいたいわかります。 要はインターフェイスがバックエンドと分離しているから好きなように変えられるってことです。 以下は例ですが、真面目にやるならextends()やwith()のサポートもしたほうがいいですね。 package MouseX::Lite; use 5.14.0; use strict; use warnings; use Mouse (); use Data::Util (); sub import { my $class = shift; $class->define_class(scalar(caller), @_); return; } sub define_class { my $class = sh

    Sugarを介さずMouseを使う - 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)
    TMTL
    TMTL 2011/11/22
  • 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)
  • Xslate+Locale::Maketext::Lexiconを考える - Islands in the byte stream (legacy)

    前提:Locale::Maketext::Lexicon を Xslate でつかう (by tokuhirom) L::M::SimpleよりもL::M::Lexiconのほうが使いやすいというのはそのとおりなんですが、うまく使うにはもうちょい工夫が必要かなと。 具体的には以下のようなことに対応したいです。 *.poに書く値はHTMLタグが含まれるかも知れない。つまり「raw文字列」とみなすべき。 一方maketext($fmt, @args)の@argsはユーザー入力なのでエスケープしないとまずい 最終的にmaketextはraw文字列を返すべき これを反映させ、二つの関数を用意するのがいいのではないかと考えました。まずl()は普通の関数として動作するので入力値が最終的にエスケープされます。l_raw()は特殊バージョンで、@argsをエスケープし、raw文字列を返します。このl_ra

    Xslate+Locale::Maketext::Lexiconを考える - Islands in the byte stream (legacy)
    TMTL
    TMTL 2011/11/10
  • 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
  • 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)
  • 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)
  • Released FurlX::Coro! - Islands in the byte stream (legacy)

    Coroを使うと簡単にFurlで並列HTTP通信が出来ます。 #!perl # usage: http-ping.pl [urls...] use strict; use warnings; use Coro; use Coro::Select; # Furlよりも先にロードすること! use Furl; my @coros; foreach my $url(@ARGV) { push @coros, async { print "fetching $url\n"; my $ua = Furl->new(); my $res = $ua->head($url); print "$url: ", $res->status_line, "\n"; }; } $_->join for @coros; __END__ わざわざモジュール化する必要はあまりないのですが、上記スクリプトが時々参照される

    Released FurlX::Coro! - Islands in the byte stream (legacy)
    TMTL
    TMTL 2011/06/29
  • 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)
    TMTL
    TMTL 2011/06/19
  • Smart::Commentsでモジュールにサンプルコードを仕込む - Islands in the byte stream (legacy)

    ソースコードを読んでいると、関数の引数や戻り値の具体的な例がほしいと思うことがよくある。。そこで、実行可能なコメントを仕込むモジュールであるSmart::Commentsを使って、モジュール内にテストを兼ねたサンプルコードを仕込めばいいのではないかと考えた。これにより、開発者にとっては簡単なテストコードとして動き、読者にとっては具体例となるコードを簡単にソースコード内に埋め込むことができる。 package MyUtil; use strict; use warnings; use parent qw(Exporter); our @EXPORT = qw(add); use if __FILE__ eq $0, 'Smart::Comments'; ### assert: add(10, 20) == 30 sub add { my($a, $b) = @_; ### add(a, b)

    Smart::Commentsでモジュールにサンプルコードを仕込む - Islands in the byte stream (legacy)
    TMTL
    TMTL 2011/06/01
  • 常識を覆すソートアルゴリズム!その名も"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)
  • 最小限のls -laを書いてみた - Islands in the byte stream (legacy)

    プログラミング初心者にオススメのPerlにて、リャマ(『初めてのPerl』)を読了した段階でls(1)やgrep(1)の簡易版を作れるようになっていればよい、と書きました。そこで実装例として、最小限のls(1)を実装してみました。また、リャマ読了程度の知識を前提にすることと、Perl 5.8ベースで標準モジュールを以外は使わない<ことを制約としました。なお、所要時間は一時間程度です。 仕様は最小限ながらそれなりに役立つようにしたかったので、以下のようにしました。 引数としてディレクトリ名をうけとる 引数を省略するとカレントディレクトリ(.)になる オプションは-la(長い出力ですべてのファイルを表示)相当で固定 group名、user名は省略し、パーミッション・ファイル更新日時・ファイル名を出 実装の際のポイントは以下のとおりです。 stat()やlocaltime()の戻り値は扱い

    最小限のls -laを書いてみた - Islands in the byte stream (legacy)
  • コマンドラインから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)
  • プログラミング初心者にオススメの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)
    TMTL
    TMTL 2011/05/06
  • Xslateの関数でクロージャを使う - Islands in the byte stream (legacy)

    [twitter:@shmorimo]さんとのやりとりのなかで考えた、Xslateの関数にクロージャを渡したいケースのまとめです。 まず前提条件: リクエスト毎にクロージャをXslateに渡したい Xslateの登録関数を定義できるのはnew()のときのみ 動的に関数を加えることはできない リクエスト毎にXslateをnewすると遅いので避けたい このような条件下で、リクエスト毎にクロージャを登録する方法は幾つかあります。 render()のパラメータとして渡す KolonにせよTTerseにせよ、値に()演算子を適用すると関数を呼び出せます。したがって、単にrender()のパラメータにクロージャを渡すことで関数呼び出しができます。 #!perl -w use strict; use Text::Xslate; my $tx = Text::Xslate->new(); print $t

    Xslateの関数でクロージャを使う - Islands in the byte stream (legacy)
  • 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)
    TMTL
    TMTL 2011/03/18