読者です 読者をやめる 読者になる 読者になる

リロケータブル Perl

tl;dr github の release ページ からすきな場所に置けば使える perl がダウンロード可能 リロケータブル perl って? 通常 perl は build 時に モジュールの読み込み path (@INC) を決定するため、インストール後 perl のディレクトリを移動するとモジュール…

MDBM_File!

https://github.com/yahoo/mdbm MDBM is a super-fast memory-mapped key/value store. の official perl binding MDBM_File を cpanm で簡単にインストールできるようにした。 https://github.com/shoichikaji/perl-mdbm-install > cpanm git://github.com/…

yet another perl module authoring tool

Daiku is yet another build system for Perl5. を使う、authoring tool を作ってみた。 https://github.com/shoichikaji/Dist-Template > cpanm https://github.com/shoichikaji/Dist-Template.git > distt Hello::World とすると このような Hello::World …

GrowthForecast!

前のエントリーで リロケータブル=どこに置いても使える Perl が欲しいと書いた。 その有用性を示すため、GrowthForecast をインストール済の relocatable でビルドした Perl を用意してみた。 https://github.com/shoichikaji/relocatable-perl-growthfore…

リロケータブル perl の実現性

少し前に node に触ってみようと 公式サイトから バイナリをダウンロードし $HOME/node に入れたところ、すぐに使えて感動した。 perl もこのようになっていてほしい。つまり 最新バージョンの pre compile 済みのバイナリが手軽にダウンロードでき、 好きな…

perl 5.8 / 5.10 で closure の挙動が違った

#!/usr/bin/env perl use strict; use warnings; { my $x = 1; sub func { sub { $x }->(); } } print func(), "\n"; このスクリプトを実行すると perl 5.10.0+ なら想定通り 1 が返るが、5.8.9 以下で実行すると > perl ex.pl Use of uninitialized value i…

go をクロスコンパイル対応でインストール

http://unknownplace.org/archives/golang-cross-compiling.html https://github.com/davecheney/golang-crosscompile http://dave.cheney.net/2013/07/09/an-introduction-to-cross-compilation-with-go-1-1 https://github.com/laher/goxc 例えば golang …

Mac の system perl には はじめからいろんなモジュールが入っていた

今日気づいたのだが Mac OS X 10.9 の /usr/bin/perl には、はじめからいろんなモジュールが入っていた。 > curl https://raw.github.com/syohex/emacs-helm-perldoc/master/helm-perldoc-collect-modules.pl | /usr/bin/perl - 例えば、DBD::SQLite, DBI, D…

1つの docker コンテナで gitlab を動かす

gitlab のインストーラとして id:akagisho 作 https://github.com/akagisho/gitlab-installer があるが、これを docker のコンテナで実行すると mysql, redis の起動ができず失敗する。 そこで上記スクリプトの前にmysql, redis を起動しておくDockerfile を…

yokohama pm に行ってきた

昨日行われた yokoyama pm にいってきた。 発表はもちろんすばらしかったが、それよりも ytnobody さんからとても有益な話が聞けたので、 メモっておきたい。 僕は社内でひとりさみしくPerlを書いていて、 GHE に置いているモジュールをどう使うかで悩んでい…

Perl - モジュール管理

開発環境で carton install してできた local ディレクトリをそのまま本番環境に持っていけばいいと思う。

Perl - Plack::Middleware::StatusHtml を書いた

web サーバの死活監視として /status.html へアクセスしてみるということをよくやると思う。 ということで、これだけをやる Middleware を書いた。 https://github.com/shoichikaji/Plack-Middleware-StatusHtml 例 外部ファイルに http status code を書い…

Perl - Amon2::Plugin::Web::Github::Webhook を書いた

https://github.com/shoichikaji/Amon2-Plugin-Web-Github-Webhook github webhook アプリをつくろうとしたとき github からのアクセスのみに制限したい x-github-envent ヘッダーに簡単にアクセスしたい body parameter payload に簡単にアクセスしたい と…

今日知ったこと

