Mojoはじめました#3 [モデル作成]

MojoでTodoアプリ作るということでそろそろ本題に入りますね〜
このテーマではMojoliciousでTodoって名前のアプリを作ります。
まずはアプリ生成
>mojolicious generate app Todo
>cd todo

なんか色々と自動で生成されますの
とりあえず動作させる
>perl script/todo daemon –reload
後ろに–reloadつけるのはファイルを更新した時とかに勝手に読み直してくれるっぽいので
ただ、エラー出た時とか再起動しないと動作がおかしい時があったので気休め程度に
ブラウザでhttp://localhost:3000/で確認でとりあえずおk
前もちょと書いたけど仕様
・期日と内容を登録する
・状態は「まだ」「やってる」「おわった」の3段階
・完了日も登録
・データはDBに保存する(MySQL)
まずはモデルを作成
・モデル名はEntry
・構造はこんなの

CREATE TABLE `entries` (
`id` int(11) NOT NULL auto_increment,
`todo` text collate utf8_unicode_ci NOT NULL COMMENT ‘todo’,
`due_date` date default NULL COMMENT ‘期日’,
`finished` date default NULL COMMENT ‘完了日’,
`state` tinyint(4) NOT NULL COMMENT ’0:まだ, 1:やってる, 2:おわった’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

んでこのページを参考に実装〜
Mojoを使って自作ウェブアプリをよりポータブルに!:第3回 サンプルフレームワーク:Mojolicious
Mojoliciousの流儀かはわかんないのですが、どうやらクラスとかの定義はlib/Todo/以下に置くっぽいので
>vim lib/Todo/Entry.pm

package Todo::Entry;
use strict;
use warnings;
use DBI;
use base 'Mojo::Base';
my $database = "todo_mojo";
my $con = "DBI:mysql:$database";
my $db_user = 'root';
my $db_pass = 'root';
sub read {
my ($self, $id) = @_;
my %entry = (id => 0, todo => "", state => 0, due_date => "", finished => "");
#idが渡ってきたらDBから読み取りに行く
if (defined($id) || $id != 0) {
my $db = DBI->connect($con, $db_user, $db_pass);
my $sth = $db->do("set names utf8");
my $sql = "select * from entries where id = '$id'";
$sth = $db->prepare($sql);
$sth->execute() || die($db->errstr);
if ($sth->rows() > 0) {
my $dat = $sth->fetchrow_hashref();
%entry = %{$dat};
}
$sth->finish();
$db->disconnect();
}
return %entry;
}
sub save {
my ($self, %entry) = @_;
my $sql;
my $new_id = $entry{id};
my $db = DBI->connect($con, $db_user, $db_pass);
my $sth = $db->do('set names utf8');
if ($entry{id} == 0) {
#idが0の場合は新規登録なのでinsert
$sql = sprintf('insert into entries(todo, state, due_date, finished) values ("%s", %d, "%s", "%s")',
$entry{todo}, $entry{state},
$entry{due_date}, $entry{finished});
$sth = $db->do($sql);
$new_id = $db->last_insert_id($database, $database, $db_user, $db_pass);
} else {
#idが入っている場合は更新なのでupdate
$sql = sprintf('update entries set todo = "%s", state = "%d", due_date = "%s", finished = "%s" where id = "%d"',
$entry{todo}, $entry{state},
$entry{due_date}, $entry{finished}, $entry{id});
$sth = $db->do($sql);
}
$db->disconnect();
return $new_id;
}
1;

とりあえずDBから読み込んでハッシュにして返すのと、ハッシュを受け取って保存する処理。
読み込みはidを受け取ってそのidのレコードを読み込んで返す。もしidが渡ってこなかったり0が来たら空っぽのを作って返す。
保存はidに値が入ってたらupdateする。0の場合はinsertする。んで保存したレコードのidを返す感じで。
実際に新規登録した時とかidが欲しい場合が多いのでこうした。
あんまりフレームワーク関係ないけど、perl慣れてないからここまで作るのに時間かかった><
ホントはORマッパー風の汎用的なコード書きたかったけど挫けたw
何か変な書き方とかおかしなところとかツッコミお願いします〜
馴染みが無かったけどやってみて馴染んだコト
・ハッシュの扱い
 %hoge{key}じゃなくて$hoge{key}とか
 %hoge = {key1 => $val1, key2 => $val2};じゃなくて%hoge = (key1 => $val1, key2 => $val2);とか
 ただ、$hoge->{key}とか%{$hoge}とかたぶんまだちゃんと理解できてないと思う。。
・サブルーチンのパラメータは参照で来るから注意
・hoge->foo() みたいな呼び出しの場合、第一引数にパッケージ名(≒クラス名?)が渡ってくる
・コンストラクタは一般的にnewって名前で作る
 →Mojoの場合、Mojo::Base(か更に上か)で定義されてんだよね?
・最後に1;って書く。
 →調べたら理由は理解はできたけどあまりカッコヨクナイネ。。。
まだよく馴染んでない、てかわかってないコト
・perlのオブジェクト指向ではクラス≒パッケージ?
・クラスのメンバ変数ってどんな風に扱うのがよい?
 →サンプルで__PACKAGE__->attr(hoge => ‘ほげ’);とかやってるのはperlの流儀?mojoの流儀?
とりあえず次はコントローラー作る

すぐわかる オブジェクト指向 Perl
深沢 千尋
技術評論社
売り上げランキング: 65539
おすすめ度の平均: 5.0

5 すばらしいです
5 しつこいくらいに丁寧に解説
5 分かりやすい語り口
5 WEBの海での救命道具のような本
5 マスターコースを読む前に

Filed under: Mojo — maesan 4:00 PM  Comments (1)

Mojoはじめました#2 [MySQLの環境構築]

MojoでTodoアプリを作ることにしたのは良いのですが、やっぱりDBと繋ぎたいのでまずその環境を作ります。
どうやらPerlでMySQLを繋ぐにはDBIってのを入れないといけないらしい。
んでCPANからインストール
>sudo cpan
>install DBI

特に問題なく終了したけど
Warning (usually harmless): ‘YAML’ not installed, will not store persistent state
って出たのでついでに
>install YAML
もしておいた(何に使うかは調べてないw)
その後簡単なDB接続用のスクリプトを実行した
こんなの

#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $con = 'DBI:mysql:データベース名';
my $u = 'root';
my $p = 'root';
my $db = DBI->connect($con, $u, $p);
my $sth = $db->prepare("select * from テーブル名");
$sth->execute;
my $rows = $sth->rows;
print "$rows件¥n";
$sth->finish;
$db->disconnect;

そしたらエラーがでまして
Perhaps the DBD::mysql perl module hasn’t been fully installed,
or perhaps the capitalisation of ‘mysql’ isn’t right.
な感じのメッセージが出たのでDBD::mysqlってやつを入れてみる
>sudo cpan
>install DBD::mysql

なんかうまくいかない。
調べるととてもステキなページを発見「CPAN経由でLinuxにモジュールを組み込む」
ココを参考に以下を実行(ちなみにmysqlはMacPortで入れてる)
>sudo ln -s /opt/local/lib/mysql5/bin/mysql_config /usr/local/bin/mysql_config
まだ上手くいかないので
>sudo /opt/local/lib/mysql5/bin/mysql_config –libs
>sudo /opt/local/lib/mysql5/bin/mysql_config –cflags

で吐かれたデータを元に
>sudo perl Makefile.PL “–cflags=-I/opt/local/include/mysql5/mysql -arch x86_64 -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT” “–libs=-L/opt/local/lib -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm -L/opt/local/lib -lssl -lcrypto”
ってやったらいけたっぽい
>sudo make
>sudo make test

でココでまた失敗。。。
というかroot@localhostのパスワードを設定していたのでDBにつなげないっぽいので一旦DBのパスワードを無しに変更
>sudo make test
で更にまた失敗w
何かtestってDBに接続にいこうとしているのでそんなDBないからダメっぽい。
とりあえずtestってDB作って再度実行
>sudo make test
おk
>sudo make install
終了〜
さっき作ったDB接続テスト用のスクリプト動かしたら動いた!
とりあえず今回はここまで

入門Perl DBI
入門Perl DBI
posted with amazlet at 10.04.29
アリゲータ デカルト ティム バンス オライリー・ジャパン 売り上げランキング: 247478
おすすめ度の平均: 3.5

3 専門書ですから、そこは理解しなければいけないところです。4 DBIを更に強力に4 程良い解説でした。

DBIだけで本が出るくらい奥が深いのですね…

Filed under: Mojo — maesan 10:17 PM

Mojoはじめました#1 [Perl入門]

Mojoのサンプルとか色々見てたんだけど、根本的にPerlの文法が身についていないのでソースの理解度が深まらないのでPerl入門ということで勉強した。
このページが最高にわかりやすくてステキでした!
Perl基礎文法最速マスター
今までC/C++, Java, C#, PHP, JavaScript, ActionScriptとかやって普通に使えるようになってるんだけど、Perlは何かイマイチ苦手意識というか、他人のコード読んでも途中でイヤになってたのねw
で、今回ちょっと気づいたんだけど、たぶん自分の中で一番とっつきにくいところは関数(サブルーチン)の呼び出しに()を付けない書き方がすんなり受け入れられないのではないかと思った。
例えば参考にしたページにのってたやつだけど
my $join2 = join ‘,’, ‘aaa’, ‘bbb’, ‘ccc’;
これはカッコ無しで書いてる
my $substr = substr(‘abcd’, 0, 2); # ab
これはカッコ有りで書いてる
試しにこんな風に書いてみると動いた
my $join2 = join(‘,’, ‘aaa’, ‘bbb’, ‘ccc’);
my $substr = substr ‘abcd’, 0, 2;
何でこんな風に混在するのかねぇ?
カッコ付いてないと文字の羅列に見えてスゴく直感的に分りづらいんですよ。
カッコ付きとカッコ無しで挙動が変わるとかあるのかな?って勘ぐっちゃう。
(実際変わるのでしょうか?)
個人的には3項演算子とかもキライだし、if文に{}が付いてないと殺意を覚えるタイプなので関数呼び出しには()を付けたいと思います。
関数に()を付けない深い理由などありましたらツッコミお願いします><

とりあえずこの本今から買ってくる

Filed under: Mojo — maesan 1:18 PM  Comments (2)

Mojoはじめました#0 [とりあえず環境準備]

ここ3年ほどweb系はPHPばっか使ってたので、ちょっと気分転換にperlでつくってみようかと思いたちました。
んで、そんなにperlやりこんでないというか、10年近く前にwebアプリとかwebサービスとか言う呼称もなく、cgiとしか呼ばれてなかったときに書いてた程度のレベルなので、最近はやりのモダンプログラミングというやつをマスターするためにフレームワーク使って勉強することにしました。
いまさらperl()笑、とかPHPをdisりまくるperl使いが痛いなぁとか思わなくもないですが、虎穴に入らずんば虎子を得ずということでやってみます。
フレームワークとしてはCatalystがメジャーなんだろうけど、依存モジュールとかが多くてレンタルサーバーとかで使うのめんどくさそうなので(そんな理由でPHPでフレームワーク使う時はcakePHPを使ってるし、RoRはローカルでちょっと遊ぶくらいしか使ってない)Mojoってやつにしました。
http://github.com/kraih/mojo/tree/masterから最新版ダウンロードして、http://gihyo.jp/dev/feature/01/mojo/0001を参考にHello Worldしてみた。
思った通り簡単に動いたので試しにtodoアプリを作ってみることにする。
・やらないといけないことと予定日を登録
・ステータスは「やってない」「やってる」「やり終えた」を登録する
・実完了日を登録する
みたいな簡単なやつ
とりあえずperl使うならvimやろってコトでvimもついでに勉強する。
正直サーバーの設定とかでviを使うくらいしかやったコトない。
Macで標準についてるvim(か自分でいつの間にか入れたか覚えてない)でコードを編集しようと思ったらシンタックスカラーリングされてなかったので(svn用に立ち上げてるlinuxだとカラーリングされてる)調べた。
どうやら~/.vimrc を作って syntax on って書けばイイらしい。簡単にできた。
(linuxには~/.vimrc 無かったのにカラーリングされてたけど気にしないことにするw)
とりあえず今日はここまで〜

初めてのPerl 第5版
初めてのPerl 第5版
posted with amazlet at 10.04.24
Randal L. Schwartz Tom Phoenix brian d foy オライリージャパン 売り上げランキング: 7306

たぶんこんなの読んだほうがイイんだろうねぇ…

Filed under: Mojo — maesan 11:52 PM
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)
 iTunes Store(Japan)