Slide 1

Slide 1 text

2024年秋のPerl Kenichi Ishigaki @charsbar YAPC::Hakodate 2024 Oct 5, 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 2024年秋のPerl@YAPC::Hakodate <- イマココ

Slide 3

Slide 3 text

Perl Toolchain Summit 2024 • 今年はリスボンで開催 • 私は引き続きPAUSE中心 • Japan Perl Association が スポンサーに (ありがとうございます) https://charsbar.hatenadiary.org/entry/2024/05/27/222017

Slide 4

Slide 4 text

Perl Toolchain Summit 2024 • PAUSEのサーバが新しく • デッドロック解消 • classのバージョンを認識 するようになりました • 日本語担当も…

Slide 5

Slide 5 text

CPANをより安全に • という運動が始まっています(既報の通り) • 欧米でのセキュリティ関連法制の影響 • CPAN Security Group

Slide 6

Slide 6 text

CVE-2023-31486 • HTTP::Tinyの証明書チェックがデフォルト無効になっていた • 昨年 CPAN.pm など随所に影響を及ぼしました • NVD のスコアは 8.1 High https://nvd.nist.gov/vuln/detail/CVE-2023-31486

Slide 7

Slide 7 text

CVE-2024-45321 • 今度は cpanm に CVE が発行されてしまいました • NVDのスコアは 9.8 Critial !? https://nvd.nist.gov/vuln/detail/CVE-2024-45321

Slide 8

Slide 8 text

CVE-2024-45321 • いまでも http 経由の通信を行っている • 何か新しい問題が見つかったわけではなく、 これまでの慣習にダメ出しが出た

Slide 9

Slide 9 text

CVE-2024-45321 パッチは用意されています • https://github.com/miyagawa/cpanminus/pull/674 • https://github.com/miyagawa/cpanminus/pull/678 が、まだ当たっていません

Slide 10

Slide 10 text

CVE-2024-45321 • 99% 大丈夫だけど、残り 1% の CI が壊れるんじゃないか • SSL in core が実現したら別だけど、いま安全側に倒しすぎて 大丈夫なのか • --insecure フラグを用意したらどうか • …というところで話が止まっている

Slide 11

Slide 11 text

CVE-2024-45321 • パッチを当てたら Perl 5.22 以前の環境で問題に なったという話も https://github.com/shogo82148/actions-setup-perl/issues/1920 • 古い環境では問題になりがち

Slide 12

Slide 12 text

CVE-2024-45321 • 後方互換性はもちろん大事なんですが • 壊れても、必要な人は直してくれる(…といいなあ) • もう使っていない人々を待っていても仕方がない • …というのが最近の流れではある

Slide 13

Slide 13 text

CVE-2024-45321 どうするか • 更新を待つ • 自分でパッチを当ててしまう • クライアントを切り替える • --from オプションを利用する

Slide 14

Slide 14 text

CVE-2024-45321 待つのもひとつの選択肢 • Carton などにも同じ問題がある • いずれはパッチが当たるだろうからそれを待つ • CI で利用する公式イメージなどにはすでにパッチ 適用されているはず

Slide 15

Slide 15 text

CVE-2024-45321 • 多くのサイトでは http から https にリダイレクトされる • いくつか例外的なサイトがある • backpan.perl.org • cpanmetadb.org • バージョン固定すると危険性が高くなる

Slide 16

Slide 16 text

CVE-2024-45321 自分でパッチを当ててしまう • PRをチェックアウトして自前でビルドしてもよいですが… • インストール済みの cpanm を書き換えるのが楽 perl -pi -E 's{http://(www¥.cpan¥.org|backpan¥.perl¥.org|cpan¥.metacpan¥.org| fastapi¥.metacpan¥.org|cpanmetadb¥.plackperl¥.org)}{https://$1}g' /path/to/cpanm https://security.metacpan.org/2024/08/26/cpanminus-downloads-code-using-insecure-http.html

Slide 17