x.pl print __PACKAGE__, "\n"; を実行するともちろん、 main と出力される。 一方、 y.pl package Y; do "x.pl"; を実行すると、Y と出力される。 疑問だった http://ks0608.hatenablog.com/entry/2013/09/16/040838 は application が Plack::Sandbox::XXX…

Perl - Amon2::Plugin::Web::Text

https://github.com/shoichikaji/Amon2-Plugin-Web-Text text/plain な response を返したいときがよくあるので plugin にしてみた。 SYNOPSIS use Amon2::Lite; __PACKAGE__->load_plugins('Web::Text'); get '/' => sub { my $c = shift; return $c->rende…

Try::Tiny::Retry is awesome!

https://metacpan.org/release/Try-Tiny-Retry Perl で retry 処理を書くとき、Sub::Retry をよく使っていた。 これの唯一の不満がすべての retry が失敗ときの処理を書きたいとき、自分でキャッチするコードを書かなければいけないところだった。つまり use…

Perl - App::Path::Maker というやつを書いた

何かしらのひな形となるファイルやディレクトリを作りたい場面がよくある。 要するに 簡単なテンプレート機能 ファイルやディレクトリを簡単に作る機能 が欲しい。こういったとき、その場限りのものを自作しようか、ちゃんとしたモジュールを使うべきかなど…

Perl - carton exec 省略

Perl のアプリを carton で管理し開発していると、毎回 > carton exec ... と打たないといけないからちょっと面倒。そんなときアプリのディレクトリトップに DIR=$(cd $(dirname ${BASH_SOURCE:-$0}) >/dev/null; pwd) export PATH=$DIR/local/bin:$PATH exp…

Perl - minil add コマンド

Minilla に 新しいファイルを追加する minil add コマンドを加えてみた。 https://github.com/shoichikaji/Minilla-CLI-Add 使用例 % minil new My::App % cd My-App % minil add My::App::Anothor Retrieving meta data from lib/My/App.pm. Writing /Users…

perl -e 'sleep 1; die' の exit stauts

perl -e 'print "$^O, $]\n"; sleep 1; die' 2>/dev/null; echo $? の結果が % perl -e 'print "$^O, $]\n"; sleep 1; die' 2>/dev/null; echo $? darwin, 5.018001 60 % /usr/bin/perl -e 'print "$^O, $]\n"; sleep 1; die' 2>/dev/null; echo $? darwin, …

perl のインストール

http://www.cpan.org/src/README.html perlbrew, plenv とか、はたまた perl-build とか xbuild とかいろいろあるけど、たいていの場合ただ単に wget http://www.cpan.org/src/5.0/perl-5.18.1.tar.gz tar -xzf perl-5.18.1.tar.gz cd perl-5.18.1 ./Configu…

Perl - lib::relative というのを書いた

https://github.com/shoichikaji/lib-relative use FindBin qw($Bin); use lib ("$Bin/extlib/perl5", "$Bin/lib"); を use lib::relative qw(extlib/lib/perl5 lib); のようにかけるモジュールを作ってみた。 .... というか既にこのようなモジュールあるの…

Perl - clessc のバインディング

clessc - A C++ implementation of the LESS CSS Compiler の perl バインディングを書いてみた。 https://github.com/shoichikaji/CSS-clessc なんとなくできたが 外部の src をどのように build したらいいかよくわからない。 本当は ./configure && make …

Perl - std::string の typemap

memo TYPEMAP string T_STRING OUTPUT T_STRING $arg = newSVpvn( $var.c_str(), $var.length() ); INPUT T_STRING $var = string( SvPV_nolen($arg), SvCUR($arg) );

Perl - アクセッサ

sub field { shift->{field} } sub field { $_[0]->{field} } のどちらの方が速いのかはかってみたら、 shift の方が速かった。完全に逆だと思ってた。 #!/usr/bin/env perl use strict; use warnings; use Benchmark qw(cmpthese); package Dummy { sub new…

Perl - carton で管理しているやつをfatpackする

