Slide 1

Slide 1 text

2024年冬のPerl Kenichi Ishigaki @charsbar YAPC::Hiroshima 2024 Feb 10, 2024

Slide 2

Slide 2 text

me 2016年のPerl@LLoT Perl in 2016@YAPC::Hokkaido 2017年春のPerl@YAPC::Kansai 2017年夏のPerl@YAPC::Fukuoka (萬國之津梁@YAPC::Okinawa) (2018年初夏のPerl5)@Hokkaido.pm #14 2018年夏のPerl5@Shibuya.pm #18 2018年残暑のPerl@LL2018 2019年冬のPerl@YAPC::Tokyo (Learn Languages 2021) 2023年春のPerl@YAPC::Kyoto 2024年冬のPerl@YAPC::Hiroshima <- イマココ

Slide 3

Slide 3 text

FOSDEMに行ってきました https://fosdem.org/2024/

Slide 4

Slide 4 text

Perl and Raku devroom 2018年以来、6年ぶりのdevroom

Slide 5

Slide 5 text

Perl Steering Councilからの発表 https://go.leonerd.org.uk/updates-from-the-psc-2024-slides

Slide 6

Slide 6 text

Perl Steering Council 2023年8月にメンバーの入れ替えがありました • Graham Knop (new) • Paul Evans • Philippe Bruhat

Slide 7

Slide 7 text

Perlの安定版は5.38に • 2023年7月2日にリリース • 例年より一月半近い遅れ

Slide 8

Slide 8 text

Perl 5.38が遅れた理由 • 5月の段階でもスモークテストで いろいろ問題が出ていた • HTTP::Tinyのセキュリティ問題

Slide 9

Slide 9 text

背景事情 欧米でサイバーセキュリティ関連の法整備が進んでいる • EO 14028 (2021/05) • NIS2 Directive & Cyber Resilience Act 「CPANをもっと安全にしておかないといろいろヤバイ」 CPAN Security Working Group (2023/04) https://security.metacpan.org

Slide 10

Slide 10 text

CPANミラーはすでにCDNへ • 昔は世界各地のCPANミラーからダウンロード • いまどきはCDN経由で (2017年からFastly) • 公式のミラー一覧は2021年に削除 • ftp.cpan.orgも2022年に廃止済み

Slide 11

Slide 11 text

CPANクライアントのセキュリティ強化 • CPAN.pmが利用しているHTTP::Tinyの 証明書のチェックがデフォルト無効に なっていた (CVE-2023-31486) • cpanm/cpmは大丈夫 • SSL In Core対応の妨げ

Slide 12

Slide 12 text

HTTP::Tinyを利用している小物ツール CPANモジュールだけでも400件以上 • App::cpanoutdated • App::pmuninstall • Pod::PerldocJp • OrePAN2 • Slack::Notify • Slack::WebHook https://metacpan.org/module/HTTP::Tiny/requires

Slide 13

Slide 13 text

SSL In Core? • 現時点ではまだコアには入っていません • 2023年10月にプロジェクトマネージャが決定

Slide 14

Slide 14 text

Perl本体のセキュリティリリース 2023年11月に5.38.2、5.36.3、5.34.3が出ました • CVE-2023-47038 - Write past buffer end via illegal user-defined Unicode property • CVE-2023-47039 - Perl for Windows binary hijacking vulnerability

Slide 15

Slide 15 text

Strawberry Perlの復活 • 2021年1月のPerl 5.32以降更新が止まっていた • 2023年7月に5.38.0.1と5.36.1.1 • 2023年12月には5.38.2.2と5.36.3.1も

Slide 16

Slide 16 text

Strawberry Perlの復活 あれれ?

Slide 17

Slide 17 text

Strawberry Perlの復活 PRのマージ待ちなのでそのうち直るでしょう https://github.com/StrawberryPerl/strawberryperl.com/pull/46 メインの配布場所がGitHubに変わっています https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases

Slide 18

Slide 18 text

5.38の新機能 WEB+DB PRESSの記事もあわせてどうぞ https://gihyo.jp/dev/serial/01/perl-hackers-hub/007901

Slide 19

Slide 19 text

クラス Perl本体でもクラスの実装が始まっています use v5.38; use experimental 'class'; class CPANAuthor :isa(Person) { field $pause_id :param; method name_and_id () { return $self->name . " ($pause_id)"; } method upload ($distribution) { ... } }

Slide 20

Slide 20 text

