僕のYak Shavingは終わらない

車輪の再発明をやめたらそこには壮大なYakの群れが

社内でCPAN Authorになろうハッカソンを開催しました!!

※追記(2013/06/17)…人生初の知人でない人からpull req来ましたとても嬉しいです。

Perl界ではMinillaというCPANモジュール開発ツールが流行っていたのもあり、ちょうど3年目の同期と「そろそろモジュールとか公開しないとエンジニアとして死ぬ」って言って意気投合し急遽ハッカソンを開くことにしました。

集まったメンバーは

です。

日曜でしたがやる気満々なあたりが今回集まった6人を物語っていると思います。

つくったやつ

同期は実際に仕事でも使える実用的なモジュールを前々から書いており、それを公開できる形で上げるのが今日の目的でした。

自分は実用風を謳ってしまうとご迷惑をかけることになるかな??って思って、今回はAcmeモジュールを書きました。

直近でちょうどIRCbotが社内で流行っており、その時ネタで使ったflippyというgemがあるのですが、そのPerl版をつくるのを目的としました。

で、みんなのつくったやつ

id:papixの場合は改良ですね。他にもたくさんつくってるので続きはWebで。

自分がつくったやつ
f:id:kazuph1986:20130616230102g:plain

縦書を簡単に生成できる君ですね。コマンドだけでなく、useしてスクリプト中に使うこともできます。

はい、ということで一つを除いて全部Acmeです。
つっこみどころ満載のやつもあるので、ぜひ突っ込んでいただきたいものです。

またid:takyam1213さんはPerlerじゃないのでCPANはつくってないですがPHPのモジュールを2つ上げていました!
ComposerというPHPのモジュール管理ツール?を使うと楽だって話を書いていたので興味のある方は見てみるといいと思います。
CPAN Authorになろう会の横でComposer Authorになる話 - new takyam();

リリースまでの覚書

参考にしたサイト

Minillaの本家さんのブログで概要を掴み、
Minilla を用いた Perl モジュールの作り方 - tokuhirom's blog.

はまった記を見て事前に予習をし、
CinnamonをMinilla管理にした - $shibayu36->blog;

Mnillaの108の奥義を身に付け、
にひりずむ::しんぷる - Minila 化でハマったときに解決する 108 つの方法

あとはREADME.mdを適宜参照するといい感じだと思います。
tokuhirom/Minilla · GitHub

事前にPAUSEの登録

The [Perl programming] Authors Upload Serverで通称PAUSEらしいです。
PAUSE: request_id

CPANのサイトに自分のモジュールを上げるのに必要なので事前に登録してました。
A short description of why you would like a PAUSE ID:の欄で登録する理由を聞かれるのですが、英文2行くらいでいけました。
「◯◯をつくってPerlのコミュニティに貢献したいです」って文面にしたと思います。

手動で確認してると思うのですがこれが爆速の返信速度でした。

簡単にコマンドをつくれる

Minillaだから簡単だったのかあれですが簡単にオリジナルコマンドを作成できます。

$ minil new Hoge
$ cd Hoge
$ mkdir bin
$ echo '#!/usr/bin/perl' > bin/hoge-cmd
$ echo 'print "This is hoge command!"' >> bin/hoge-cmd
$ chmod 755 bin/hoge-cmd
$ cpanm .
$ hoge-cmd
This is hoge command!

これだけでコマンド作成&確認ができます。超簡単ですね!

if ( __FILE__ eq $0 ) {}

__FILE__にファイルのパス、$0にこのPackageを使用してるファイル名が入るのを利用して以下のように書いてみました。

if ( __FILE__ eq $0 ) {
    $text = tategaki("お前は、すでに、死んでいる。");
    warn $text, "\n";
}

こうすると外部からモジュールとして使用しているときはこのifの中身が実行されず、このモジュールをそのまま実行したときのみifの中身が実行されます。

お試しで書いているときには重宝すると思いました(テストを書こう!)。

phコマンドをつかうと簡単にgithubのリポジトリを作成できる

ある程度作成したあととりあえずgithubにpushしようと思ったときに便利です。

$ cd Hoge
$ cpanm App::ph
$ ph import

githubにあげたいプロジェクトのディレクトリ下でこれを入力すると、よしなに「Hogeってリポジトリ名でいい?」って聞いてくれて、良ければgithubのid/passを入力すればリモートリポジトリが作成されます。
超楽ですね!

とりあえず息を吸うようにminil test

$ minil test

を実行するとgithub用のREADME.mdを更新してくれたり、cpanfileを見てMETA.jsonを更新してくれたり、他にももちろんtestを含めて色々やってくれます。testだけじゃないのがポイントですね。

とりあえずminil test してgit pushする感じでやってました。

あとFAKE_RELEASE=1つけてminil releaseでgithubにあげれますが、バージョンが進むってpapixから聞いたのでやりませんでした。

リリース時の.pauseファイルの書き方

cat $HOME/.pause
user KAZUPH
password *********

こんな感じのファイルを作成する必要があります。最初passwordをpassと打っていたためエラーで失敗してしまいました。

Exporterを適切に書く

僕の認識が合っているかあれですがこれを書いてればuseしたときにモジュール名をつけなくてもメソッドを呼ぶことができます。

自分の場合だと

use parent 'Exporter';
our @EXPORT = qw( tategaki );
sub tategaki {
    ...
}

こんな感じに書いておくことで

use Acme::Tategaki;
print tategaki("ほげ");

みたいに使えるようになります。

print Acme::Tategaki::tategaki("ほげ");

のように書く必要がなくなるのがいいですね。

戻り値によって返却する値を変更する

これ書くまで果てしなく忘却してたのですが、Perlはwantarrayを使うことでメソッド自体が配列を返却することを期待されているかそうでないか判断できます。

return wantarray ? @text : join "\n", @text;

最初はずっと配列をそのまま返そうと思っていたのですが、ちょっと不親切かなと思ったので両方対応するようにしました。

ですがこれによってprint時にscalarを指定しなければならなくなってしまったのが玉に瑕ですね。

print scalar tategaki("ほげ ふが");
# ふ ほ
# が げ

参考にしたモジュールがあったらお礼を言う

元々flippyというgemをパクって参考にして開発を行っていたのでリリース時にお礼をいいました。


ものによっては、もっと事前に承諾を得ていた方がいいかもしれませんが、それはTPOを見て判断すればいいと思います。

だいたいこんな感じでしょうか。

まとめ

勢いって重要ですね!!
こういうハッカソンは定期的にどんどん開催しないといけないと思いました!!

今後はちゃんと実用的なモジュールも書いていきたいと思います。実に楽しい一日でした(`・ω・´)ゞ

声をかけてくれた同期と参加してくれたメンバー、そしてminillaをつくってくれたtokuhiromさんに感謝です。