Slide 1

Slide 1 text

:"1$'VLVPLB גࣜձࣾ͸ͯͳIJUPEF ʮόΠϒε੩తղੳʯͰ ϨΨγʔίʔυΛ෼ੳɾվળ͠Α͏ 

Slide 2

Slide 2 text

IJUPEF CMPHTVTIJNPOFZ      ೥͔Β:"1$Ͱ੩తղੳͷ࿩Λ͍ͯ͠Δ͕੩తղੳ༑ୡ͕૿͑ͳ͍ͷ͕೰Έ

Slide 3

Slide 3 text

օ͞ΜͷϓϩμΫτ ࢖͍ͬͯͳ͍ίʔυ ຾͍ͬͯ·ͤΜ͔ʁ 

Slide 4

Slide 4 text

ϓϩδΣΫτઐ༻ͷ੩తղੳπʔϧΛ࡞ͬͯສߦ࡟আʹ੒ޭ "*Λ࢖ͬͯɺ੎͍ͰπʔϧΛ։ൃ͠ɺྫྷ੩ʹίʔυΛফ͢ ʮόΠϒε੩తղੳʯͱ໊෇͚ͯ঺հ 

Slide 5

Slide 5 text

1FSMͷ੩తղੳ ඵͰ͓͞Β͍ 

Slide 6

Slide 6 text

‘;’ ߏจ໦ ‘print’ ‘ ‘ List ‘ ‘ ‘ ‘ ‘1’ ‘ ‘ ‘*’ ‘ ‘ ‘2’ ‘+’ ‘3’ Statement Document print (1 * 2) + 3; 

Slide 7

Slide 7 text

‘;’ ߏจ໦ ‘print’ ‘ ‘ Statement Document print "(1 * 2) + 3"; ‘"(1 * 2) + 3"’ 

Slide 8

Slide 8 text

11*Ͱߏจ໦ݟ͍ͨ print (1 * 2) + 3; 11*%PDVNFOU 11*4UBUFNFOU 11*5PLFO8PSEQSJOU 11*5PLFO8IJUFTQBDF 11*4USVDUVSF-JTU   11*4UBUFNFOU&YQSFTTJPO 11*5PLFO/VNCFS 11*5PLFO8IJUFTQBDF 11*5PLFO0QFSBUPS  11*5PLFO8IJUFTQBDF 11*5PLFO/VNCFS 11*5PLFO8IJUFTQBDF 11*5PLFO0QFSBUPS  11*5PLFO8IJUFTQBDF 11*5PLFO/VNCFS 11*5PLFO4USVDUVSF 11*5PLFO8IJUFTQBDFaO use PPI; use PPI::Dumper; my $document = PPI::Document->new($ARGV[0]); my $dumper = PPI::Dumper->new($document); $dumper->print; 

Slide 9

Slide 9 text

ͱ͖͸೥ 

Slide 10

Slide 10 text

ਓྨ͸ੜ੒"*Λ࢖ͬͯ ίʔυΛॻ͖׵͍͑ͯͨ ͔͠͠ ݁Ռͷଥ౰ੑ͕Α͘Θ͔Βͳ͍ ظ଴௨Γʹಈ͔ͳ͍ ͏·͘࢖͍͜ͳͤͳ͍ 

Slide 11

Slide 11 text

"*ͷίʔυॻ͖׵͑ɺௐࠪΛ৴པͰ͖ͳ͍ཧ༝ ॻ͖׵͑ͨ݁Ռͷଥ౰ੑΛௐ΂Δํ๏͕ࣗ໌Ͱͳ͍ ϓϩδΣΫτݻ༗ͷࣄ৘͸൚༻తͳ"*ʹ͸ݟ͑ͳ͍ ͳͷͰɺϓϩδΣΫτݻ༗ͷ੩తղੳπʔϧΛ࡞ΒͤΑ͏ 

Slide 12

Slide 12 text

όΠϒε੩తղੳ  7JCFDPEJOH "*Ͱ੎͍Α͘ΞϓϦέʔγϣϯΛ։ൃʢ"OESFK,BSQBUIZʣ όΠϒε੩తղੳ "*Ͱ੎͍Α͘੩తղੳπʔϧΛ։ൃʢ଄ޠʣ