クラス 新しいキーワードはclass、field、method(と未実装のrole)のみ use v5.38; use experimental 'class'; class CPANAuthor :isa(Person) { field $pause_id :param; method name_and_id () { return $self->name . " ($pause_id)"; } method upload ($distribution) { ... } }

Slide 21

Slide 21 text

クラス 属性を多用するようになっています use v5.38; use experimental 'class'; class CPANAuthor :isa(Person) { field $pause_id :param; method name_and_id () { return $self->name . " ($pause_id)"; } method upload ($distribution) { ... } }

Slide 22

Slide 22 text

クラス method内の$selfなどは自動的に用意されます use v5.38; use experimental 'class'; class CPANAuthor :isa(Person) { field $pause_id :param; method name_and_id () { return $self->name . " ($pause_id)"; } method upload ($distribution) { ... } }

Slide 23

Slide 23 text

クラス サブルーチンシグネチャにも対応 use v5.38; use experimental 'class'; class CPANAuthor :isa(Person) { field $pause_id :param; method name_and_id () { return $self->name . " ($pause_id)"; } method upload ($distribution) { ... } }

Slide 24

Slide 24 text

クラス • 多重継承の禁止 • 内部構造が変わり、適切に隠蔽できるように • そのかわり一から実装し直しのものも多数 • バージョン指定の問題はツールチェイン側の 対応が遅れています

Slide 25

Slide 25 text

サブルーチンシグネチャのデフォルト値 従来はパラメータが渡らなかった場合のみ use v5.20; use experimental 'signatures'; sub point ($x, $y = 10) { say "($x, $y)"; } point(20); # (20, 10)

Slide 26

Slide 26 text

サブルーチンシグネチャのデフォルト値 undefが渡ってくると補完できません use v5.20; use experimental 'signatures'; sub point ($x, $y = 10) { say "($x, $y)"; } point(20, undef); # (20, ) point($x, $y);

Slide 27

Slide 27 text

サブルーチンシグネチャのデフォルト値 //=を使うと期待通りの動作になります use v5.38; sub point ($x, $y //= 10) { say "($x, $y)"; } point(20); # (20, 10) point(20, undef); # (20, 10)

Slide 28

Slide 28 text