carton で % tree . ├── cpanfile ├── cpanfile.snapshot ├── lib │ └── MyClass.pm ├── local │ ├── cache ... │ └── lib │ └── perl5 │ ├── Net ... │ ├── Parallel ... │ └── darwin-2level ... └── script.pl のようにして管理しているとき、 script.pl …

Perl - plackup したとき

use strict; use warnings; sub body { 'body' } sub { [200, [], [ body ]] } を plackup したときは問題ないが use strict; use warnings; sub body { 'body' } package Dummy; package main; sub { [200, [], [ body ]] } にして plackup すると Error wh…

Perl - New slice syntax for 5.19.4+

http://www.nntp.perl.org/group/perl.perl5.porters/2013/07/msg204023.html perldelta.pod The new %hash{...} and @array[...] syntax returns a list of key/value (or index/value) pairs. (おそらく @array[...] は %array[...] の間違い) perl 5.19.4…

Perl - Caroline を使ってみた

tokuhirom / Caroline - Yet another line editing library インタラクティブなシェルのようなものを簡単に作れる。 試しに、remote と local で行ったり来たりできる scp をし易くするスクリプトを書いてみた。 ssh の接続を保ちつつ、local, remote で ls …

プロセス置換 on freebsd

cat <(ls /usr/bin) を プロセス置換 (Process substitution) と言うらしい。 freebsd6上の bash3.2 で plenv を使おうとしたところ、 plenv-version-file-read 17行目のプロセス置換で /dev/fd/63: No such file or directory のようなエラーがでてしまいち…

perl with gcc2.95

