DOT NOTES

Twitter:@dot_not_ GitHub:@ogrew

sprintf関数で自由自在に数字や文字列のフォーマットを指定する

1234 -> 001234 みたいな数字のゼロ埋め作業をPerlで楽にやる方法。

下記のように書くと便利です。

my $hoge = 1234;
my $fuga = sprintf("%06d", $hoge);
print $fuga;
# -> 001234

sprintf関数は指定した書式で文字列を作成することが出来ます。

応用して小数点の丸め込み(四捨五入)にも使えます。

my $hoge = 12.343;
my $fuga = sprintf("%.2f", $hoge);
print $fuga;
# -> 12.35

0をなくせばspace埋めも可能です。

$fuga = sprintf("%-6s", 1234);
# -> '1234  '
$fuga = sprintf("%6s", 1234);
# -> '  1234'

浮動小数点数や16進数との返還などもsprintf関数でたやすくできます。

d.hatena.ne.jp

d.hatena.ne.jp

perlでHashの一部分をテストで確認したいときにsuperhashof便利やん。

f:id:taiga006:20180509225412p:plain:w500
use Test::More;
use Test::Deep;

my $user = {
        name => '齋藤飛鳥',
        age => 19,
        height => 158,
        blood_type => 'O',
        center => '裸足でSummer',
    };

is $user->{age}, 19;
cmp_deeply $user, superhashof { name => '齋藤飛鳥', blood_type => 'O' };

done_testing;

[output]

₍ ᕕ( ‘ω’)ᕗ⁾ $ prove -lvf superhashof.pl
superhashof.pl ..
ok 1
ok 2
1..2
ok
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.03 usr  0.01 sys +  0.07 cusr  0.01 csys =  0.1
2 CPU)
Result: PASS

こける場合はこんな感じ。

use Test::More;
use Test::Deep;

my $user_2 = {
        name => '斉藤優里',
        age => 24,
        height => 157,
        blood_type => 'O',
        center => '13日の金曜日',
    };

cmp_deeply $user_2, superhashof { name => '齋藤優里', height => 157 };

done_testing;

[output]

₍ ᕕ( ‘ω’)ᕗ⁾ $ prove -lvf superhashof.pl
superhashof.pl ..
not ok 1
#   Failed test at superhashof.pl line 12.
# Compared $data->{"name"}
#    got : '斉藤優里'
# expect : '齋藤優里'
1..1
# Looks like you failed 1 test of 1.
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/1 subtests