フィールドのデフォルト値 クラスのフィールドも同様です class Log { field $message :param; field $level :param //= 'INFO'; }

Slide 29

Slide 29 text

builtin::export_lexically 特定のブロックのみにエクスポートできる 機能が用意されました package My::Util; use v5.38; use experimental qw(builtin); sub import { my $class = shift; my %export = map { $_ => $class->can($_) // die "Can't export $_" } @_; builtin::export_locally %export; } sub foo { say "foo" }

Slide 30

Slide 30 text

builtin::export_lexically 範囲外のところには取り込んだ関数は残っていません { use My::Util qw(foo); foo(); # foo } foo(); # Undefined subroutine &main::foo called

Slide 31

Slide 31 text

module_true バージョンバンドルなどを利用してこの機能を有効にしておくと、 モジュールの末尾に真値を入れなくてもよくなります package Foo; use v5.38; # または use feature qw(module_true); sub foo { ... } # ここに真値を入れなくてもよくなります

Slide 32

Slide 32 text

プラガブル中置演算子 中置演算子を拡張できるようになりました use v5.38; use Syntax::Operator::Equ; if ($x equ $y) { ... } if ($i === $j) { ... }

Slide 33

Slide 33 text

スマートマッチとgiven/when 5.36でバージョンバンドルから外れていましたが、 5.38で廃止、5.42で削除予定です

Slide 34

Slide 34 text

スマートマッチとgiven/when 代替となりうるSyntax::Keyword::Matchの 実験は進められています use v5.38; use Syntax::Keyword::Match; use Syntax::Operator::Equ; match ($str : equ) { case (undef) { say "not defined" } case ("") { say "defined but empty" } default { say "not empty" } }

Slide 35

Slide 35 text

シングルクォートのパッケージ区切り これも5.38で廃止、5.42で削除予定です • jcode'convert(...); • Test::More::isn't(...); • Acme::Don't::don't(...);

Slide 36

Slide 36 text

開発中の新機能

Slide 37

Slide 37 text

未定義パッケージからの(un)import (5.39.1) 以下のような取り込みがエラーになります use v5.39.1; Class::That::Does::Not::Exist->import("foo"); Class::That::Does::Not::Exist->unimport("bar");

Slide 38

Slide 38 text

未定義パッケージからの(un)import (5.39.1) ファイルの大文字小文字を無視する環境での事故防止策 use v5.39.1; no Warning 'redefine'; # require Warning; Warning->unimport('redefine');

Slide 39

Slide 39 text

__CLASS__ キーワード (5.39.2) $selfが使えない場所で使うと便利? class Foo { use constant DEFAULT_X => 10; field $x = __CLASS__->DEFAULT_X; method say_x { say $x } } class Bar :isa(Foo) { use constant DEFAULT_X => 20; } Foo->new->say_x; # 10 Bar->new->say_x; # 20

Slide 40

Slide 40 text

__CLASS__ キーワード (5.39.2) methodはインスタンスからは呼べないので要注意 class Foo { field $x = __CLASS__->default_x; # ERROR! method default_x { 10 } method say_x { say $x } } class Bar :isa(Foo) { method default_x { 20 } }

Slide 41

Slide 41 text

microperl (5.39.2) Perl 5.18の時点で宣言されていた通りに削除されました

Slide 42

Slide 42 text

Test2::Suiteがコア入り (5.39.4) • Test2自体は5.26でコア入り • Test2::V0が使えるように • Test2::Harness (yath)はまだ

Slide 43

Slide 43 text

builtinのバージョンバンドル (5.39.4) builtinの組み込み関数をまとめて取り込めるようになりました use v5.39.4; use builtin ':5.40'; (今日の時点では true, false, indexed のみ)

Slide 44

Slide 44 text

locale対応の強化 (5.39.4) • 一部の環境でlocaleがスレッドセーフに • ストレステスト実施中 (5.39.5)

Slide 45

Slide 45 text

builtin::load_module (5.39.5) builtinに実験的な機能としてload_module関数が追加されました use v5.39.5; use builtin 'load_module'; use experimental 'builtin'; for my $module (keys $config->{prereq}->%*) { load_module $module; }

Slide 46

Slide 46 text

builtin::load_module (5.39.5) バージョン指定はVERSIONメソッドで use v5.39.5; use builtin 'load_module'; use experimental 'builtin'; for my $module (keys $config->{prereq}->%*) { load_module $module; if (my $version = $config->{prereq}{$module}) { $module->VERSION($version); } }

Slide 47

Slide 47 text

returnと間接オブジェクト (5.39.6) なんでもないコードに見えますが… use v5.38; use List::Util 'sum'; sub my_sum { return sum grep $_ > 0, @_ } say my_sum(-1, 2, 3); # 5

Slide 48

Slide 48 text

returnと間接オブジェクト (5.39.6) sumを取り込み忘れると、おかしなことに use v5.38; # use List::Util 'sum'; sub my_sum { return sum grep $_ > 0, @_ } say my_sum(-1, 2, 3); # *main::sum23

Slide 49

Slide 49 text

returnと間接オブジェクト (5.39.6) no bareword::filehandlesでも止められません (used only onceの警告が出るようにはなります) use v5.38; no bareword::filehandles; # use List::Util 'sum'; sub my_sum { return sum grep $_ > 0, @_ } say my_sum(-1, 2, 3); # *main::sum23

Slide 50

Slide 50 text

returnと間接オブジェクト (5.39.6) 5.39.6からは構文エラーになります use v5.39.6; # use List::Util 'sum'; sub my_sum { return sum grep $_ > 0, @_ } say my_sum(-1, 2, 3);

Slide 51

Slide 51 text

5.40に入るかもしれないもの • 5.36で導入されたbuiltin関数の多くが安定版に? • use VERSIONにbuiltinのバンドルも入る? • FOSDEMでは紹介されていましたが、コードフリーズの 時期的にどうなるか…

Slide 52

Slide 52 text

近い将来実装されそうな機能 • Proposed Perl Changes より https://github.com/Perl/PPCs • 実装担当者まで決まっていそうなもの

Slide 53

Slide 53 text

特殊変数の別名 うっかり読み込むと正規表現が遅くなってしまう Englishモジュールの代わりに local ${^ARG}; # $_ my $pid = ${^PID}; # $$ my $error = ${^EVAL_ERROR}; # $@ my %signals = %{^SIG}; # %SIG https://github.com/Perl/PPCs/blob/main/ppcs/ppc0014-english-aliases.md

Slide 54

Slide 54 text

文字列テンプレート "foo @{[$bar->baz]}"のようなハックはありますが… # No interpolation qt{Greetings}; # Simple scalar interpolation qt; # Interpolation of method calls qt"Greetings, {$user->title} {$user->name}"; # Interpolation of various expressions qt{It has been {$since{n}} {$since{units}} since your last login}; qt{...a game of {join q{$"}, $favorites->{game}->name_words->@*}}; https://github.com/Perl/PPCs/blob/main/ppcs/ppc0019-qt-string.md

Slide 55

Slide 55 text

条件付き矢印演算子 左辺が定義済みなら普通の矢印演算子、 未定義ならそこで処理を打ち切り全体をないものに # $val = defined $foo && defined $foo->{bar} ? $foo->{bar}[3] : (); $val = $foo?->{bar}?->[3]; # @vals = defined $aref ? $aref->@* : (); @vals = $aref?->@*; # note that @vals is (), not (undef). # my $class = 'SomeClass'; $class->new if defined $class; my $class = 'SomeClass'; $class?->new; https://github.com/Perl/PPCs/blob/main/ppcs/ppc0021-optional-chaining-operator.md

Slide 56

Slide 56 text

メタプログラミング metaモジュールを使った実験が始まっています use v5.14; use meta; my $metapkg = meta::get_package( "MyApp::Some::Package" ); $metapkg->add_symbol( '&a_function' => sub { say "New function was created" } ); MyApp::Some::Package::a_function(); https://metacpan.org/pod/meta https://github.com/Perl/PPCs/blob/main/ppcs/ppc0022-metaprogramming.md

Slide 57

Slide 57 text

メタプログラミング • いまは従来のオブジェクトを利用してAPIを固めて いるところ • APIが固まったら新しいクラスへの対応が入る予定 • その後ロールなどの実装に利用されていくはず

Slide 58

Slide 58 text

「実験」≠「未完成」 • 新しい機能は実験から • 事前に十分な議論はされているはず • 単に動くかどうかを試しているわけではない • 皆が気に入るかどうかを試している • 実際に試して、(PPCsの議論を踏まえた) フィードバックを

Slide 59

Slide 59 text

ツールチェーンのサポート下限 従来はPerl 5.8.1(2003/09)が下限でした https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md Lancaster Consensus (2013) Going forward, the Perl toolchain will target Perl 5.8.1, released September 2003. This will allow toolchain modules to reliably use PerlIO and improved Unicode support.

Slide 60

Slide 60 text

ツールチェーンのサポート下限 2023年4月のToolchain Summitで改正されました Lyon Amendment (2023) https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lyon-amendment.md No new release of a distribution in the Perl toolchain will specify a minimum perl prerequisite version (whether configure, build, runtime, or test) that has been available for less than ten years. 「リリース後10年未満のPerlをサポート下限とすることはない」

Slide 61

Slide 61 text

ツールチェーンのサポート下限 • いまは例外的に2012年リリースのPerl 5.16をサポート • 2024年6月にRHEL/CentOS 7が退役したら、 2014年リリースの5.20より古いPerlへのインストールは 保証されなくなっていきます • 今後は毎年無条件に上がっていくので、 CIなどで旧版のサポートをするときは要注意 • 古いPerlには古いバージョンのモジュールをインストール できるようにするという話も出てはいますが…

Slide 62

Slide 62 text

ツールチェインに限らず… すでに何人かの方がサポート下限のバージョンなどを 上げ始めています • IO::Socket::IP (5.14) • Test::Deep (5.12) • Email::Simple (5.12) • Plack (5.12) • DBD::mysql (5.001からはMySQL 5系がサポート外に)

Slide 63

Slide 63 text

粛々とメンテしていきましょう

Slide 64

Slide 64 text

その頃Rakuは… • Rigaで予定されていたカンファレンスは中止 (後にオンライン開催) • 6.eはいつ? • 6.cは2015年 • 6.dは2020年 • そろそろ…という話は出ている模様 • RakuASTの実装中 • Raku Core Summit (2023/06)

Slide 65

Slide 65 text

2024年の主要Perl関連イベント • German Perl/Raku-Workshop (4/15~17, Frankfurt, Germany) https://www.perl-workshop.de • Perl Toolchain Summit 2024 (4/25~28, Lisbon, Portugal) • The Perl and Raku Conference 2024 (6/25~27, Las Vegas, NV) https://tprc.us/tprc-2024-las/

Slide 66

Slide 66 text

Thank you