GrowthForecast のバックエンドに PostgreSQL を使う
デフォルトで SQLite が利用できるし、たぶん得する人はいないと思うけれど、いろいろな理由で PostgreSQL しか選択肢がなかったので、PostgreSQL でも動くようにちょっと手を加えてみました。
といっても、CREATE TABLE しているところを PostgreSQL に対応するよう、適当に書き換えただけだけど。
差分は、こんな感じ。
https://github.com/hatyuki/GrowthForecast/compare/kazeburo:master...master
とりあえずこれで、以下のように起動すれば
$ carton exec -- perl ./growthforecast --with-pgsql='dbi:Pg:database=gf'
こんな (↓) 感じでグラフが取れているので OK ということにしよう。
2段階認証を実装したい
ちょっとした理由から Google などで使われている 2段階認証を実装してみることに。
Google の 2段階認証の場合はワンタイムパスワードを生成に、以下のスマホアプリを利用することができますので、今回はこのアプリに相乗りする形での実装を目指しました。
Google 認証システム - Google Play の Android アプリ
相乗りとは言っても仕様は広く一般的に使われているため、同様のアルゴリズムで実装されたアプリであれば、他のアプリでもワンタイムパスワードを発行・認証することができます。
続きを読むPerl の定数畳み込み
当然だけれど、定数の畳み込みが発生するのは constant モジュールを利用して宣言した場合のみですね。
64bit unsigned int を pack したい
ただし 32bit 環境で。
続きを読むGitHub の Markdown Rendering API を Perl で手軽に利用したい
と思ったので、昔つくった Text::Markdown::GFM::Lite というのをちょっと手直ししてみると同時に Minilla を使ってみました。
- Text-Markdown-GFM-Lite
- https://github.com/hatyuki/p5-Text-Markdown-GFM-Lite
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ちゃちゃっと作ってみた。
なんか、四角い画像がヘー●ルハウスを連想させるということで、こんな名前になりました。TOP ページとか用意していなかったんだけど、とりあえず placehold.it をパクってでっちあげてみました。
これで、他のサービスのように以下のようにアクセスすれば指定したサイズの画像を取得できるようになりました。
<img src="http://hebel.magicalhat.jp/100x100">
placehold.it や placehold.jp のように、色を変えたりテキストを変更したりといったことはできないけれど、今のところの用途だと充分かなぁといった感じ。
オマケ程度だけれど Redis で生成した画像をキャッシュしているので、社内からのアクセス程度なら心配するほどでもないかなーといった感じです。
*1:Amon2 使うほどでもなかったけれど