about sitehisaichi5518がPerlを書いて、つついて、イチャイチャするブログ。最近はnode.jsもやってる。

hisaichi5518プロフィール/ twitter管理人twitter/ rss feedRSS feed

今、Maltsを見なおしてる。get ‘/’ => sub {};みたいなの欲しいって言われてたので追加した。

1
2
3
4
5
6
7
8
9
10
use Malts::Web::Router::Simple::Declare;
# いままで
get '/' => 'Root#index';
get '' => {controller => 'Root', action => 'index'};

# 新しく追加
get '/' => sub {
    my ($c) = @_;
    $c->res_200();
};

もちろん、get, post, put, delの全部で使える。

例を書いてたのだけど、Malts::Liteみたいなの作る必要なさそう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use strict;
use warnings;
use parent qw(Malts Malts::Web);
use Malts::Web::Router::Simple::Declare qw(!dispatch);

get '/' => sub {
    shift->res_200;
};

get '/foo' => sub {
    shift->res_200;
};

get '/foo/:user_id' => sub {
    my $c = shift;
    $c->res_200($c->args->{user_id});
};

sub res_200 {
    my ($c, $text) = @_;
    $c->create_response(200, [], $text || 'ok');
}

sub dispatch {
    Malts::Web::Router::Simple::Declare->dispatch(@_)
        or $_[0]->create_response(404, [], ['404 Not Found!']);
}

__PACKAGE__->to_app;

実際に利用するかどうかは置いといて、こういう事も出来るようにはなった。
Controllerにルーティング書いてみる。Catalystを分かりやすくした感じ。
さっきのに比べるとごちゃごちゃしてるように見える。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use strict;
use warnings;

package MyApp::Web;
use parent qw(Malts Malts::Web);

sub res_200 {
    my ($c, $text) = @_;
    $c->create_response(200, [], $text || 'ok');
}

sub dispatch {
    MyApp::Web::Dispatcher->dispatch(@_)
        or $_[0]->create_response(404, [], ['404 Not Found!']);
}

package MyApp::Web::Dispatcher;
use Malts::Web::Router::Simple::Declare;
# ファイルを分割した時のため
# use Module::Find qw(useall);
# useall 'MyApp::Web::Controller';

package MyApp::Web::Controller::Root;
use Malts::Web::Router::Simple::Declare;

get '/' => sub {
    shift->res_200;
};

package MyApp::Web::Controller::Foo;
use Malts::Web::Router::Simple::Declare;

get '/foo' => sub {
    shift->res_200;
};

get '/foo/:user_id' => sub {
    my $c = shift;
    $c->res_200($c->args->{user_id});
};

package main;
MyApp::Web->to_app;

Malts::Web::Router::Simple::Declareって書くのだるいし、Malts::Web::Router::Simpleに変更するかも。

2012年1月27日 金曜日 perl (No comments) Tags:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env plackup
use strict;
use warnings;
use utf8;
use parent 'Malts::Lite';

get '/' => sub {
    my $self = shift;
    $self->res_200('index.tx');
};

# 上書き
sub res_404 {
    $self->render(404, '404.tx');
}

__PACKAGE__->start;
__DATA__

@@ index.tx

<!doctype html>
<html>
<head>
    <meta charset="utf-8" />
    <title>hello malts</title>
</head>
<body>
: block body -> {
    hello malts lite!
: }
</body>
</html>

@@ 404.tx
: cascade 'index.tx'
: override body -> {
    404!
: }

考えたけど作ってない。

2012年1月22日 日曜日 perl (No comments)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use strict;
use warnings;

package Controller;

# $c->model();を使うアレ。今こんな感じ。
# $c->model();使うの微妙かなと思えてきた。わからん

my $user = $c->model('User');
my $user_info = $user->get_user_info(user_id => 1);

package Controller;

# 複数ゲットが無理っぽ
# newでDBにアクセスして取ってくる的な?newよりfindが自然か。DBIx::Classでいいよねって話になりそう。
# ボツ

use Tumfav::Model::User;
use Tumfav::Model::Quest;

my $user = Tumfav::Model::User->new(user_id => 1);
my $user_info = $user->get_user_info;

package Controller;

# Rowを拡張しまくる
# Controllerの中でDBにアクセスしてる。
# $cにdbメソッド生やしたくない。Controllerでcreateとかをさせないため。
# 簡単に出来てしまうとやってしまうよねと思うので、出来ないようにする。こういうの大事な気がする。
# Controllerでdbを触らせないって無理があるかなあ。
# 一応ボツ

use Tumfav::Model::User;
use Tumfav::Model::Quest;

