投稿

[perl] File::Path::mkpath() に複数のパスを与える

File::Path の mkpath で、複数のディレクトリパスを一気に作ってもらおうとすると困りそうなことについてです。make_path と mkpath はディレクトリパスが複数の場合の扱いに違いがあります。 make_path($dir1, $dir2, $dir3); # OK make_path($dir1, $dir2, $dir3, {}); # OK mkpath($dir1, $dir2, $dir3); # NG 【なんと!】 mkpath($dir1, $dir2, $dir3, {}); # OK mkpath([$dir1, $dir2, $dir3]); # OK そもそも、複数のパスを指定することを止めれば安心して使えます。 mkpath($_) for ($dir1, $dir2, $dir3);

[Perl] [CPAN] 球面三角法

地球を球体と仮定した時の、二地点間の方位角や距離を求める場合などに役立つかもしれない、球面三角法についての関数は Math::Trig のGREAT CIRCLE DISTANCES AND DIRECTIONSの辺りにあります。

[plack] response body を変更する Middleware の試作

Web アプリケーションが見事にコードリファレンス一つに抽象化されている PSGI では、あるアプリケーションに前処理・後処理を追加して、動作をちょっと変更する Middleware という仕組みがあって、それで色々と面白いことができそうなので、試しにくだらないものを作ってみました。 今回作ったのは、実用性皆無ですが、後処理を追加することで、出力をすべて大文字にしてくれる Middleware です。 必要なモジュール: Plack, Twiggy 使い方: plackup -s Twiggy app.psgi で動かして、http://localhost:5000/stream などを見てみる。 package Plack::Middleware::UpperCase; use strict; use warnings; use parent qw(Plack::Middleware); sub call { my ($self, $env) = @_; my $res = $self->app->($env); return $self->response_cb($res, sub { my $res = shift; return sub { my $body_chunk = shift; if (defined $body_chunk) { return uc $body_chunk; } else { return; } }; }); } package main; use strict; use warnings; use AnyEvent; use Plack::Builder; use Plack::Response; builder { # enable 'Plack::Middleware::UpperCase'; enable sub { Plack::Middleware::UpperCase->wrap(@_) }; ...

[javascript] call と apply のサンプル

JavaScript の関数オブジェクトについている不思議なメソッド、call と apply についての記事です。これを使うと使いたいメソッドを実行時に文字列で指定するような感じの動的メソッド呼び出しが実現できます。 call, apply の第一引数は、呼ばれた先でのthisを指定します。 callとapplyの違いは、引数の与え方です。例: fn.call(context, arg1, arg2, ...); fn.apply(context, [arg1, arg2, ...]) var list = []; list.push("hoge0"); list["push"].call(list, "hoge1"); var m = "push"; list[m].apply(list, ["hoge2"]); console.log(list); // output: ["hoge0", "hoge1", "hoge2"]

貼り付けたコードを実行してくれるペーストビン ideone

このタイプのペーストビンでは、 codepad の方が有名ですが、現時点では対応言語が少ないので、JavaScript, Scala, Pascal, Prolog, Erlang, Go など盛り沢山の言語を実行してくれる ideone というのも知ってたら役に立つと思います。 ideone の codepad にない機能として、標準入力をとってそれをいじったりできます。 例: http://ideone.com/sxZN8JM1

風呂桶一杯の水道水の脱塩素に必要なビタミンCの量

適当に検索すると、お風呂の脱塩素にはビタミンC粉末を1グラムでOKとあるけど、とりあえず自分でも計算してみました。 計算 日本国の法律で決まっている最低限の塩素濃度すなわち次亜塩素酸ナトリウム濃度は、0.1ppmとあり、200Lの水で考えると、次亜塩素酸ナトリウムの比重を気にしないで計算すれば、0.02g また、次亜塩素酸ナトリウムの式量は77.44 ビタミンCすなわちL-アスコルビン酸ナトリウムの式量は、198.11で、1分子で電子3個分還元できるとのことなので、必要なビタミンCの質量は、(0.02 / 77.44) / 3 * 198.11 = 0.017g 考察 高度浄水処理施設のない給水地域は夏場には結構塩素濃度を上げるみたいですが、ビタミンC粉末は意外と安いので、水200LあたりビタミンCを1グラムほど入れておけば、6ppmくらいまで対応出来るようで一安心です。比重が水に近い普通の粉末1グラムは、小さじ1/5杯です。 備考 ビタミンC粉末はあまり地上のお店ではお手頃な価格で売られていない様ですが、楽天市場などで探したら売っています。 また、お湯を張る前に湯船の底にまいておいた方が、湯張中に蒸気になって鼻がつんとするのを防げます。

Twitter の Streaming API における日時表現の解析について

目的 DateTime が便利なので、DateTime::Format::* で、 Streaming API で流れてくる、こういう表記 "Fri Jan 22 13:52:17 +0000 2010" を上手くパースしたい。 この表記方法は、古き良き時代を感じさせるC言語の ctime() に由来するものであるとのこと。 日付の表記に関するノート 現状 DateTime::Format::HTTP , DateTime::Format::Mail は失敗。 ただし、+0000をUTCとかGMTに置換すれば DateTime::Format::HTTP でOK DateTime::Format::DateParse は成功。これを使うべき。 DateTime::Format::Strptime で自作しても可 (DIY派専用) コード use DateTime::Format::DateParse; my $dt = DateTime::Format::DateParse->parse_datetime('Fri Jan 22 13:52:17 +0000 2010'); use DateTime::Format::Strptime; my $formatter = DateTime::Format::Strptime->new( pattern => '%a %b %d %T %z %Y', locale => 'en_US', ); my $dt = $formatter->parse_datetime('Fri Jan 22 13:52:17 +0000 2010');