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

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

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)


ガラケーで見たら、アクセス拒否されて悲しかったので修正しようと思って色々見てる。
さくら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)


ER図とかよくわかんないって言ったら、”図書かないのはぼっちだからなのでは”って言われて悔しいのでとりあえず作ってみた。
mysql-workbench入れたら固まったので諦めてSequel Proを使った。

1
$ brew install graphviz

して、File > Export > DotでOK。
出来たファイルをSVGに変換する。

1
$ dot -Tsvg your_database.dot > your_database.svg

PNGに変換とかは、ImageMagickとか使えばいいよって書いてる。めんどいからそこまでしてない。
ERD diagrams from Sequel Pro
これで作られたやつ見たけど、普通にSequel ProのTable Infoとか見たらいいかなと思った。

2011年11月15日 火曜日 雑記 (No comments) Tags:


というかついさっきpushした。互換性残せた部分もあったけど、使ってる人いないと思うのと邪魔になるのでがっつり変えた。ちょっとまだふわふわしてる。

Malts

1. routesの廃止

1
2
3
4
5
# 今まで
sub startup {
    my $r = $self->routes('RSimple');
    $r->connect('/' => {...});
}

Mojoliciousみたいな感じにしてたけど、メリットが一切感じられなかったので変更。
Amon2っぽい感じになりました。

1
2
3
4
5
6
7
8
9
10
11
package MyApp::Web;
use MyApp::Web::Dispatcher;
sub dispatch {
    my $self = shift;
    MyApp::Web::Dispaycher->dispatch($self) or $self->create_response(404, [], ['not not found!']);
}

package MyApp::Web::Dispatcher;
use Malts::Web::Router::Simple;

get '/' => 'Root#index';

orで色々変更出来て便利ですね。Amon2とほぼ一緒だけど動作は若干違う。

2. app_base_classは指定が必須に

別に使わないならいいのだけど、これがundefだとエラーが出るメソッドとかあります。
そういう時はエラーメッセージを出すようにしてるけど、忘れてるところがあったらすんまへん。

1
2
3
package MyApp;
use parent 'Malts';
sub app_base_class { 'MyApp' }

変更した理由としては、自動で作ったやつをキャッシュしてたんだけどそれが無駄だなーって思ったのと、Controllerでapp_base_classを初めて呼ぶと仕様上おかしい感じになるのでそれがわかりづらいなと思った。わざわざ指定するのはちょっとめんどいけど、どうせスケルトン作成で出来るし、アプリ側で指定してしまえば多分早いし分かりやすいのでそれでいいやってなった。

3. app_classの削除

ref($self);するだけとか必要ねえなと思った。

4. ok, not_foundメソッドの削除

結構便利でがっつり使ってたんだけど、okとかにすると他のエラーの時とか分かりにくいなって思った。
res_200とかres_404とか別の形で提供するのではないかと思われる。

5. responseメソッド削除

dispatchがresponseを必ず返せばいいだけなので不必要になった。

6. new_responseメソッド削除

responseをキャッシュしないので、不必要になった。

7. 5.10.1以上で動作する

state使い始めてる。5.8.xはレガシー!って事でいいのではないでしょうか。

8. Malts->context, Malts->set_contextの削除

使わないようにしたので削除。モデルで使われたらやだもん。

9. encodingをMalts::Utilでするようにした

Malts->encodingはただのショートカットになりました。

10. configはScope::Containerを使う

Config::ENVを使おうか悩んだのだけど、設定ファイルを動的に変更可能なら1リクエストに1回設定ファイルを読み込んだ方がいいだろうって思ってScope::Containerを使うようにした。
Config::ENVの場合、paramではなくlocalを使えやって話なのだけど、ついうっかりやってしまいがちだし、paramで上書きしてもエラーもでないのでやめた。
ただちょっとここはブレそうです…。

11. サンプルアプリのテスト追加

サンプルアプリのテストは書いていなかったのだけど、動いてるか確認するが一々めんどかったのでテストを書いた。

Malts::Style::Premium

1. Controllerのdbメソッド削除

Controllerの中でdbを触らせたくなかった。それでどうしよう…って考えてたんだけど、普通にControllerの中にdbメソッドなければええやんってなったのでそうした。
コードもすっきり。