my $db = $c->db;
my $user = $db->single('users' => {id => 1});
my $user_info = $user->to_hash_ref;

package Controller;

# Modelを拡張する
# $c->model();なし。

use Tumfav::Model::User;
use Tumfav::Model::Quest;

my $user = Tumfav::Model::User->new();
my $user_info = $user->get_user_info(user_id => 1);

package Controller;

# 別にblessする必要ないなあって思えてきた。

use Tumfav::Model::User;
use Tumfav::Model::Quest;

my $user_info = Tumfav::Model::User->find(user_id => 1);
my $user_info = Tumfav::Model::User->create('user name' => {});

わからない。

2012年1月20日 金曜日 perl (No comments)


1月

ブログのデザインを今のにした。
去年から引き続き、どれだけPV集めてどれだけ稼ぐかをずっと考えてた。

2月

自分のサイトが2ヶ月で一ヶ月100万ヒット(通算150万ヒットくらい?)突破
目標達成して色々と考えるのやめた。

3月

地震
ちょっと精神的に参ってたように思う。

4月

内定もらった。

5月

フレームワークのSlug書いてた。

6月

内定先で働きだした。
dankogaiに添削された。

7月

node.js触ってた。

8月

鎌倉に行った。
Slugを捨てて、8月後半からMaltsを書き始める。
また頭が全く働かないので、これはやばいと思って色々考え始めた。

9月

設計について考えるようになった。

10月

設計について考えながら、開発の流れも考えるようになった。

11月

9月、10月考えてた事はそのまま考えつつ、テストについても考えるようになった
分かりやすいってなんだろーって考えるようにもなった。

12月(イマココ)

設計とかテストとかは落ち着いて、今はソーシャルゲームについて考えるようになってる。
コードの分かりやすさは未だに悩んでるけど、ようやく最近考えるのにまた慣れてきたなと思うようになった。

まとめ

ほんと1年って色々あるなあ。
こういうの思い出すためにもブログって便利。みんなも書こう。

2011年12月30日 金曜日 雑記 (No comments)


読みにくそうな例

1
2
3
4
5
6
7
8
9
10
11
12
use strict;
use warnings;

# 連発
my $hoge = 1;
chinko() if $hoge == 1;
unko() if $hoge == 2;

# 一行に収まってない
do {
    ...;
} if $hoge;

読みやすそうな例

1
2
3
4
5
6
use strict;
use warnings;

my $hoge = 1;
my $fuga = 1;
return $hoge if not defined $fuga;

returnあると読みやすそうだと思った。
return — if not defined —;は結構すきです。

結論

結局は好みだけど、使い方ミスったら読みにくいと俺は思う。

蛇足

あと一行に収まってない時は後ろに置かないようにした方が見やすいんじゃないかなーと思った。orとかandとかも。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use warnings;

# ぎゅっと詰まってて読みにくそう。
my $chinko = $hisa->chinko(
    name => 'hisaichi5518 no musuko',
    size => 'small',
) or die 'no chinchin!';

# 読みやすそう。
my $chinko = $hisa->chinko(
    name => 'hisaichi5518 no musuko',
    size => 'small',
);
if (!$chinko) {
    die "no chinchin!";
}

と思ったけど、案外普通ですね。

2011年12月28日 水曜日 perl, 雑記 (No comments)


結構勢いで書いてるので、順番とかは気にしない。

テストを書く

コードを書くなら、テストも書く。
コードを変更するならテストも書く。
テストが書きにくいコードならテストを書かないのではなく、コードを変える。
“テストがない=信用出来ない=怖くてコミット出来ない”くらいのチキンハートになる。

Perlのテストについて知りたかったら、今年のadvent calendarに大体書いてる。
あとはぐぐる。

参考URL: Perl Advent Calendar Japan 2011 Test Trac

コミットメッセージは次の日読んでも分かるくらいに書く。

新卒が書いたコードは、大体先輩のレビューを受ける。忙しい先輩には分かりやすいものを渡した方が良いに決まってる。
コミットログを見て、これはこうしたいっていうのを分かりやすく伝えた方がいい。
忙しい先輩への思いやり、プライスレス。
また以下のような事も出来るのでコミットログ綺麗に書くの本当にオススメ

参考URL: 業務終了後、git logとDist::Makerでさっさと帰る話。 – Perl Advent Calendar Japan 2011 Casual Track

コードを書くときは思いやりを持つ。

なるべくシンプルに分かりやすいコードを書く。難しい事はしない。
まだ存在していない後輩のための思いやりもプライスレス。

行の後ろに無駄な空白とか入れない・タブ文字と空白を混ぜない。