Slide 13

Slide 13 text

όΠϒε੩త։ൃͯ͠ΈΑ͏ ਖ਼نදݱΛ࢖ͬͯιʔείʔυͷґଘؔ܎Λௐ΂ɺ ෆཁϑΝΠϧΛྻڍ͢ΔεΫϦϓτΛ࣮૷͍ͯͩ͘͠͞ɻ ਖ਼نදݱΛ࢖ͬͯιʔείʔυͷґଘؔ܎Λௐ΂ɺ ࢦఆͨ͠ϑΝΠϧʹґଘ͢ΔϑΝΠϧΛπϦʔදࣔ͢Δ εΫϦϓτΛ࣮૷͍ͯͩ͘͠͞ɻ ਖ਼نදݱΛ࢖ͬͯιʔείʔυ಺ʹॻ͖๨ΕͨVTFΛ ݕग़͢ΔςετΛ࣮૷͍ͯͩ͘͠͞ɻ 

Slide 14

Slide 14 text

7JCFDPEJOH74όΠϒε੩తղੳ 7JCFDPEJOHͷߟ͑Ͱ੩తղੳπʔϧΛ։ൃ͢ΔࢼΈ  7JCFDPEJOH όΠϒε੩తղੳ ։ൃεϐʔυ ˕ߴ଎ ˕ߴ଎ ݕূՄೳੑ ☓ಈ͔ͯ͠ΈΔ·Ͱෆ໌ ̋ਓ͕ؒղऍՄೳͳܗͷग़ྗΛٻΊΔ อकੑ ˚ਓؒ͸ιʔείʔυΛಡΊͳͯ͘΋͍͍ ̋յΕͯ΋௚ͤΔܗʹཹΊΔ ର৅ ͳΜͰ΋ ιʔείʔυղੳ ιʔείʔυॻ͖׵͑

Slide 15

Slide 15 text

੩తղੳ74όΠϒε੩తղੳ ಘҙɾෆಘҙ͸͋Δ͕ɺର৅ྖҬʹΑͬͯ͸͏·͍͘͘  ੩తղੳ όΠϒε੩తղੳ ର৅ൣғ ˕ߏจ໦ͱͯ͠ਖ਼͘͠ύʔε ͍͔ͳΔه๏ʹ΋ରԠՄೳ ☓ίʔυϕʔε಺ͷه๏ͷΈѻ͏ ඼࣭ ˕ੑ্࣭ɺޡ࡞ಈ͸ڐ༰͞Εͳ͍ ඼࣭ॏࢹͷखݎ͍։ൃ ☓ࣗݾ੹೚Ͱ։ൃ յΕͨΒࣗ෼ͨͪͰ௚͢ɺࣺͯΔ อकੑ ˚ߏจ໦Λର৅ͱͨ͠"1*ͷशಘ͕ඞཁ ̋ਖ਼نදݱͳͷͰ ߏจ໦ʹ໌Δ͘ͳ͍ϝϯόʔͰ΋ѻ͑Δ ࣮ߦ࣌ؒ ☓࣮ߦ͕࣌ؒ໰୊ͱͳΔ͜ͱ΋ ϑΥʔϚολద༻ʹ਺෼ͳͲ ˕ສߦͷղੳ΋਺ඵ

Slide 16

Slide 16 text

ϓϩδΣΫτઐ༻ͷ੩తղੳπʔϧͷٕज़બఆ ϓϩδΣΫτ಺Ͱ࢖ΘΕ͍ͯΔه๏͸ݶΒΕ͍ͯΔͷͰɺ ݴޠͰѻ͑Δ͢΂ͯͷه๏Λѻ͑Δඞཁ͸ͳ͍ɻ ਖ਼نදݱͰύʔε͢Δ͚ͩͰ΋ɺ໾ʹཱͭ΋ͷΛ࡞ΕΔɻ ڊେͳίʔυϕʔεʹਖ਼نදݱ͚ͩͰ ཱͪ޲͔͏ͱʮ੎͍ʯʮόΠϒεʯ͕ੜ·ΕΔɻ 