FreeBSD 4.11, gcc2.95 というレガシーなマシンで perl5.18 を使ってる。 特に問題なく動いていたけれど、C++なXSモジュールをビルドしようとしたところ、 ...i386-freebsd/CORE/perl.h:1703: badly punctuated parameter line in `#define' ...i386-freebsd…

Perl - Parallel::FileRead

Parallell::FileRead というのを書いた。 例えば10GBの大きいログファイルを処理しようとしているとき use Parallel::FileRead; Parallel::FileRead->run( file => '10GB.log', worker => 5, # how many workers on_worker => sub { my ($fh, $index) = @_; …

Perl - File::pushd

File::pushd が { $dir = pushd "/usr/local"; ... } より pushd "/usr/local" => sub { ... }; みたいにかけた方がかっこいいと思ったので書いてみた。 #!/usr/bin/env perl use strict; use warnings; use Cwd qw(cwd); sub pushd { if (@_ == 1) { my $ta…

perl -e 'local $?; exit 1'

% perl -e 'local $?; exit 1'; echo $? 0 % perl -e '$? = 2; { local $?; exit 1 }'; echo $? 2 % perl -e '$? = 2'; echo $? 0 % perl -e 'END { $? = 1 }'; echo $? 1 % perl -e 'END { local $? = 1 }'; echo $? 0 perlipc をみながら、$SIG{CHLD} のと…

Perl - 子プロセスの終了ステータスの調べ方

http://perldoc.perl.org/functions/system.html # sample.pl system @ARGV; if ($? == -1) { print "failed to execute: $!\n"; } elsif ($? & 127) { printf "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'; }…

Perl - 日付処理

今日から後ろ10日間、とか、今日から前 10 日間の日付を欲しいときイテレータを使うとラク。 #!/usr/bin/env perl use strict; use warnings; use 5.010; use Time::Piece; use Time::Seconds; my $iterator = date_iterator( base => Time::Piece->new, dur…

Perl - 大きいログファイルを処理する

1ファイル数ギガとかあるログファイルを一行ずつ処理したいとき、いくつか fork して、worker1 は 0MB-500MBを処理、worker2 は 500MB-1000MBを処理, .. みたいにやると意外に簡単にできた。 #!/usr/bin/env perl use strict; use warnings; use utf8; use …

Perl徹底攻略

Perl徹底攻略を読んでる。UNIX プログラミングの勘所とWebアプリケーションのパフォーマンス改善が特にすばらしい。 ところで、UNIX プログラミングの勘所にある、中断可能なコードの書き方のところって sub do_some_work { ... my $len; { # 処理の開始前に…

32bit perl build on CentOS 6.4 64bit

yum install % sudo yum install glibc-devel.i686 libstdc++-devel.i686 Configure % ./Configure -des -Dccflags='-m32' -Dldflags='-m32' -Dlddlflags='-shared -m32' -Dprefix=$HOME/perl32 -Darchname=i686-linux perl-V % $HOME/perl32/bin/perl -V Su…

Perl - *DBM_Fileのインストール

Perl にはコアモジュールとして DB_File, GDBM_File, NDBM_File, ODBM_File, SDBM_Fileがある。 しかし、SDBM_File 以外は適切なライブラリ、ヘッダーがないとインストールされない。 例えば、ubuntu 12.04 にplenvでインストールした perl だと % perl -le …

Process group を kill する

例えば % perl -e 'system "sleep 1000"' | grep a | sort | uniq で % ps axo pid,pgid,command PID PGID COMMAND 26275 26275 -zsh 84326 84326 perl -e system "sleep 1000" 84327 84326 grep a 84328 84326 sort 84329 84326 uniq 84330 84326 sleep 100…

Perl - Exporter の使い方

https://metacpan.org/module/Exporter 今まで、Exporterは package Foo; use base 'Exporter'; our @EXPORT = qw(func); sub func { ... } と使うものと思っていたが、 package Foo; use Exporter 'import'; our @EXPORT = qw(func); sub func { ... } でも…

Perl - ワンライナー

Perl でワンライナーを書くとき、$ とかをシェルに解釈されないようにシングルクオートで囲む方がいい。 % perl -e 'print $ENV{SHELL}' /usr/local/bin/zsh シングルクオート自身を使いたいときは変数に格納して使うと楽。 % perl -e '$quote = "\x27"; pri…

Perl - Minilla を使おうとして

tokuhirom さんの Minilla を使ってみようとして % cpanm -Lext Minilla --> Working on Minilla Fetching http://www.cpan.org/authors/id/S/SL/SLANNING/Mozilla-DOM-0.23.tar.gz ... OK ... Mozilla-DOM の example に Minilla.pm が入ってた。 気を取り…

256 color

"\e[38;5;XXXm" の XXX に 1-255 の数字を書けばその数字に対応する色が出力できる。 英語のwikipediaに詳しく書いてある。 http://en.wikipedia.org/wiki/ANSI_escape_code https://metacpan.org/module/Term::ExtendedColor https://metacpan.org/module/I…

Mac + zsh + vim + plenv or rbenv

Mac + zsh + vim から plenv の perl または rbenv の ruby を呼び出すには https://github.com/sstephenson/rbenv/issues/173 http://blog.glidenote.com/blog/2012/06/26/vim-zshenv-rbenv/ http://d.hatena.ne.jp/speg03/20120624/1340556621 などをみた…

Perl - 子プロセスにSTDINの内容を振り分ける

STDINの内容を子プロセスたちのSTDINへ順番に振り分けるスクリプト。 使いどころの例:ダウンロード並列化 url.txt にダウンロードしたい url を一行ごとに書いておく。例えば http://www.example.com/index.html http://example.co.jp/image.jpg http://www…

Perl - はじめての CGI

正直、CGI が何の事だか分かっていないので実際に動かしてみる。 CGI = HTTP サーバから環境変数とかでリクエストの内容をもらい、標準出力を通じてHTTPサーバにレスポンスを返す仕組み と理解しとこう。 % sudo apt-get install apache2 % sudo chmod 777 /…

Perl - カリー化?

http://d.hatena.ne.jp/kazu-yamamoto/20110906/1315279311 ここに書いてあることを Perl でやってみる。 定義2 カリー化 =「複数の引数を取る関数」を「一引数を取る関数のチェインに直す」こと my $plus = sub { my $x = shift; return sub { my $y = sh…

git instaweb on plack

git 1.7.2 (もしくは 1.7.4.4) から git instaweb で plackup を指定できるらしい。 Various "gitweb" enhancements and clean-ups, including syntax highlighting, "plackup" support for instaweb, .fcgi suffix to run it as FastCGI script, etc. https…