2. Scope::Container::DBIを使い始めた。

modelではdbメソッドがあったけど、dbメソッドを削除してdbhメソッドを新たに作った。
例えばTengを使いたい場合は、Malts::Style::Premium::ModelをMyApp::Modelとかに継承して適当にdbメソッドを作る感じでいいかなと思う。
DBIをそのまま使いたいならdbhであれしたらおk
しかも、Amon2::DBIとかDBIx::Handlerとかも設定で渡したら多分使えるので便利。

eg/MyTest以下にテストでも使ってるサンプルアプリがある。
あと、$self->{db}とかで自分で持つよりScope::Containerを使うと他のモデルで使いまわせるのでよいと思われる。
Teng::Schema::Loaderとか開発の時は便利だし使いたいとか結構変える事が多いと思うので、dbメソッドは自分で書いた方がいいと思う。
今までのやり方は継承して、設定変えてとかしなきゃいけなくて、クソめんどくさかったし、これでいいわってなった。またコードもすっきりして見やすくなった。

まとめ

コードのテスト・ドキュメントは修正したけど、Githubのドキュメントを書きなおしていない。つらい。

2011年11月13日 日曜日 perl, 雑記 (No comments) Tags:


追記

Amon2はCLIのネームスペースは持ってないよってtokuhiromさんからツッコミもらいました!スミマセンスミマセン!
Webの方が、Web用で、ルートがCLI用だそうです!スミマセンスミマセン!
ただMaltsはそうだよ、って事で!スミマセンスミマセン!
下の本文はAmon2を抜いて読んでください。スミマセンスミマセン!

本文

Amon2やMaltsがMyApp::WebとかMyApp::CLIに分かれてる理由。

もし、MojoliciousみたいにMyAppにWeb関係のものを突っ込んでしまうと、CLI関係のものを書くときにMyApp::CLIとかにすると実質MyApp::Web::CLIって事になる。
さすがにそれキモすぎやろってなるから、分けた方がよい。

まとめ

Web関係のものはMyApp::Web以下に書くべきだし、CLI関係のものはMyApp::CLI以下に書くべき。
Amon2がそうした本当の理由は知らないけど、最低でもMaltsはそう。
あとスクリプトを書くときに.plにがっつり書きまくるのって微妙だと思っている。(思っているだけでゴメンナサイ)

2011年11月3日 木曜日 perl, 雑記 (No comments) Tags:


サーバサイドエンジニアもクライアントサイドエンジニアも一緒。

前提

-機能Aを実装する。
-テスト大事。

使うもの

- Redmine
- Git
- Ukigumo

流れ

- 機能Aについてのチケットを切る。

- git-flow使いましょう。
参考: 見えないチカラ: A successful Git branching model を翻訳しました

- 実装し始める。
「機能Aを実装したらコミットする」ではなく「機能Aを実装するために必要な〇〇をしたらコミットする」で。
コミットメッセージは、翌日の自分が「何をしたかわかる」用に書く。
いい加減なコミットメッセージを書いたら、横のエンジニアもしくは未来の自分に殺されます。
どの機能についての変更なのかわかるように、出来るだけチケットの番号を付けましょう。refs #1111

- 良い例
hogehoge メソッドを追加 refs #123456

- 殺される例
「チャット実装」
「あ」
「おなかすいた」
「チャット」

連続して同じコミットメッセージなんてありえない。
参考: Git+Redmineな人におすすめのフックスクリプト集 – みずぴー日記

- 機能Aが出来たら、git-flowに従ってpush

- 浮雲ちゃんパワー全開。
参考: Testing Web Application 2011秋 – ”><xmp>TokuLog 改メ tokuhirom’s blog

まとめ

ほぼコミットメッセージについてになってしまった。
実はgit-flowを使った事ないので、良いか悪いかよくわかってない。とりあえずgit-flowを使わないにしてもこういう感じでブランチモデルをドキュメントに書くのはいいなあと思った。

この「ぼくのかんがえたさいきょうのかいはつのながれ」で言いたいのは、これを実際に導入するかどうかではなくて、実際の流れをドキュメントにしておくのは大事だよねって事だ!!!!!!!!!!そうだ!!!!!!