Slide 17

Slide 17 text

σουίʔυΛফͦ͏ 

Slide 18

Slide 18 text

σουίʔυͷ୳͠ํ ΞϓϦέʔγϣϯͷىಈͷى఺ͱͳΔɺΤϯτ ϦϙΠϯτΛܾΊΔ 8FCΞϓϦͳΒBQQQTHJ $-*πʔϧͳΒCJO΍TDSJQU DSPOUBCͷઃఆ ΤϯτϦϙΠϯτ͔Βґଘ͢ΔϑΝΠϧΛ୧Δ Ͳ͔͜Β΋౸ୡͰ͖ͳ͚Ε͹σουίʔυ  🧟 📃 📃 📃 📃 📃 📃 📃 FOUSZQPJOU FOUSZQPJOU "DUJWFDPEF "DUJWFDPEF "DUJWFDPEF "DUJWFDPEF "DUJWFDPEF %FBEDPEF

Slide 19

Slide 19 text

͜ͷίʔυফͤ·͔͢ʁ ِӄੑɺِཅੑͰߟ͑Δ  ҙຯ ى͜Δ͜ͱ ِӄੑ ݟಀ͠ ຊ౰͸ফͤΔͷʹʮফͤͳ͍ʯͱ൑அ σουίʔυ͸࢒Δ ػೳఏڙ্໰୊ͳ͠ ِཅੑ ޡݕ஌ ຊ౰͸ফͤͳ͍ͷʹʮফͤΔʯͱ൑அ ඞཁͳίʔυΛফͯ͠͠·͏ ෆ۩߹ɺো֐ൃੜ ِӄੑ͸ڐ༰ɺِཅੑ͸ආ͚Δ ׬ᘳΛ໨ࢦͣ͞ɺ࣮֬ʹݕग़Ͱ͖ΔՕॴʹߜΔ

Slide 20

Slide 20 text

͞·͟·ͳґଘͷܗ ൚༻πʔϧଆͰ͢΂ͯରԠ͢Δͷ͸೉͍͠  use, require # ར༻ use parent # ܧঝ with, extends # Moose, MouseͳͲ࢖͍ͬͯΔ৔߹ # δϣϒΩϡʔ΁packageΛࢦఆͯ͠ΤϯΩϡʔ Worker->insert_job('MyApp::PublishEntry', {id => $entry_id}); # crontab͔ΒδϣϒΩϡʔʹΤϯΩϡʔ */1 * * * * root perl insert-worker-job.pl --job 'MyApp::PublishScheduledEntry' # ϧʔςΟϯά༻DSLΛ࢖ͬͯControllerΛࢦఆ GET '/' => 'MyApp::Controller::Root#index_html'; # `MyApp::Model::Entry`ͳͲ͕ಈతϩʔυ͞ΕΔ $c->model('Entry')->search({id => $entry_id}); # `MyApp::Controller::`ҎԼΛ͢΂ͯϩʔυ Module::Find::useall 'MyApp::Controller';

Slide 21

Slide 21 text

σουίʔυͷҰੜ  🤖ίʔυ࡟আ 🤖ௐࠪ݁ՌΛఴ͑ͯ13Խ 🧐$*ίʔυϨϏϡʔ 🫣ϚʔδɾϦϦʔε 🤖εΫϦϓτ࣮૷ 🤖εΫϦϓτ࣮ߦ 🤖σουίʔυ ީิൃݟ 🤖୳ࡧϧʔϧௐ੔ 😀࡟আՄೳͱ൑அ 😅ෆඋ͋Γ 🤖Ϩϙʔτ 🤖HJUHSFQHJUMPH Ϩϙʔτ࡞੒ 😵💫σουίʔυ ࡟আΛࢥཱ͍ͭ 🤨ܦҢ֬ೝ

Slide 22

Slide 22 text

