Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Acme、其はPerlのユグドラシル

5.4k

 Acme、其はPerlのユグドラシル

Makamaka Hannyaharamitu

March 05, 2022
Tweet

Transcript

  1. A. YAPC::Asia Tokyo 2006~2015 から B. YAPC::Japan 2016~ から SAPPORO(2016)

    OSAKA(2017) HAKATA(2017) ONNASON(2018) Tokyo(2019) C. 初めての参加
  2. # source/DCONWAY/Acme-Bleach-1.150/lib/Acme/Bleach.pm package Acme::Bleach; our $VERSION = '1.150'; my $tie

    = " ¥t"x8; sub whiten { local $_ = unpack "b*", pop; tr/01/ ¥t/; s/(.{9})/$1¥n/g; $tie.$_ } sub brighten { local $_ = pop; s/^$tie|[^ ¥t]//g; tr/ ¥t/01/; pack "b*", $_ } sub dirty { $_[0] =~ /¥S/ } sub dress { $_[0] =~ /^$tie/ } open 0 or print "Can't rebleach '$0'¥n" and exit; (my $shirt = join "", <0>) =~ s/(.*)^¥s*use¥s+Acme::Bleach¥s*;¥n//sm; my $coat = $1; my $pressed = '#line ' . ("$coat¥n" =~ tr/¥n/¥n/) . ' ' . (caller)[1] . "¥n"; local $SIG{__WARN__} = ¥&dirty; do {eval $coat . brighten $shirt; print STDERR $@ if $@; exit} unless dirty $shirt && not dress $shirt; open 0, ">$0" or print "Cannot bleach '$0'¥n" and exit; print {0} "${coat}use Acme::Bleach;¥n", whiten $pressed.$shirt and exit; __END__
  3. local $_ = unpack "b*", pop; tr/01/ ¥t/; open 0,

    ">$0"; print {0}; tr/ ¥t/01/; pack "b*", $_; 初回実行すると…… use Acme::Bleach されたスクリプト自身を読み込む use Acme::Bleach から後の行の文字列を2進数にして0ならスペース、1ならTABに変換 use Acme::Bleach されたスクリプト自身に書き出す 再度実行したときは元に戻して eval
  4. 同人活動 原生代 • 2007年冬コミ • 『マルチ中毒 vol.3』 • Acme::rion ……創聖のアクエリオン

    ED「オムナ マグニ」っぽいコードに変換 する Acme::Bleach系モジュール
  5. 同人活動 原生代 • 2007年冬コミ • 『マルチ中毒 vol.3』 • 他の執筆者が「論考談義 洞爺湖G8サミット」

    とか「ありがとう天元突破グレンラガン」など 真面目に書いているというのに……
  6. Python & Perlmons • Perl Monger になりきる TRPG • P&P……元ネタは

    D&D や T&T • Python 全く関係ない • D&Dにおけるゲームマスター =DM(ダンジョンマスター) • P&PではDM(ダン ザ マッチョ)
  7. package Acme::LifeUniverseEverything; use overload; my %ops; $ops{'0+'} = $ops{'""'} =

    sub { ${ $_[0] } }; $ops{'*'} = sub { my $val = (($_[0]==6 && $_[1]==9) || ($_[0]==9 && $_[1]==6)) ? 42 : ("$_[0]" * $_[1]); Acme::LifeUniverseEverything->new($val); };
  8. # 光の三原色 $c = Acme::Colour->new("black"); $colour = $c->colour; # black

    $c->add("red"); # red $c->add("green"); # yellow # 絵具の三原色 $c = Acme::Colour->new("white"); $c->mix("cyan"); # cyan $c->mix("magenta"); # blue
  9. # Acme::Orange $colour = $c->colour("pink"); # orange $c->add("blue"); # orange

    # なにやってもオレンジにしかならない # London.pm のシンボルカラー
  10. use Acme::Octarine; # (架空の)octarine 色が使える use Acme::Colour; $c = Acme::Colour->new("octarine");

    # black # ついでに new するたびにランダムに # Acmeモジュールがインストールされる
  11. # Acme::Octarine # エグいハック(コピペ良くないという理由) use B::Deparse; use PadWalker 'closed_over'; my

    $deparse = B::Deparse->new("-sC"); my $body = $deparse ->coderef2text( ¥&Acme::Colour::new ); my $r = closed_over(¥&Acme::Colour::new)->{'%r'};
  12. goto LABEL -> LABEL goto &sub -> sub LABEL ->

    comefrom LABEL sub() -> comefrom &sub comefrom が複数あると fork されて実行
  13. use 5.010; use Acme::ComeFrom; sub func { say @_ }

    func("Start"); # 実行されると comefrom func 行にジャンプ say "ここは表示されない"; # 上の func() で下の comefrom func に飛んだので comefrom &func; say "Branch 1"; exit; comefrom &func; say "Branch 2"; # 片方は exit して終了、もう一方は処理続行 (forkされる) LABEL: say "ここも表示されない"; # comefrom label へ comefrom LABEL; say "Branch 3"; exit; comefrom LABEL; say "Branch 4"; # 片方は exit して終了、もう一方は処理続行 (forkされる) EXPR0: say "ONE"; exit; # 実行されて下の行にジャンプするかもしれないし、しないかもしれない comefrom 'EXPR' . int(rand(2)); say "ZERO"; # ランダムに EXPR0 か EXPR1 になる # EXPR0 なら say "ONE"; exit; が飛ばされ say "ZERO"; に。EXPR1 なら存在しないので say "ONE"; exit; が実行される
  14. use Acme::BeyondPerl::ToSQL ("dbi:SQLite:dbname=acme_db","",""); my $value = 5; print 2 +

    $value , "¥n"; # 7 print 1.2 - 0.2 , "¥n"; # 1 print 9 / 2 , "¥n"; # 4.5 # DEBUG MODE # use Acme::BeyondPerl::ToSQL ({ # dbi => ["dbi:SQLite:dbname=acme_db","",""], debug => 1, # }); # # SELECT 2.0 + 5.0 # SELECT 1.2000000000000000 - 0.2000000000000000 # SELECT 9.0 / 2.0
  15. use Acme::BeyondPerl::ToSQL ("dbi:Pg:dbname=$dbname;host=$host", $user, $pas,"",""); my $value = 5; print

    2 + $value , "¥n"; # 7 print 1.2 - 0.2 , "¥n"; # 1 print 9 / 2 , "¥n"; # 4.5 # DEBUG MODE # use Acme::BeyondPerl::ToSQL ({ # dbi => ["dbi:Pg:dbname=$dbname;host=$host", $user, $pass], debug => 1, # }); # # SELECT CAST(2 AS double precision) + CAST(5 AS double precision) # SELECT CAST(1.2 AS double precision) - CAST(0.2 AS double precision) # SELECT CAST(9 AS double precision) / CAST(2 AS double precision)
  16. Michael G Schwern "How Not To Highlight Women In Perl"

    特定の集団を 扱ったモジュール
  17. Michael G Schwern "How Not To Highlight Women In Perl"

    → 翻訳をAcme大全の付録として掲載 特定の集団を 扱ったモジュール
  18. Michael G Schwern "How Not To Highlight Women In Perl"

    → 翻訳をAcme大全の付録として掲載 パワーバランスが対等でない状況では 慎重にならなければならない 特定の集団を 扱ったモジュール