PerlとRubyがくしゅう帳

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_です。 最近は主にPerl関連の勉強会やコミュニティに参加しています。

2012年12月

Yusukebeさん著の「webサービスの作りかた」を読み始めて、「とりあえず手を動かす」は、重要だなぁと再認識したので、何かを作って見ることにしました。

年末年始の休暇の時間を使って、Perl入学式で学んだこと、ネットの情報、CPANモジュールガイドを駆使して自作プログラムを書ければいいなぁ...と。

とりあえず、最終目標は、基準日から3日毎に、メールでリマインダを送るプログラム。
今使ってるTodoのサービスは、毎日、毎週、毎月の様な繰り返しタスクは自動で設定できるのだけれど、3日毎にTodoを自動予約するパターンが出来ないので、自分で自分のiPhoneにリマインダメールを送るプログラムを書いてみる事に決定。

メールを送る部分はCPANモジュールで何とかなりそうな予感。常時動かしておくサーバーはどうしようか、、、3日毎の定時(決められた時間に)に発動するような事ができるのだろうか???

思いついた部分だけまずはコードにしてみました。

・スタートの基準日をコマンドライン引数にして渡す。
・引数の日と現在日付を比較して、 3の倍数なら、当たりの日(メールを送信する)

日付の比較は、Excelの様に日付をシリアル値に変換して引き算すれば良いかなぁと考えてみたけれど、どうやらPerlの日付は秒数?でカウントされているらしい。日付のシリアル値は無いみたい。

と言うことは、日付からシリアル値を生成する関数を自分で書くしか無いので、とりあえず書いてみました。うるう年の判定ですね。

sub date_tosirial{
    my ( $year,$month,$day) = @_;
    my $ans = 0;
    if( $year < 1900){
        die;
    }elsif( $year == 1900){

    }elsif( $year <= 2000){
        $ans += int(($year-1900)/4)+1+($year-1900)*365;
    }else{
        $ans += int(($year-1900)/4)+1+($year-1900)*365+1;
    };
    my @month_sirial;
    if(($year % 4 == 0)^(($year % 100 != 0)||($year % 400 == 0))){
        @month_sirial = (0,31,29,31,30,31,30,31,31,30,31,30);
    }else{
        @month_sirial = (0,31,28,31,30,31,30,31,31,30,31,30);
    };
    my $item = $month - 1;
    do{
        $ans += $month_sirial[$item];
        $item -= 1;
    }while($item >= 0);
    $ans += $day;
    return $ans;
}; 

 とりあえずは動いているようなので、次はこのサブルーチンのテストを書く事にもチャレンジしてみようと思います。
しかし、正しい答えを計算するExcelが家には無い・・・表計算ソフトが無い・・・
OpenOfficeかGoogleDocsでも計算できるのかなぁ?

入力フォームでデータを入力し、そのデータを流用してページを表示するケース

  • $self->param()メソッドを使う。
  • 入力フォームでは、<form action="/ページ名" method="post"> ~テキストボックス、ボタンなど~ </form>を使う。
  • /ページ名は、でーたの送り先、メソッド=postは、webサーバにpostでデータを投げる。
<input type = "submit,text,radioなど。部品を指定" name = 'パラメータ変数名' />

/ページ名 のpostで送られた(受けた)側の処理は・・・

post '/ページ名' =>  sub {
my $self = shift;
my $name = $self->param('パラメータ変数名');
$self->stash($name=>'namaefield');
$self->render();
}=>'page'
でpageテンプレートにデータを投げる。

_
_DATA__
@
@page.html.ep
 <html>
<head></head>
<body>
<%= $namaefield %>
</body>
 </html>

----------------------------------------------------------------------------------------

stashで投げるデータが複数ある場合(テーブル等でまとめる場合)は、ハッシュや配列のリファレンスを使い、まとめて投げることもできる。

$self->stash(matomari=>{a=>1,b=>2,c=>3}); 

テンプレ側は、<%= $matomari->{a} %>でハッシュからデータを展開する。

 ----------------------------------------------------------------------------------------

テンプレ内にperlのコードを埋め込む場合・・・
% を行頭に書くと、その行はperlのコードとして実行される。html内に動的な処理を書くことができる。 

  ----------------------------------------------------------------------------------------

レイアウト
・・・共通的なhtml記述は、共通テンプレ+各個別bodyに分けて記述できる。body部分を各々テンプレを作り、そこで 共通テンプレを呼び出せば、共通部品を組み込むことができる。

@@ layout/common.html.ep 
<html>
<head><title><%= title %></title></head>
<%= content %>・・・ここに各個別のbodyが埋め込まれる。
</html>

@@ hello.html.ep
% layout 'common',title=>'ページタイトル';・・・layout関数を使う。各ページタイトルはtitle変数で渡せる。

このページのトップヘ