ӡ༻தϓϩμΫτͰൃݟͨ͠σουίʔυྫ ط஌ͷσουίʔυ ഇࢭࡁΈػೳͷίʔυΛɺϨϙʔτΛݟͳ͕Βண࣮ʹ࡟আ ະ஌ͷσουίʔυ ։ൃதʹ࡞͕ͬͨɺ࢖Θͳ͔ͬͨίʔυΛ࡟আ ౰ॳ͸࢖͍͕ͬͯͨɺύϑΥʔϚϯενϡʔχϯάͰ࢖Θͳ͘ͳͬͨίʔυΛ࡟আ ࣮૷ऀʹϨϏϡʔґཔ͢Δͱɺ౰࣌Λͳ͔ͭ͠ΜͰ΋Β͑Δ ໿1VMM3FRVFTUɺ໿ສߦͷ࡟আʹ੒ޭ 

Slide 23

Slide 23 text

 IUUQTHJUIVCDPNQFSMEPDKQQFSMEPDKQQVMM ಉ͡ख๏ͰQFSMEPDKQͰσουίʔυൃݟ ߦͷ࡟আʹ੒ޭ sub extract_used_packages { my $file = shift; my @packages; open my $fh, '<', $file or return (); while (<$fh>) { # use Package if (/^\s*use\s+([\w:]+)/) { push @packages, $1; } # use parent qw/Package1 Package2/ if (/^\s*use\s+parent\s+qw[\/\(]([^\/\)]+)[\)\/]/) { push @packages, split /\s+/, $1; } # use parent 'Package' if (/^\s*use\s+parent\s+['"]([^'"]+)['"]/) { push @packages, $1; } # Package->method if (/([\w:]+)->\w+/) { push @packages, $1 if $1 =~ /::/; } } close $fh; return @packages; }

Slide 24

Slide 24 text

σουίʔυ࡟আͷͨΊͷαϒίϚϯυ $MBVEF$PEF༻ͷαϒίϚϯυͱͯ͠༻ҙ͓ͯ͘͠ ͲͷϦϙδτϦͰ΋͍͖ͳΓσουίʔυΛ୳࢝͠ΊΒΕΔ dDMBVEFDPNNBOET fi OEVOVTFEQNNEʹ഑ஔ $MBVEF$PEFͰ fi OEVOVTFEQN ϓϩϯϓτͷ.BSLEPXO಺͔ΒεΫϦϓτΛෳ੡ͯ͠ௐࠪ։࢝ IUUQTHJTUHJUIVCDPNIJUPEFDFDCEDDEBGBD 

Slide 25

Slide 25 text

ͦͷ΄͔ͷ׆༻ 

Slide 26

Slide 26 text

աڈʹॻ͍ͨਖ਼نදݱͷ඼࣭վળ ʮVTFͯ͠ͳ͍ͷʹϝιουΛݺͼग़͠ʯΛ ਖ਼نදݱͰ୳͢ςετΛखॻ͖͍ͯͨ͠ όΠϒε੩తղੳͷߟ͑Λ࢖ͬͯݟ௚͍ͨ͠  # use͔ͯ͠Βϝιουݺͼग़͠ use MyApp::Redis; my $redis = MyApp::Redis->connect; # ͍͖ͳΓϝιουݺͼग़͢͠Δͷ͸use࿙Ε(ݕग़ର৅) my $redis = MyApp::Redis->connect;

Slide 27

Slide 27 text

աڈʹॻ͍ͨਖ਼نදݱͷ඼࣭վળ "*ʹ11*൛Λ࣮૷ͯ͠΋Β͍ਖ਼ղσʔλͱͯ͠ར༻͠ɺ ਖ਼نදݱ൛Λௐ੔ ਖ਼نදݱ൛Λࢀߟʹ11*൛Λ࣮૷ Ҏલ͔Β͋ͬͨόάΛൃݟͰ͖ͨ ͔࣮͠͠ߦ࣌ؒ͸ഒʹʢඵఔ౓ˠඵʣ ਖ਼نදݱ൛Λσόοάͯ͠΋Β͍ɺ࣮ߦ࣌ؒඵͷ··11*ͱಉ݁͡ՌΛग़ͤΔΑ͏ʹ ඪ४Λਖ਼نදݱ൛ͱͭͭ͠ɺ྆ํͷ࣮૷Λ࢒͓͍ͯͯ͠ɺࠓޙ΋ո͍͠ͱ͖ʹ͸݁ՌΛൺ΂ΒΕΔΑ͏ʹ #"$,&/%3&(&9c11*Ͱ੾Γସ͑ ࣮ߦ࣌ؒΛม͑ͣਫ਼౓Ξοϓɺ඼࣭վળ੒ޭ 

Slide 28

Slide 28 text

όΠϒεࣦഊࣄྫ 

Slide 29

Slide 29 text

5FTUͷDBMMॻ͖๨Εςετ 5FTUͷPCKFDUςετͰɺ DBMMॻ͖๨ΕΛݕ஌͢ΔςετΛ11*Ͱ༻ҙ͍ͯͨ͠ # OK is $user, object { call age => 30; }; # NG is $user, object { age => 30; }; ࣮ߦ࣌ؒɿඵ ಉ݁͡ՌΛฦ͢ಉ͡ਖ਼نදݱ൛Λ։ൃͰ͖Ε͹ߴ଎Խͯ͠͏Ε͍͠ 

Slide 30

Slide 30 text

5FTUͷDBMMॻ͖๨Εςετ ࢼ͕ͨ͠ɺ͏·͍͔ͣ͘ ࣅͨΑ͏ͳ݁Ռ͸ಘΒΕΔ͕11*൛ͱݕ஌Օॴ͕ҟͳΔ # ωετͨ͠object is $user, object { call parent => object { call age => 60; }; call age => 30; }; ωετͨ͠ߏ଄ʢA\^AɺA<>AͳͲʣ͸ਖ਼نදݱͰ͸ਖ਼֬ʹѻ͑ͳ͍ VTFSFRVJSF͸ωετͷͳ͍୯७ͳߏ଄ͳͷͰਖ਼نදݱͰѻ͑Δ PCKFDUϒϩοΫͷΑ͏ͳෳࡶͳௐࠪΛ͢Δʹ͸11*͕ඞཁ όΠϒε੩తղੳ͸ສೳͰ͸ͳ͍ɻਖ਼نදݱͰѻ͑ΔൣғΛݟۃΊΔ͜ͱ͕େࣄ 

Slide 31

Slide 31 text

·ͱΊ ੩తղੳͱ͍͏ɺͳ͔ͳ͔खΛग़͠ʹ͍͘෼໺΋ɺ ੎͍Ͱѻ͑ΔΑ͏ʹͳ͖ͬͯͨ όΠϒεͰ͸ͳ͘ɺݕ஌εΫϦϓτΛ࡞Δ͜ͱͰɺ ݁ՌΛղऍՄೳʹ͢Δ͜ͱ͕ॏཁ ࠓޙͷల๬ ϓϩϯϓτڞ༗ɺ஌ݟڞ༗͍ͨ͠ ݒ೦ɿڞ༗ɺ؅ཧ͢Δ͜ͱͰॊೈͳ؀ڥʹରԠͰ͖ͳ͘ͳΔ͓ͦΕˠόΠϒε௿Լ ͓ͬͦ͘͞खݩͷϓϩμΫτͰࢼͯ͠Έ͍ͯͩ͘͞ ͏·͍ͬͨ͘Β࠙਌ձͰ੠͔͚͍ͯͩ͘͞ ͏·͍͔͘ͳ͔ͬͨΒϖΞϓϩ͠·͠ΐ͏ 

Slide 32

Slide 32 text

࣭໰͋Γ·͔͢ʁ 

Slide 33

Slide 33 text

113Λ࢖ͬͨΒʁ 113ɿਖ਼نදݱϕʔεͷύʔαʔ ࠾༻͠ͳ͍ཧ༝ ϓϩδΣΫτશମ113Ͱύʔε͢Δͱ11*ͱಉ͘͡Β͍͕͔͔࣌ؒͬͨɻෳ਺ճϚον͢Δͱ ޮ཰͕ѱ͍ ίΞϞδϡʔϧͰ͸ͳ͍ˠϙʔλϏϦςΟ͕௿͍ ਖ਼֬Ͱ͸͋Δ͕ɺ୯ͳΔਖ਼نදݱΑΓՄಡੑ௿ԼˠνʔϜϝϯόʔ͕ϝϯςφϯεͰ͖ͳ͍ ڪΕ ୭Ͱ΋อकͰ͖ɺյΕͯ΋ยखؒʹ௚ͤΔ΋ͷΛ໨ࢦ͢ɺͱ͍͏όΠϒεॏࢹ 

Slide 34

Slide 34 text

࢖ͬͨπʔϧͱϞσϧ͸ʁ ೥݄೔࣌఺Ͱ πʔϧ$MBVEF$PEF "OUISPQJDެࣜ$-*  Ϟσϧ$MBVEF4POOFU DMBVEFTPOOFU! 

Slide 35

Slide 35 text

VTF࿙ΕνΣοΫͰݟಀ͍ͯͨ͠ෆ۩߹ ਖ਼نදݱ൛ͷ෦෼Ϛονόά VTF.Z"QQ3FEJT,FZ͕͋Ε͹.Z"QQ3FEJTDPOOFDU΋0,ͱޡ൑ఆ͍ͯͨ͠ 11*൛ͰݫີʹνΣοΫ͢Δ͜ͱͰൃݟ ͨͩ͠ɺಈ࡞Өڹͷͳ͍ෆ۩߹ͩͬͨ 1FSMͷϞδϡʔϧϩʔυ͸άϩʔόϧ ଞͷϑΝΠϧͰطʹϩʔυࡁΈͰ*/$ʹҰ౓ొ࿥͞ΕͨΒಈ࡞͢Δ ʮͦͷϑΝΠϧ಺ͰVTF͍ͯ͠ͳ͍ʯͱ͍͏੩తղੳ্ͷ໰୊ զʑͷϓϩμΫτͰ͸BQQQTHJͰىಈ࣌ʹΑ͘࢖͏ωʔϜεϖʔεΛ·ͱΊͯVTF͍ͯ͠Δͨ Ίಈ࡞ʹ͸Өڹͳ͔ͬͨ 

Slide 36

Slide 36 text

ϓϩδΣΫτઐ༻ͷ੩తղੳπʔϧͷٕज़બఆ ߏจ໦Λ࡞Βͳ͍͍ͯ͘ͷʁ "45ૢ࡞ʹೃછΈͷͳ͍։ൃऀʹ͸อक͕೉͍͠ ࣮ߦ͕࣌ؒ໰୊ͱͳΓ΍͍͢ ສߦͷιʔείʔυͷߏจ໦ߏஙʹखݩ୺຤Ͱ͸෼͔͔Δ ։ൃதʹࢼߦࡨޡ͍ͨ͠ͷͰɺૣ͚Ε͹ૣ͍΄͏͕๬·͍͠ ґଘؔ܎ͷൈ͖ग़͠Λௐ΂Δʹ͸ɺϑΝΠϧؒͷؔ࿈ͷάϥϑΛऔΓग़ͤΕ͹ྑ͍ͷ ͰɺͦΕ΄ͲෳࡶͰ͸ͳ͍ ਖ਼نදݱͰ΋໾ཱͭ΋ͷΛ࡞ΕΔ͜ͱ͕෼͔ͬͨΒɺझຯͰ੩తղੳ͢ΔਓΛ૿΍ͤΔ Մೳੑ 

Slide 37

Slide 37 text

͓͢͢Ίຊ #FZPOE7JCF$PEJOH   όΠϒίʔσΟϯάΛ௒͑ͯ   όΠϒίʔσΟϯάˡˠ"*ɾΞγετɾΤϯδχΞϦϯάͱ͍͏ରൺ ͜ͷຊͷٞ࿦Λ;·͑Δͱɺ ʮ"*ɾΞγετɾ੩తղੳʯͱݺΜͩ΄͏͕ࣗવ  IUUQTMFBSOJOHPSFJMMZDPNMJCSBSZWJFXCFZPOEWJCFDPEJOH