YAPC::KANSAI 2017 LT

86
YAPC::Kansai 2017 OSAKA LT まかまか般若波羅蜜@どんぞこ楽屋 所属:国際展示場前.pm 驚くべきことに Perlの話

Transcript of YAPC::KANSAI 2017 LT

YAPC::Kansai 2017 OSAKA LT

まかまか般若波羅蜜@どんぞこ楽屋所属:国際展示場前.pm

驚くべきことにPerlの話

驚くべきことにPerlの話

2 / 244

驚くべきことに

3 / 244

LTに応募したことが記憶になかった

4 / 244

第一部某slackにて

6 / 244

Time::Piece

日時を扱うPerlのコアモジュール

7 / 244

8 / 244

my $t = Time::Piece->new$t->yyyymmdd; # 20170304

10 / 244

$t->yyyy-mm-dd(); # 2017-03-04$t->dd-mm-yyyy(); # 04-03-2017

etc.

11 / 244

$t->yyyy-mm-dd(); # 2017-03-04$t->dd-mm-yyyy(); # 04-03-2017

etc.

Perlのメソッドはハイフンとか使えないから無理ゲーよね、と

……ん?

13 / 244

できる!できるぞ!

14 / 244

overload

15 / 244

overload演算子オーバーロード

16 / 244

package Foo;overload (‘+’ => sub { ... },‘-’ => sub { ... },

);...my $foo = Foo->new;$foo + 1;3 - $foo;$foo--;

方針:

yyyy, mm, ddをインポート

それらの関数は-や/をoverloadしたオブジェクトを返す

18 / 244

package Time::Piece::YYYYMMDD;use strict;use warnings;

BEGIN {require Exporter;our @ISA = qw(Exporter);our @EXPORT = qw(mm dd yyyy);

}

use parent 'Time::Piece';

19 / 244

sub yyyy {_make_obj('%Y', shift);

}

sub mm {_make_obj('%m', shift);

}

sub dd {_make_obj('%d', shift);

}

20 / 244

sub _make_obj {my ($type, $obj) = @_;if ( defined $obj ) {if ( $obj->isa('Time::Piece::YYYYMMDD::Object') ) {push @{$obj->{types}}, $type;return $obj;

}else { # $obj is a Time::Piece::YYYYMMDDbless { t => $obj, types => [$type] }, 'Time::Piece::YYYYMMDD::Object';

}}else {bless { t => undef, types => [$type] }, 'Time::Piece::YYYYMMDD::Object';

}}

21 / 244

package Time::Piece::YYYYMMDD::Object;

use overload ('-' => _kigo('-'),'/' => _kigo('/'),

);

22 / 244

BEGIN {sub _kigo {

my ( $kigo ) = @_;return sub { # オーバーロードされた演算子で呼ばれる

my ( $self, $other, $swap ) = @_;my $t = $self->{t};my $type = $self->{type};

if ($swap) {push @{ $self->{types} }, $kigo;return $self;

}else {

push @{ $other->{types} }, $kigo;}

my @types = (@{$self->{types}}, reverse(@{$other->{types}}));

return $t->strftime(join('', @types));};

}}

use Time::Piece::YYYYMMDD;

my $t = Time::Piece::YYYYMMDD->new;$t->yyyy-mm-dd;

24 / 244

use Time::Piece::YYYYMMDD;

my $t = Time::Piece::YYYYMMDD->new;$t->yyyy-mm-dd;

####

$ perl -MO=Deparse test.pl

25 / 244

use Time::Piece::YYYYMMDD;

my $t = Time::Piece::YYYYMMDD->new;$t->yyyy-mm-dd;

####

$ perl -MO=Deparse test.pl

$t->yyyy - mm(-dd());

26 / 244

$t->yyyy - mm(-dd());

dd() が呼ばれ%Dをスタックに積んだオブジェクト返す

-が呼ばれ – をさっきのオブジェクトのスタックに積む

mm() が呼ばれ%Mをスタックに積む

-が呼ばれ – をスタックに積む。さらに

yyyy() で返されたオブジェクトを引数で受けてるのでここまでの情報が積まれたオブジェクトとがっちゃんこ

27 / 244

いい感じになるので

$VAR1 = ['%Y','-','%m','-','%d'

];

これを strftime に渡す

28 / 244

say $t->yyyy-mm-dd;

say $t->mm-dd;

say $t->yyyy-mm;

say $t->dd-mm-yyyy;

say $t->mm/dd;

29 / 244

say $t->yyyy-mm-dd;2017-03-04say $t->mm-dd;03-04say $t->yyyy-mm;2017-03 say $t->dd-mm-yyyy;04-03-2017say $t->mm/dd;03/04

30 / 244

やったー!

31 / 244

……ん?

32 / 244

say $t->yyyy-mm-dd;2017-03-04say $t->mm-dd;03-04say $t->yyyy-mm;2017-03 say $t->dd-mm-yyyy;04-03-2017say $t->mm/dd;03/04

33 / 244

say $t->mm/dd;03/04

34 / 244

say $t->mm/dd;03/04

say $t->yyyy/mm/dd;...?

35 / 244

say $t->yyyy/mm/dd;

Search pattern not terminated

36 / 244

say $t->yyyy/mm/dd;

Search pattern not terminated

TerminateしないのにThe END

37 / 244

第一部完

39 / 244

40 / 244

41 / 244

41 / 244

41 / 244

51 / 244

51 / 244

51 / 244

80 / 244

80 / 244

80 / 244

100 / 244

100 / 244

100 / 244

100 / 244

100 / 244

100 / 244

第二部昨年のPerlの同人活動(2016年夏・冬コミ)

Acme大全2016

231 / 244

Acme大全2016

232 / 244

Acme大全2016

615個のAcmeモジュール

233 / 244

昔ParumonっていうPerl Monger

なりきりカードゲームをつくったよ

234 / 244

納期が襲ってくるのでCPANモジュールを

駆使して進捗を達成する協力型ゲーム

235 / 244

ボードゲームに移植したよ

237 / 244

デバッグしないで公開したからメッチャ

ゲームバランス悪い

一番の問題点は納期が襲ってこない

240 / 244

穏やかなゲームになった

241 / 244

なお、会場でこのゲームの説明をすると

242 / 244

皆口をそろえてゲームでまで納期のことを考えたくないと

243 / 244

汚いものを見る様な目で

244 / 244

第三部今後のPerlの同人活動

1000 / 244

技術書典2

2000 / 244

え-25

2000 / 3004

YAPC::Kansai 2017 LT

おしまい

驚くべきことにPerlの話

2017/03/04