はちゅにっき

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

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 ということにしよう。

f:id:magicalhat:20140313151500p:plain

2段階認証を実装したい

ちょっとした理由から Google などで使われている 2段階認証を実装してみることに。
Google の 2段階認証の場合はワンタイムパスワードを生成に、以下のスマホアプリを利用することができますので、今回はこのアプリに相乗りする形での実装を目指しました。

Android

Google 認証システム - Google Play の Android アプリ

iPhone
Google Authenticator

Google Authenticator

  • Google, Inc.
  • ユーティリティ
  • 無料

相乗りとは言っても仕様は広く一般的に使われているため、同様のアルゴリズムで実装されたアプリであれば、他のアプリでもワンタイムパスワードを発行・認証することができます。

続きを読む

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ちゃちゃっと作ってみた。

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 使うほどでもなかったけれど