チーム開発なので、なるべく綺麗にする。
エディタの設定で一番後ろに$とか付けるとか色々ある。

エラーが出たら、ちゃんと読む

エラー読めば大体分かる。

わからなかったらぐぐる。それでもわからないなら先輩に聞く。

まずはエラーの内容でぐぐってみる。Googleで大体の事は分かる。それでも分からない事は先輩に聞く。
先輩はすごい人ばかりなので、一瞬でわかりやすく教えてくれて、しょうもない事で自分で調べて数時間が無駄になったとかにはならない。
なので、ぐぐってわからないなら先輩に聞いた方が良い。

なんかおかしかったらまず自分のコードを見る。

コード書いてておかしいな!と思ったら、まず自分を疑う。
大体それで解決する。

なるべくコードは書かない

勉強するには書いた方がいいと思うのだけど、業務の話!
例えば、order byだけが違うだけでメソッドを作ったりはしない。
コードを書くことはそれなりのコストがかかるのだと考える。

勉強したければ他人のコード読むのも良い。というか読んだ方が良い。

なるべく書いたコードは公開する

公開出来るようなコードは公開する。誰かからツッコミもらえたら勉強にもなる。

なるべく待たせない

待つのって結構ストレスだし、先輩や同期も他に仕事があるのでなるべく待たせない。
いつも待たせてスミマセン!

何事も挑戦だ!

とりあえずやってみる。

スイッチを切らない

スイッチが切れたら、なんか話を聞いても頭に入ってこなくなるので、スイッチを切らないようにする。
ほんとやばい。

めんどくさくてもやらなきゃいけない事はたくさんある。

めんどくさくてもやらなきゃいけない事はたくさんあるので、諦めてサクっとやる。
めんどくさいめんどくさい言ってるだけでは何も始まらないし、終わらない。
本当にめんどくさいなら、楽になるように変更する。

例: “業務終了後、git logとDist::Makerでさっさと帰る話”

まとめ

色々出来てないので更に気を付けたい。

2011年12月26日 月曜日 雑記 (No comments)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package t::Util;
use strict;
use warnings;
use lib qw(
    ./local/perl5
);
use Plack::Test qw(test_psgi);
use Plack::Util ();
use File::Spec ();
use Exporter 'import';
our @EXPORT = qw/apptest/;

my $psgi_file = File::Spec->catfile('script', 'app.psgi');
my $app = Plack::Util::load_psgi($psgi_file);
sub apptest {
    my ($req, $test_code) = @_;
   
    test_psgi $app, sub {
        my $cb = shift;
        my $res = $cb->($req);
        $test_code->($res);
    };
}

1;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!perl -w
use strict;
use Test::More;
use t::Util;
use HTTP::Request::Common;

subtest 'GET /' => sub {
    my $req = GET '/';

    apptest $req, sub {
        my $res = shift;
        is $res->code, 200;
    };
};

done_testing;

Authorization加えたいとかopensocial_viewer_id加えたいとかはt::Util#apptest変えればオッケーすね。

2011年12月23日 金曜日 perl (No comments) Tags:


ガラケーで見たら、アクセス拒否されて悲しかったので修正しようと思って色々見てる。
さくらVPSに移動しようかなあと思うけど、流石に235,872 個のファイルを移動するのめんどい。てかファイル数やべえ。

昔のコードも読んでる。Maltsを作る前に作ってたSlugというフレームワークを使って作ってるのでそこまで読みにくくない。
もちろん無駄だなーって思うところやだめなところもあるのだけど、ぱっと見てすぐにコード変更出来るくらいにはわかりやすかった。一気にSlugを使ったコードに書きなおしたあの頃の俺を褒めたい。あとMoe::Hogeみたいに全サイトで使える部分を共通で作ってて良かったと思った。

あと今、作りたいのがあるので作りたい。これをやるならさくらVPS借りて公開すると思う。サーバの事とかよくわかんないんだけど、それも勉強しときたい…。

2011年12月16日 金曜日 雑記 (No comments)


去年に引き続き、Perl advent calendarに参加しました。
カジュアルという事で明日から使えるようなネタをと思って業務に関するネタを書いたんですが、次の日は土曜でした。うける。
業務終了後、git logとDist::Makerでさっさと帰る話。 – Perl Advent Calendar Japan 2011 Casual Track

2011年12月11日 日曜日 雑記 (No comments)


hisaichi5518のはてなブログ
タイトルとか結構ころころ変わったりすると思う。記事も書いたやつ引っ込めたりするし、適当な事書きまくります。
もしかしたらはてブロの方で書いてからパルカワに移動する記事もあるかも。

2011年12月9日 金曜日 雑記 (No comments)