Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
7.1k

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

Avatar for Makamaka Hannyaharamitu

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大全の付録として掲載 パワーバランスが対等でない状況では 慎重にならなければならない 特定の集団を 扱ったモジュール