Test Summary Report
-------------------
superhashof.pl (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
Files=1, Tests=1,  0 wallclock secs ( 0.02 usr  0.00 sys +  0.05 cusr  0.01 csys =  0.08 CPU)
Result: FAIL

[参考]

Test::Deep - search.cpan.org

表紙ははずいが役に立つ ~良書紹介「雅なPerl」~

「初めてのPerl」の第7版が今年の1月に出ていたらしい。

初めてのPerl 第7版

初めてのPerl 第7版


これこそまさしく「ザ・Perl入門書」ではあるとは思うけど、今日は「雅なPerl」という一風変わった本を紹介したい。

全体で200ページ程度の量で、難しい背景や言語の仕組みに関わる話はすっ飛ばしてPerlを使って如何に書きたいことを書くか、その方法が章立ててまとまっている。 (しかもラノベ調で)

初学者(あるいは基礎がガバガバな半端者=僕)みたいな人が分厚い参考書を手に取る前にサクッと読みながら時々写経してみるのにぴったりな本だと思う。

表紙から溢れ出る同人誌感はさておいて、この本はPerl入学式なんかでも立派な一参考資料として紹介されるくらい、その道の人も認めている本なのだ。

(本当に?)

github.com

ラクダ本やリャマ本と並べて紹介されてるぞ..!?

良い点

  • 雅が初学者目線で常に語ってくれるのでどこまでを一読で理解する必要があってどこからが応用(今後勉強していきましょうねー)な内容なのかがわかりやすい。

  • Perlが得意とする文字列操作、特に正規表現に関する解説が特に充実している。 今でもリファレンスとして時たまペラペラとめくる。

  • 200ページくらいでサイズもコンパクトで持ち運びしやすい。 まあ電子書籍が主流の現代において「重さ」「デカさ」はあまり重要視されないパラメータではありますが...。

悪い点

  • オブジェクト指向の説明に関しては12章まるまる使ってるとはいえPerlで、この短さで、なんとかしようとなるとやっぱり厳しい印象。

  • この表紙だと外出先で開きにくい。うぅ...試されている…。

  • 非売品

近くのPerl Mongerおじさんに持っていないか聞くのが吉。

ちなみに僕が持ってるのは第1版だけど第3版(Perl6の話とか追加)まであるらしい。
第2版の表紙が一番好き。

それから、この本に限ったことではないけどPerl後方互換性が強いので古い参考書でも全然現役で勉強になることがたくさん書いてある。

これが他の言語ではそうはいかない。
先週見たQiitaの記事がすでに過去の遺産だったりする。 きゃー大変。

まあPerlでもあんまり古い本とかサイトをみるよりは公式ドキュメント見ろよ、ってのはもちろん正論なんだけど。

kazhiramatsu.hatenablog.com

書評のようなもの ++ 雅なPerl入門 | koji_magi::*

Test::Mock::Guard ~テスト用にお手軽にstub化~

今日も今日とて、これまでなんとなくで使ってたモジュールを再度見つめ直す回です。

github.com

Test::Mock::Guardはテストで使えるモジュールとしてメジャーな模様。既存のクラス挙動を簡単にオーバーライドできる。

use strict;
use warnings;
use Test::More;
use Test::Mock::Guard qw/ mock_guard /;

package Discord;

sub new { bless {} => shift; }
sub solo { "長濱ねる"; }

package main;

{
    my $guard = mock_guard "Discord", +{
            solo    => sub { "平手友梨奈"; },
        };

    my $song0 = Discord->new;
    is $song0->solo, "平手友梨奈", "mock化されてる";
}

print "------(OUT OF SCOPE)--------\n";
my $song = Discord->new;
is $song->solo, "長濱ねる", "mock化されない";

done_testing;
〓 ~/perl_study
₍ ᕕ( ‘ω’)ᕗ⁾ $ prove -lvf discord.t
discord.t ..
ok 1 - mock化されてる
------(OUT OF SCOPE)--------
ok 2 - mock化されない

1..2
ok
All tests successful.
Files=1, Tests=2,  0 wallclock secs ( 0.02 usr  0.00 sys +  0.06 cusr  0.01 csys =  0.09 CPU)
Result: PASS

無駄にネストが深くならずに済む。

よく聞くスタブとモックの違いについて。

厳密に正しいかはあれですが、この記事が参考になりました。

perl-users.jp

スタブの場合は、それを利用する部分がテスト対象になります。

( 中略)

一方、モックの場合は、適用する部分そのものがテスト対象です。

( 中略)

ですので、今テストしたい部分がどこかを的確に認識できれば、 モックとスタブのどちらを使うのがよい状況なのかを判断できるようになります。

ちなみに最近よく聞く?Test2にもメソッドをモックしてくれる君としてTest2::Mockというのがあるみたいなんですがこいつだとモックしたメソッドを何回呼ばれたかを知るcall_count同等の機能がない様子。

techblog.kayac.com

Test2についてはまた記事を書きたいと思います。

参考記事

mihyaeru21.hatenablog.com

blog.yuuk.io

d.hatena.ne.jp

Acme::Keyakizaka46をリリースした。

TL;DR

  • Acmeモジュール群の存在を知って、Acme::Keyakizaka46を作った。

  • 公式サイトからメンバーの情報を引っ張ってくる適当なスクリプト(Python)を書いた。

  • Minilaを使ってCPANAcmeモジュールを公開したら簡単すぎて肩透かしを食らった。

github.com

経緯

普段から仕事でPerlを書いている僕がAcmeの存在を知ったきっかけはつい最近で隣の席のエンジニアリーダー氏の机にあったAcme大全2015を見たことだった。

donzoko.booth.pm

知らない人のためにざっくりと紹介するとこのAcmeモジュールとはPerlの世界におけるジョークモジュールの名前空間でまさに「技術の無駄遣い」そのもの。詳しくは、

qiita.com

あたりを見て欲しい。

Acmeモジュールのくだらなさにはまった僕は、色々と調べているうちに面白いモジュールたちに出会った。それが

blog.kentarok.org

perl-users.jp

secondlife.hatenablog.jp

syohex.hatenablog.com

といったキャラクターや実在のアイドルのデーターベースの役割をなすモジュールたちだ。なるほど、こんなに 実用性のない 単純で面白いモジュールが出ているなら僕でも作れるなーと思い、

「よしAcme::Nogizaka46作るかー!」

となったのが今から1週間ほど前。

..........

しかし、すでにAcme::Nogizaka46は存在していることがわかった。

d.hatena.ne.jp

なるほどー、アイドルネタは諦めて某クソマンガAcmeモジュールでも作るかーと思った矢先、上のブログで引用されているこの文章が目に止まった。

Acmeシリーズは二つ、Acme::MorningMusume と Acme::AKB48 があります。その Acmeが存在するアイドル2ユニットに共通していえることの一つに、どちらも紅白歌合戦に参加したことがあることが言えます。つまるところ、日本のAcme::アイドルが作られたのユニットは100%紅白出場している

なるほど、そう言う経緯でAcme::MomoiroCloverやAcme::Nogizaka46が作られているのであれば彼女たちのがあっても良いな、と思い作ろうと思ったのがAcme::Keyakizaka46というわけだ。

(彼女たちの場合は出場願掛けではなく、すでに出場しているが…。)

準備

ベースとなるメソッドはAcme::MorningMusumeやAcme::Nogizaka46を再利用させていただくことにするとは言え、メンバー一人一人の情報はこちらで集計しなければいけない。

ということで、公式サイトから情報を引っ張ってくる簡単なスクレイピングスクリプトを書いた。

Pythonで書いたのはBeautiful Soupというライブラリが使い慣れていたから。

(コードは本当に書き捨てなので汚さとかは勘弁してほしい。)

という事でこれにて欅坂とけやき坂のメンバー情報はすぐに集められた。

実装?

特に新しいことはしていない。欅坂はまだ卒業メンバーも出ていない(要出典)ので、その辺のロジックを抜いたのとあとは誕生日から年齢の計算をするロジックをもっと単純にしたくらいである。あとselectメソッドでcenterを指定すると強制的に平手友梨奈の情報が返ってくる。

テストもいくつか追加した。欅坂で一番身長が高いのは羽生ちゃんで、これはしばらく更新されないだろうからベタ打ちで書いている。(笑)

[参考]

tech.nikkeibp.co.jp

Minilaでリリース

自分で書いたテストが無事通ればあとはCPANに上げるだけ。でも待ってくれ??ここからの知識がこの時点で皆無だった僕は一瞬途方にくれることになった。

が、さすがPerl、枯れ切った言語と揶揄されるだけあって少しググれば湯水のごとく情報が出てくる。

どうやらMinilaというモジュールオーサリングツールを使えば初心者でも簡単にCPANに自作モジュールをあげられることがわかった。

手順は以下の記事が参考になった。

keyamb.hatenablog.com

www.swipe.to

nukosuke.hatenablog.jp

要は完成したら minil testしてminil distして minil releaseすればよい。 エラーが出てもメッセージが親切なのでつまづくことは少ないはずだ。

一点。上の記事にもあるが ~/.pauseにPAUSSEアカウントのユーザ情報を載せておかないと上手くいかないことに注意。

Missing ~/.pause file or your ~/.pause file is wrong.
You should put ~/.pause file in following format.

    user {{YOUR_PAUSE_ID}}
    password {{YOUR_PAUSE_PASSWORD}}

(用意しておかないとこんなエラーが出る。親切。)

それから今回はPODの書き方が一番戸惑ったのだがMinilaを使うとtestの時点で文法チェックしてくれるのでありがたい。

あとはPAUSEからメールが来たりなんなりするけど特につまづくことはないはず。

寝てCPANに出てくるのを待つだけ。

metacpan.org

どーんっ!完成。

これから

制作期間5時間程度で作ったモジュールではあるが、欅坂というか坂道グループ全体で今年?来年?合同オーディションがあることが発表されたばっかりなのですぐに修正を入れる必要が出て来そう。

欅坂はもう良くないですか...

また、当初やろうと思っていたグループ内ユニットの情報をまだ入れていないのでこれもやりたいと思っている。

ゆいちゃんずとかゆいちゃんずとか。

www.youtube.com

さて、要領は掴んだので今度はクソマンガのクソAcmeモジュールでも作るかー。

Data::Validator ~ 多機能かつシンプルにサブルーチンの引数をバリデート ~

f:id:taiga006:20180304133957p:plain

プライベートでもお仕事でもお世話になっています。

github.com

基本的にはHASH or HASH_REF の形での値の引き渡しができることは知ってるのだが、withを使った拡張によっていくつか応用が効くみたいであり、それをイマイチ把握してなかったので今回は適当なスクリプトを書いてそれらを確認してみた。

続きを読む

猫でもわかる?Perlモジュールのもろもろ確認術

f:id:taiga006:20180304134129j:plain

「あれ?あのモジュールってインストールしてるんだっけ?」

perldoc -m モジュール名

とりあえず手っ取り早い。

「今、@INCって何が設定されてるんだっけ?」

perl -e 'print @INC';

...っていうのをよく見るけど改行がなく見づらい。

perl -e 'use Data::Dumper;print Dumper @INC';

Dumper使ったこっちのほうがわかりやすい。

「インストール済で使えるモジュールを一覧でサクッと見たいんだけどなぁ…」

> $ instmodsh
Available commands are:
   l            - List all installed modules
   m <module>   - Select a module
   q            - Quit the program
cmd? l
.........
(一覧で使えるモジュール全部出る)
.........

これ今回ググってて初めてこれを知った。やや便利。

内部はExtUtils::Installedを使って少し見やすくしたものっぽい。

instmodsh - search.cpan.org

ついでに今回色々ググってたら組長のブログを見つけた。 なるほど sfujiwara.hatenablog.com

Perlで同じ内容のメソッドを別名で実行したいときのTip

Tipというか小手技。

まずあまり出番はないと思うが、

中身は同じ内容のメソッドだが呼び出し元の都合で別名で読んだ方が可読性が上がる、メンテナンスがやりやすい

みたいな場合がごく稀にある(と思う)。

あるいは「その実装自体を見直した方が良いのでは?」というのはもっともかもしれない。

あくまでTip。

例を挙げる。

続きを読む