はちゅにっき

こっちのブログはまったり更新

Perl でプロセスの待ち合わせをする

たとえば以下のようなプログラムを Perl で書いて

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/ say /;
use Parallel::ForkManager;
use Time::HiRes ( );
 
my $process = 10;
my $pm = Parallel::ForkManager->new($process);
 
for (1..$process) {
    if ($pm->start) {
        Time::HiRes::sleep(0.2);  # fork に時間がかかることを想定
        next;
    }

    # 子プロセスの処理開始時刻を表示
    say "[$$] ", Time::HiRes::time( );
 
    $pm->finish;
}
 
$pm->wait_all_children;

これを実行してみると

[3107] 1381815422.89502
[3108] 1381815423.09763
[3109] 1381815423.30142
[3110] 1381815423.50445
[3111] 1381815423.70717
[3112] 1381815423.91102
[3113] 1381815424.1142
[3114] 1381815424.31746
[3115] 1381815424.52011
[3116] 1381815424.72334

当然、親プロセスが 0.2 秒休んでいるため、子プロセスの処理開始時刻は約0.2秒間隔のバラバラに。
今回は sleep しているので当然ですが、fork って結構時間がかかる処理なので特別 sleep を入れなくても、子プロセスの処理開始時刻はバラバラになりがち。
普通はこれでも全然かまわないんですが、fork が完了するのを待って子プロセスを一斉に開始させたい!とか、fork 完了後に親プロセスが何らかの処理を行ない、その後一斉に子プロセスを開始させたい!とか、特定の条件が揃うまで子プロセスの実行を停止させておきたい!なんてときには、プロセスの "待ち合わせ" が必要になります。
滅多にそんなことは発生しないんだろうけれど、なんか今回はそういう要件があってだな。。。
というわけで、今回は手っ取り早くセマフォを使ってプロセスの待ち合わせをしてみることに。

続きを読む

placehold.it みたいなやつを作った

Web サイトのレイアウトを考えるときに、placehold.it や placehold.jp とかを使うと

<img src="http://placehold.it/150x150">

こうやって HTML を書くだけで、手軽に指定したサイズの画像が手に入ってすごく便利。
だけど、頻繁にアクセスが必要な場合や、社内のネットワークから出れない、出たくない場合を考えると、社内に似たようなサービスがあったら便利だよね。
そんなやりとりがあったので、Amon2 を使って*1ちゃちゃっと作ってみた。

Hebel
http://hebel.magicalhat.jp/
github
http://github.com/hatyuki/hebel

なんか、四角い画像がヘー●ルハウスを連想させるということで、こんな名前になりました。TOP ページとか用意していなかったんだけど、とりあえず placehold.it をパクってでっちあげてみました。
これで、他のサービスのように以下のようにアクセスすれば指定したサイズの画像を取得できるようになりました。

<img src="http://hebel.magicalhat.jp/100x100">

placehold.it や placehold.jp のように、色を変えたりテキストを変更したりといったことはできないけれど、今のところの用途だと充分かなぁといった感じ。
オマケ程度だけれど Redis で生成した画像をキャッシュしているので、社内からのアクセス程度なら心配するほどでもないかなーといった感じです。

*1:Amon2 使うほどでもなかったけれど

Plack で PHP アプリの開発をしたら何故か捗った話し

普段のお仕事では相変わらず PHP な hatyuki です。

普段お仕事では Windows PC に VirtualBox をインストールし、その中の Debian 上で開発しています。
Perl / PSGI で開発するときは plackup がありますが、PHP (<= 5.3) で開発する場合は、開発環境にも Web サーバが必要なため、普段は Apache などをインストールしていましたが、若者の Apache 離れが深刻な昨今は、Plack::App::PHPCGI というミドルウェアを使って開発を行なっています。

続きを読む

Perl と JavaScript 間で RSA 暗号を使いたい

サンプルが見つからないってことは、普通はやらないことをやろうとしているんだと思う。
ということで、以下のようなことをしてみたかったので、試してみました。

  1. Client (JavaScript) 側で RSA 鍵 (秘密鍵・公開鍵) を生成
  2. 公開鍵を Server (Perl) に POST
  3. Server (Perl) 側は受け取った公開鍵を用いて暗号化し送信
  4. Client (JavaScript) は受け取った暗号文を 1 で生成した秘密鍵で復号

とりあえずサンプルで作ったものは

  1. RSA 鍵を生成 (Client)
  2. 公開鍵を POST (Client)
  3. UUID を生成 (Server)
  4. POST された公開鍵を使い暗号化 (Server)
  5. 受信した暗号文を秘密鍵で復号 (Client)

という動作をします。
できたもの、ソースコードはこちら。

JP RSA
http://jprsa.magicalhat.jp/
hatyuki/p5-jprsa
https://github.com/hatyuki/p5-jprsa

以下雑文

続きを読む

Chef-Solo できる Debian AMI をつくる

作業ログだけぺたり。たいしたことはやらず。
元の Debian の AMI は MarketPlace からもってきました。
AMI は Stable のものしかないんだけれど、事前に apt の設定を変えて Testing に dist-upgrade 済の AMI を作成して利用しました。
TimeZone や Locales の設定は気分的な問題。

$ sudo aptitude update
$ sudo aptitude safe-upgrade
$ sudo dpkg-reconfigure tzdata
$ sudo dpkg-reconfigure locales  # => None を選択
$ sudo aptitude install ruby ruby-dev make
$ sudo gem install chef --no-ri --no-rdoc
$ sudo aptitude clean