Slide 17 text

CVE-2024-45321 パッチを当てるなら… • まずは curl か wget を入れておく • エラーが出るときは --no-lwp を活用する (特に古い環境)

Slide 18

Slide 18 text

CVE-2024-45321 クライアントを置き換える • 昔ながらの CPAN.pm か、cpm か • 使い勝手はそれぞれ異なるのでお好みで

Slide 19

Slide 19 text

CVE-2024-45321 --from オプションを利用する • バージョンを固定した(古いバージョンの)インストールが できなくなるので要注意 • DarkPAN からのインストールならそれもありですが…

Slide 20

Slide 20 text

ツールチェインのサポート下限 「リリース後10年未満のPerlをサポート下限と することはない」と改正されました(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.

Slide 21

Slide 21 text

ツールチェインのサポート下限 先日まではひとつ制限事項がありました https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lyon-amendment.md As a special one-time exception, the minimum perl requirement on these distributions will not move past v5.16.0 until July 2024, when Red Hat Enterprise Linux and CentOS v7 leave their maintenance support phase, even though v5.16.0 was released more than 10 years ago today.

Slide 22

Slide 22 text

ツールチェインのサポート下限 • RHEL/CentOS 7 が退役し、例外事項がなくなりました • 2014年5月リリースの Perl 5.20 を下限にできます • 以下の実験的機能がツールチェーンに解禁されました • サブルーチンシグネチャ • ポストフィックスデリファレンス ($HASH->%*, $ARRAY->@*)

Slide 23

Slide 23 text

ツールチェインのサポート下限 Lyon Amendment の落とし穴: Amazon Linux 2 Q:Amazon Linux 2 のサポートはいつ終了するのですか? Amazon Linux 2 のサポート終了日 (EOL、End of Life) は、次の バージョンへの移行に十分な時間を提供するために、2023 年 6 月 30 日から 2025 年 6 月 30 日に 2 年間延長されました。 https://aws.amazon.com/jp/amazon-linux-2/faqs/

Slide 24

Slide 24 text

どのあたりまでサポートすればよい? 最近のディストリビューションに入っているPerlの例 • Ubuntu noble • Fedora 40 • Debian bookworm • Rocky Linux 9 • Amazon Linux 2023 5.38.2 5.38.2 5.36.0 5.32.1 5.32.1

Slide 25

Slide 25 text

Perl の安定版は 5.40 に • 2024/06/09リリース • 駆け込みであれこれ入っています

Slide 26

Slide 26 text

多くの実験的機能が正式化 • 基本的には2年間追加の修正がなければ 安定したとみなされます

Slide 27

Slide 27 text

try/catch (5.34~) 基本の try/catch は正式な機能に 格上げされました use feature qw(try); try { ... } catch ($e) { ... }

Slide 28

Slide 28 text

try/catch (5.34~) 5.40 のバンドルにも追加されています use v5.40; try { ... } catch ($e) { ... }

Slide 29

Slide 29 text

try/catch (5.34~) finally (5.36~) はまだ実験中です use experimental qw(try); try { ... } catch ($e) { ... } finally { ... } 5.38でgotoに関する修正が入っています

Slide 30

Slide 30 text

for と複数のループ変数 (5.36~) 単純な例なら keys を呼ばなくてもよくなります for my ($key, $value) (%ENV) { say "$key: $value"; }

Slide 31

Slide 31 text

for と複数のループ変数 (5.36~) 配列の場合は indexed 関数で use builtin qw(indexed); for my ($i, $value) (indexed @ENV) { say "$i: $value"; }

Slide 32

Slide 32 text

builtinモジュール (5.36~) バージョンバンドルが実装されました use builtin qw(:5.40); # 前回発表時点では true、false、indexed のみ

Slide 33

Slide 33 text

builtinモジュール (5.36~) 5.40の時点ではさらに増えています use builtin qw(:5.40); # true false indexed # weaken unweaken is_weak # blessed refaddr reftype # ceil floor is_tainted trim

Slide 34

Slide 34 text

builtinモジュール (5.36~) 一部の関数はまだ実験状態です use experimental qw(builtin); use builtin ( 'is_bool', # 5.36~ 'export_lexically', # 5.38~ 'created_as_string', # 5.38~ 'created_as_number', # 5.38~ );

Slide 35

Slide 35 text

builtinモジュール (5.36~) 5.40で新たに追加された関数 use experimental qw(builtin); use builtin qw( inf nan stringify load_module );

Slide 36

Slide 36 text

builtin::load_module Module::Runtime::use_module などのかわりに use experimental qw(builtin); use builtin qw(load_module); my $foo = load_module('Foo')->new;

Slide 37

Slide 37 text

builtin::load_module バージョン指定はできません use experimental qw(builtin); use builtin qw(load_module); use Module::Runtime qw(use_module); ○use_module('Foo::Bar', '1.00')->new; ×load_module('Foo::Bar', '1.00')->new; ○load_module('Foo::Bar')->VERSION('1.00');

Slide 38

Slide 38 text

builtin::load_module require との比較 use experimental qw(builtin); use builtin qw(load_module); ○require v5.40; ○require CGI; ○require './jcode.pl'; ×load_module(v5.40); ×load_module(CGI); ×load_module('./jcode.pl');

Slide 39

Slide 39 text

builtinモジュールとスコープ 基本的にはレキシカルスコープです { use builtin qw(load_module); my $obj = load_module('Foo::Bar')->new; } # ここでは load_module は使えません

Slide 40

Slide 40 text

builtinモジュールとスコープ 完全修飾名付きで呼ぶことはできます use experimental qw(builtin); { use builtin qw(load_module); my $obj = load_module('Foo::Bar')->new; } builtin::load_module('Bar::Baz')->new;

Slide 41

Slide 41 text

builtinモジュールとスコープ no builtin ... はできません (警告が出ます) { use builtin qw(load_module); my $obj = load_module('Foo::Bar')->new; # no builtin qw(load_module); }

Slide 42

Slide 42 text

builtin と use VERSION 正式機能になった builtin 関数は use v5.40 でまとめて使えるようになります use v5.40; # use builtin qw(true); say true;

Slide 43

Slide 43 text

use VERSION の制約 use v5.40 済みのスコープではそれ以下の バージョン指定をするとエラーになります use v5.40; ... ×use v5.38; ...

Slide 44

Slide 44 text

use VERSION の制約 一般化して、use VERSION 済みのスコープで 5.10以下のバージョン指定をするとエラー use v5.38; ... ×use v5.10; ...

Slide 45

Slide 45 text

use VERSION の制約 それ以外のダウングレードでは警告が出ます (5.44でエラーになる予定です) use v5.38; ... use v5.20; # 警告が出ます ...

Slide 46

Slide 46 text

クラス (5.38~) • まだ実験中 • 少しずつですが実装は進んでいます • 確実に実現できるところのみ • metaの実験が済んだらいろいろ入るはず

Slide 47

Slide 47 text

__CLASS__キーワード $selfが使えない場所で使うと便利? use v5.40; use experimental qw(class); 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; }

Slide 48

Slide 48 text

__CLASS__キーワード methodはインスタンスからは呼べないので要注意 use v5.40; use experimental qw(class); 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 49

Slide 49 text

新しいフィールド属性 :reader 属性がコアに入りました use v5.40; use experimental qw(class); class Author { field $name :param :reader; } my $author = Author->new(name => 'me'); say $author->name;

Slide 50

Slide 50 text

:writerは? • まだコア入りしていません • Object::Padとの互換性と理想との間で揺れている • 書き込み用のアクセサより代入可能なメソッドの方が… $obj->count($obj->count+1); $obj->count++; ... $obj->name($obj->name =~ s/foo/bar/r); $obj->name =~ s/foo/bar/; ...

Slide 51

Slide 51 text

ちなみにObject::Padでは… • 昔ながらのhasキーワードがなくなりました • 無名クラスの実験が始まっています

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

^^ 演算子 && や || と同じ優先順位の論理演算子がひとつ増えました if ($x ^^ $y) { ... } if ($x xor $y) { ... } $x ^^ $y and return;

Slide 54

Slide 54 text

-M コマンドラインオプション -M とモジュール名の間に空白を入れられるように $ perl -M Data::Dumper -E 'say Dumper(...)'

Slide 55

Slide 55 text

非互換な機能変更 非互換な変更が入った機能がいくつかあります

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

5.42に向けて • 開発中の機能 • 議論中の機能 • この先大きく変わる可能性もあり • あくまでも現時点での話ということで

Slide 61

Slide 61 text

CORE::chdir (5.41.1) chdirをCORE付きで呼び出せるようになりました use experimental 'class'; class MyClass { method chdir { my $path = shift; &CORE::chdir($path) or return; say STDERR "CHDIR TO $path"; } }

Slide 62

Slide 62 text

source::encoding (5.41.2) ソースコードのエンコーディングを強制できるようになりました use source::encoding 'ascii'; say 'あああ'; # コンパイルエラー

Slide 63

Slide 63 text

source::encoding (5.41.2) use v5.41 (以降)でアスキーが強制されます use v5.41; say 'あああ'; # コンパイルエラー

Slide 64

Slide 64 text

source::encoding (5.41.2) コメントや POD でも容赦しません use v5.41; # コメントで回避できる? # NG =pod NAME 取扱説明書 # NG =cut

Slide 65

Slide 65 text

source::encoding (5.41.2) __DATA__ や __END__ 以降は OK use v5.41; # ASCII ONLY __END__ =pod NAME 取扱説明書 # OK =cut

Slide 66

Slide 66 text

source::encoding (5.41.2) 指定できるのは ascii と utf8 のみ use source::encoding 'utf8'; # ≒use utf8; STDOUT->binmode('utf8'); say 'あああ'; # utf8 なら OK

Slide 67

Slide 67 text

source::encoding (5.41.2) no source::encoding で強制を解除できます use v5.41; no source::encoding; say 'あああ'; # utf8 でなくても OK

Slide 68

Slide 68 text

source::encoding (5.41.2) 特定のスコープのみの指定・解除もできます use v5.41; package Foo { no source::encoding; say 'あああ'; # OK } # say 'あああ'; # NG

Slide 69

Slide 69 text

アポストロフィとパッケージ (5.41.3) アポストロフィがパッケージ区切りに使えなくなります # Invalid version format (non-numeric data) package Acme::Don't;

Slide 70

Slide 70 text

アポストロフィとパッケージ (5.41.3) • ただし、それなりに悪影響があるということで、 善後策が検討されています • Test::More::isn't (Module::Installが同梱) • DBIx::Class のテストがこける

Slide 71

Slide 71 text

スマートマッチ (5.41.3) こちらもついに削除されたのですが… • アポストロフィ以上の悪影響 • 同じく善後策が検討されています • given/when はもともと feature ガード • ~~も同じようにガードする?

Slide 72

Slide 72 text

スマートマッチの代替案 最近またいくつか出てきました • Switch::Back (5.36以降) • Switch::Right (5.36以降) • Syntax::Infix::Smartmatch (5.14以降)

Slide 73

Slide 73 text

近い将来実装されそうな機能 • Proposed Perl Changes https://github.com/Perl/PPCs • Perl in 2030 https://act.yapc.eu/lpw2024/talk/7904

Slide 74

Slide 74 text

この先の主要Perl関連イベント • London Perl and Raku Workshop (10/24, London, England) • German Perl/Raku Workshop 2025 (詳細未定) • Perl Toolchain Summit 2025? (詳細未定) • The Perl and Raku Conference 2025???

Slide 75

Slide 75 text

Questions?

Slide 76

Slide 76 text

Thank you