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

Perlの上にも三年 〜 ずっとイケてるサービスを作り続ける技術 〜

hitode909
August 21, 2015

Perlの上にも三年 〜 ずっとイケてるサービスを作り続ける技術 〜

発表者は,この三年間はてなブログというイケてるPerlのサービスの開発に携ってきました…

Perlの最新を追い求め続けた三年間でした…

なにも分からず,SQLをコピペし続けた数ヶ月…

つらいことも,たのしいことも,みんな分かちあったコードベース…

救いを求め,藁にもすがる思いで,朝も夜も読み続けたオブジェクト指向入門……

偶然発見して,これだと思ったドメイン駆動設計……

苦しみの軌跡と,現在最高の設計を紹介します………!!!!!!!

hitode909

August 21, 2015
Tweet

More Decks by hitode909

Other Decks in Technology

Transcript

  1. 1FSMͷ্ʹ΋ࡾ೥
    ͣͬͱΠέͯΔαʔϏεΛ
    ࡞Γଓ͚Δٕज़
    IJUPEF

    View Slide

  2. ࢿྉ͖ͬ͞·Ͱ

    View Slide


  3. View Slide

  4. ͕Μ͹Ζ͏

    View Slide

  5. View Slide

  6. ͕Μ͹Ζ͏

    View Slide

  7. 1FSMͷ্ʹ΋ࡾ೥
    ͣͬͱΠέͯΔαʔϏεΛ
    ࡞Γଓ͚Δٕज़
    IJUPEF

    View Slide

  8. IJUPEF

    View Slide

  9. IJUPEF
    झຯ͸Πϯλʔωοτ

    View Slide

  10. View Slide

  11. View Slide

  12. View Slide

  13. View Slide

  14. ͸ͯͳϒϩά

    View Slide

  15. ͸ͯͳϒϩά
    ೥݄։ൃ։࢝
    ೥݄Ќ൛
    ೥݄ਖ਼ࣜԽ
    ։ൃ೥໨
    ·ͩ·ͩ։ൃத

    View Slide

  16. ͸ͯͳϒϩάͷΫϥε਺

    View Slide

  17. ։ൃམͪண͍ͨαʔϏε

    View Slide

  18. ·ͩ·ͩ։ൃத

    View Slide

  19. ΠέͯΔαʔϏεͱ͸

    View Slide

  20. ໾ཱͭ
    ଎͍
    ͨͷ͍͠
    ͔͍͍ͬ͜
    Πϝʔδ͕Α͍
    ΈΜͳ࢖ͬͯΔ

    View Slide

  21. ͦͷͨΊʹ͸
    ։ൃΛܧଓ
    ໎Θͣॻ͚Δ
    Ұ؏ͨ͠ࢦ਑
    ࠷৽ͷࢦ਑

    View Slide

  22. ࣗݾ঺հ
    ʙࠓ·Ͱ
    ͸ͯͳϒϩά
    ࡞ͬͯ·͢

    View Slide

  23. ͍Ζ͍Ζ͋ͬͨͷͰ
    ͍͍࿩Λ͍ͨ͠

    View Slide

  24. ࿩͍ͨ͜͠ͱ
    ϑϨʔϜϫʔΫͷྺ࢙
    ϒϩάͷϑϨʔϜϫʔΫ
    ΦϒδΣΫτࢦ޲
    ϨΨγʔͳίʔυͷॻ͖׵͑
    υϝΠϯۦಈઃܭ
    ໊લ
    ৮Γ΍͢͞

    View Slide

  25. ࣾ಺ϑϨʔϜϫʔΫͷྺ࢙

    View Slide

  26. )BUFOB
    ΞϯςφμΠΞϦʔਓྗ
    )BUFOB
    ϒοΫϚʔΫϑΥτϥΠϑάϧʔϓΞΠσΞϦϯά
    3JEHF.P$P
    ϒοΫϚʔΫϋΠΫίίελʔϥϯυ0OF

    View Slide

  27. 3JEHF
    3BJMT෩ͷ8"'
    .P$P
    "DUJWF3FDPSE෩ͷ03.

    View Slide

  28. 3JEHF
    package Bookmark::Engine::Index;
    use strict;
    use warnings;
    use Bookmark::Engine -Base;
    sub default : Public {
    my ($self, $r) = @_;
    $r->res->content_type('text/plain');
    $r->res->content('Welcome to the Ridge world!');
    }
    1;
    IUUQTHJUIVCDPNIBUFOB)BUFOB5FYUCPPLCMPCNBTUFSNWDXFCBQQMJDBUJPONE

    View Slide

  29. 3JEHF
    #PPLNBSL&OHJOF*OEFY
    #PPLNBSL&OHJOF
    3JEHF&OHJOF

    View Slide

  30. 3JEHF
    DPOUSPMMFS͸ܧঝ
    Ϋϥε໊͔ΒϧʔςΟϯά

    View Slide

  31. 3JEHF
    ݁ہશ෦ಡ·ͳ͍ͱ
    ಈ͔ͤͳ͍
    ͷͰ͍ͨ΁Μ

    View Slide

  32. %#*Y.P$0
    "DUJWF3FDPSE෩ͷ03.
    package Vocaloid::MoCo::Artist;
    use base 'DBIx::MoCo';
    __PACKAGE__->table('artist');
    my $artists = Vocaloid::MoCo::Artist->search(
    where => {
    name => { -like => 'ڸԻ%' },
    },
    order => 'id ASC',
    limit => 10,
    );
    $artists->each(sub {
    print $_->name, "\n";
    });

    View Slide

  33. .P$P
    7PDBMPJE.P$P"SUJTU
    %#*Y.P$P

    View Slide

  34. 3JEHF.P$P
    ͱΓ͋͑ͣܧঝ͔ͯ͠Β࢖͏
    ෆࢥٞͳग़དྷࣄ͕ى͖Δ
    ෆࢥٞͳͱ͖ʹίʔυಡΉ

    View Slide

  35. ϓϩδΣΫτ΁ͷ૊ࠐΈ
    TVCNPEVMFʹ௥Ճ
    େ͖͍ͷ͔Βখ͍͞ͷ·Ͱ
    ϓϩδΣΫτʙ

    View Slide

  36. ίʔυ͸ެ։͞ΕͯΔ͚Ͳ
    ओʹࣾ಺Ͱͷར༻

    View Slide

  37. ޙํޓ׵ੑอͭඞཁ
    ڍಈͷมߋ͸ϞϯΩʔύον

    View Slide

  38. ͳ͔ͳ͔͍ͨ΁Μͳ͜ͱ΋

    View Slide

  39. %#*Y.P$P-JTU
    3VCZͷ"SSBZ෩ͷΠϯλʔϑΣΠε
    my $artists = Vocaloid::MoCo::Artist->search(
    where => {
    name => { -like => 'ڸԻ%' },
    },
    order => 'id ASC',
    limit => 10,
    );
    $artists->each(sub {
    print $_->name, "\n";
    });

    View Slide

  40. %#*Y.P$P-JTU
    3VCZͷ"SSBZ෩ͷΠϯλʔϑΣΠε
    ϦετΫϥε-JTU3VCZJTI
    my $artists = Vocaloid::MoCo::Artist->search(
    where => {
    name => { -like => 'ڸԻ%' },
    },
    order => 'id ASC',
    limit => 10,
    );
    $artists->each(sub {
    print $_->name, "\n";
    });

    View Slide

  41. [email protected]
    $list = DBIx::MoCo::List->new([1, 2, 3, 4]);
    $list->delete_if(sub { ($_ % 2) == 0) });
    $list->dump #=> [2, 4]
    IUUQTNFUBDQBOPSHQPE%#*Y.P$P-JTU

    View Slide

  42. [email protected]
    $list = List::Rubyish->new([1, 2, 3, 4]);
    $list->delete_if(sub { ($_ % 2) == 0) });
    $list->dump #=> [1, 3]
    IUUQTNFUBDQBOPSHQPE-JTU3VCZJTI

    View Slide

  43. [email protected]
    # DBIx::MoCo#delete_if
    sub delete_if {
    my ($self, $code) = @_;
    croak "Argument must be a code" unless ref $code eq 'CODE';
    my $last_index = $self->_last_index;
    for (0..$last_index) {
    my $item = $self->shift;
    local $_ = $item;
    $self->push($item) if $code->($_);
    }
    return $self;
    }

    View Slide

  44. [email protected]
    # List::Rubyish
    sub delete_if {
    my ($self, $code) = @_;
    croak "Argument must be a code" unless ref $code eq 'CODE';
    my $last_index = $self->_last_index;
    for (0..$last_index) {
    my $item = $self->shift;
    local $_ = $item;
    $self->push($item) unless $code->($_);
    }
    return $self;
    }

    View Slide

  45. $self->push($item) if $c

    View Slide

  46. $self->push($item) unles

    View Slide

  47. Ͳ͕ͬͪফ͑Δ͔෼͔Βͳ͍
    ϓϩδΣΫτʹΑͬͯ͸
    ϞϯΩʔύονͰڍಈม͑ͨΓ
    ˠ[email protected]͸࢖ͬͯ͸͍͚ͳ͍

    View Slide

  48. ͳ͔ͳ͔͍ͨ΁Μ

    View Slide

  49. ηϚϯςΟοΫͳόʔδϣ
    χϯά͕͋Ε͹ͪΐͬͱ·
    ͔ͩͬͨ͠΋͠Εͳ͍

    View Slide

  50. ϥϘ͸ࣗ༝

    View Slide

  51. ϥϘͰ3BJMT

    View Slide

  52. ϥϘͰ4JOBUSB
    Quyo

    View Slide

  53. ࣾ಺ϑϨʔϜϫʔΫͷྺ࢙
    ͓ΘΓ

    View Slide

  54. ͸ͯͳϒϩάͷϑϨʔϜϫʔΫ

    View Slide

  55. :"1$DIP
    ΅͘ͷ͔Μ͕͍͖͑ͨ͞ΐ
    ͏ͷ͏͐Ϳ͋΀Γ͚ʔ͠ΐ
    Μ;ΕʔΉΘʔ͘
    IUUQXXXTMJEFTIBSFOFUDIPZBQDBTJB

    View Slide

  56. ͜ͷཪͰൃදத
    ࠓ͙͢ݟʹߦ͜͏

    View Slide

  57. :"1$DIP
    ΅͘ͷ͔Μ͕͍͖͑ͨ͞ΐ
    ͏ͷ͏͐Ϳ͋΀Γ͚ʔ͠ΐ
    Μ;ΕʔΉΘʔ͘
    IUUQXXXTMJEFTIBSFOFUDIPZBQDBTJB

    View Slide

  58. ಡΉίʔυ͕࠷খ
    ҆શ

    View Slide

  59. ϧʔςΟϯά
    ηΩϡϦςΟରࡦ

    View Slide

  60. ϒϩάͰ͸
    ͋·Γʹγϯϓϧ
    ܧঝ͠ͳ͍
    03.࢖Θͳ͍
    42-௚઀ॻ͘

    View Slide

  61. $POUSPMMFS
    ୯ͳΔΫϥεϝιου
    package Hatena::Epic::Admin::Index;
    use strict;
    use warnings;
    sub default {
    my ($class, $r) = @_;
    $r->res->content('Hello, World!');
    $r->res->content_type('text/plain');
    }

    View Slide

  62. $POUSPMMFS
    42-΋௚઀ൃߦ
    package Hatena::Epic::Admin::Index;
    use strict;
    use warnings;
    sub default {
    my ($class, $r) = @_;
    my $user = $r->db->single(
    'SELECT * FROM user WHERE name=:name',
    bind => {
    name => 'sampleuser',
    },
    class => 'Model::User',
    );
    $r->render('index.html', {user => $user});
    }

    View Slide

  63. $POUSPMMFS͸ͨͩͷؔ਺
    42-΋खͰॻ͘
    SFOEFS͢Δ)5.-Λࢦఆ

    View Slide

  64. OP03.
    3PXʹCMFTT͢Δ͚ͩ
    ਌Ϋϥεͳ͠
    ୯ͳΔΦϒδΣΫτ

    View Slide

  65. શ෦खॻ͖
    ബ͍ϑϨʔϜϫʔΫͰ
    ͢͹΍͘։ൃ

    View Slide

  66. %3:

    View Slide

  67. ճίϐϖͨ͠Βڞ௨Խ

    View Slide

  68. ճίϐϖͨ͠Βڞ௨Խ
    ա৒ͳந৅ԽΛආ͚Δ
    งғؾΑͦ͞͏

    View Slide

  69. ΤϯδχΞਓ

    View Slide

  70. ΤϯδχΞਓ͕ಉ࣌ʹίϐϖ
    ίϐϖͨ͠42-ʹόά

    View Slide

  71. ΤϯδχΞਓ͕ಉ࣌ʹίϐϖ
    ίϐϖͨ͠42-ʹόά
    ճ௚͢

    View Slide

  72. σʔλͷอଘ

    View Slide

  73. DPOUSPMMFS͔Β61%"5&
    ຖճ޻෉
    $POUSPMMFSͰ·ͱΊΔ೿
    .PEFMʹTBWFϝιου೿

    View Slide

  74. .PEFM
    $POUSPMMFS
    7JFX
    ճίϐϖ͞Εͨ૚

    View Slide

  75. ίϐϖղফձ৔
    $PNNPO

    View Slide

  76. $PNNPO&OUSZ
    هࣄʹؔ͢Δૢ࡞ͷ͏ͪ
    ճίϐϖ͞ΕͨίʔυΛूΊΔ

    View Slide

  77. ݏͳ༧ײ

    View Slide

  78. $PNNPOͩͱ
    ΰϛஔ͖৔Խͦ͠͏

    View Slide

  79. ໊͍͍લʜ

    View Slide

  80. 4FSWJDF

    View Slide

  81. 4FSWJDF&OUSZ
    هࣄͷݕࡧ΍อଘͳͲ
    هࣄͷૢ࡞ΛूΊͨ
    Ϟδϡʔϧ

    View Slide

  82. ͡Ό͋ͦΕͰ

    View Slide

  83. ݱࡏ
    4FSWJDFҎԼʹΫϥε

    View Slide

  84. ݱࡏ
    4FSWJDFҎԼʹΫϥε
    .PEFM͸Ϋϥε

    View Slide

  85. ݱࡏ
    4FSWJDFҎԼʹΫϥε
    .PEFM͸Ϋϥε
    ςʔϒϧ୯ҐͰ͸ͳ͍

    View Slide

  86. 4FSWJDF
    %%%తʹ͸3FQPTJUPSZ
    "QQMJDBUJPO4FSWJDF
    ͋ͱͰొ৔

    View Slide

  87. ΦϒδΣΫτͷऔಘ
    my $user =
    Hatena::Epic::Service::User->find_user_by_name(
    $db, 'sampleuser'
    );

    View Slide

  88. my $entries =
    Hatena::Epic::Service::Entry->find_entries_of_blog(
    $db, {
    blog => $blog,
    permission => 'public',
    limit => 3,
    });
    ΦϒδΣΫτͷऔಘ

    View Slide

  89. ͦͷ࣮૷
    42-खॻ͖
    sub find_user_by_name {
    my ($class, $db, $name) = @_;
    my $user = $db->single(
    'SELECT * FROM user WHERE name=:name',
    bind => {
    name => $name,
    },
    class => 'Model::User',
    );
    return $user;
    }

    View Slide

  90. อଘ
    ϒϩάͷొ࿥
    my $blog = Hatena::Epic::Service::Register->register_new_blog(
    $db, {
    user => $user,
    id => 'subdomain',
    domain => 'hatenablog.com',
    }
    );

    View Slide

  91. อଘ
    ಺෦Ͱ͸*/4&35
    sub register_new_blog {
    my ($class, $db, $values) = @_;
    ...
    my $blog = $db->execute(
    'INSERT INTO blog ...

    View Slide

  92. */4&35Ͱ΋
    ؾ࣋ͪ͸ॆ࣮ͨ͠ϝιου
    register_new_blog
    join_blog_member
    post_new_entry
    reserve_scheduled_entry

    View Slide

  93. [email protected]ͩͱ$36%ײ
    ؾ෼͕ग़ͳ͍
    create_blog
    create_blog_member
    create_entry
    find_or_create_scheduled_entry

    View Slide

  94. Πϝʔδ
    ͜ͷ໊લͷΤϯτϦ͍ͩ͘͞
    4FSWJDF&OUSZ
    .PEFM&OUSZ
    ͸͍

    View Slide

  95. Πϝʔδ
    ͜ͷهࣄอଘ͠ͱ͍ͯ
    4FSWJDF&OUSZ
    .PEFM&OUSZ
    ͠·ͨ͠

    View Slide

  96. Πϝʔδ
    ਓؾͷهࣄूܭͯ͠
    4FSWJDF)PU&OUSZ
    ͠·ͨ͠

    View Slide

  97. 4FSWJDFͷϝιου͸
    ୯ͳΔΫϥεϝιου
    جఈΫϥεͳ͠
    جఈΫϥε͸ංେԽ͕ͪ͠
    sub register_new_blog {
    my ($class, $db, $values) = @_;

    View Slide

  98. 4FSWJDFͷߟ͑ํ
    ςʔϒϧͱҰରҰʹ͠ͳ͍
    ػೳ͝ͱ

    View Slide

  99. ϒϩάͷओͳςʔϒϧ
    6TFS
    #MPH
    &OUSZ
    $PNNFOU

    View Slide

  100. 6TFS
    #MPH
    &OUSZ
    $PNNFOU
    ͜ΕΒʹू·͍ͬͯ͘ͱ
    ૿͑͗͢Δ

    View Slide

  101. 1PTU&OUSZ
    %FMFUF&OUSZ
    #MPH3FHJTUFS
    %FTUSPZ"MM4QBNNFST
    ػೳ໊͝ͱʹ࡞Δ

    View Slide

  102. ݺͼग़͠ଆ͔ΒݟΔͱ
    ΦϒδΣΫτಉ࢜ͷ
    ΍ΓͱΓʹݟ͑ΔΑ͏ʹ
    ۮવ.Z42-ʹอଘͯ͠Δ

    View Slide

  103. ཪଆ.POHP%#Ͱ΋
    8FC"1*Ͱ΋
    ಉ͡ΠϯλʔϑΣΠε
    my $user =
    Hatena::Epic::Service::User->find_user_by_name(
    $db, 'sample'
    );

    View Slide

  104. 4FSWJDFͷొ৔
    $POUSPMMFSεοΩϦ

    View Slide

  105. 4FSWJDF͸Ͳ͔͜ΒͰ΋
    ࢖͑Δ
    $POUSPMMFS
    5FTU
    #BUDI4DSJQU
    0OFUJNF4DSJQU

    View Slide

  106. ͍͍Ͱ͢Ͷ

    View Slide

  107. ͍͍Ͱ͢Ͷ
    Ϋϥεϝιου࠷ߴ

    View Slide

  108. ͍͍Ͱ͢Ͷ
    ͍͍͚Ͳ

    View Slide

  109. ͜Ε͸
    ΦϒδΣΫτࢦ޲ͳͷ͔

    View Slide

  110. ͦͷ͜Ζ
    ΦϒδΣΫτࢦ޲ೖ໳
    ಡΜͰͨ

    View Slide

  111. View Slide

  112. ࠷ߴ

    View Slide

  113. 0CKFDU
    0SJFOUFE
    4PGUXBSF
    $POTUSVDUJPO

    View Slide

  114. 0CKFDU0SJFOUFE
    4PGUXBSF$POTUSVDUJPO
    ΦϒδΣΫτࢦ޲ೖ໳
    ݪஶ͸શવೖ໳͡Όͳ͍
    ݪஶ͸೥
    ೔ຊޠ൛͸೥

    View Slide

  115. ্Լר

    ϖʔδ

    View Slide

  116. ࠷ߴ

    View Slide

  117. ষܖ໿ʹΑΔઃܭ
    ࠷ߴͷষ

    View Slide

  118. ࣄલ৚݅ࣄޙ৚݅ʜϧʔνϯͷੑ࣭
    ෆมද໌ʜΫϥεͷੑ࣭

    View Slide

  119. Ϋϥεͱސ٬ͷؒͷؔ܎
    ͸ɼ͓ޓ͍ͷݖརͱٛ຿Λ
    ݱͨ͠ਖ਼ࣜͳಉҙͱݟͳ͢
    ͜ͱ͕Ͱ͖Δ

    View Slide

  120. ެཧ
    \1^"\2^
    ೚ҙͷ"ͷ࣮ߦ͸ɼ1ͷঢ়
    ଶʹͳͬͨͱ͖ʹ࢝·Γɼ
    2ͷঢ়ଶʹͳͬͨͱ͖ʹऴ
    ྃ͢Δ

    View Slide

  121. ެཧ
    \1^"\2^
    \Y^YY\Y^
    ͷؒҧ͍Ͱ͸ͳ͍ ऑ͍৚݅


    View Slide

  122. ࣄલ৚݅
    ϧʔνϯͷݺͼग़͠લʹސ٬͕ຬͨ
    ͞ͳ͚Ε͹ͳΒͳ͍৚݅
    ࣄޙ৚݅
    ϧʔνϯͷݺͼग़͠ޙʹڙڅऀ͕ຬ
    ͨ͞ͳ͚Ε͹ͳΒͳ͍৚݅

    View Slide

  123. αΠζʹ্ݶͷ͋ΔελοΫ

    View Slide

  124. ࣄલ৚݅
    ελοΫʹۭ͖͕͋Δ͜ͱ
    ࣄޙ৚݅
    ελοΫʹJUFN͕૿͑Δ
    αΠζ͕૿͑Δ
    ελοΫ͸ۭͰ͸ͳ͍
    $stack->push($item);

    View Slide

  125. ͓ޓ͍ͷ໿ଋ
    ੹೚֎ͷ͜ͱΛ
    νΣοΫ͠ͳ͍
    ඇ৑௕ੑͷݪଇ

    View Slide

  126. ͓ޓ͍৴པ͢Δ͜ͱͰ
    ίʔυ͖ͬ͢Γ
    มͳΤϥʔग़ͨͱ͖ʹ
    ୭ͷ੹೚͔໌Β͔

    View Slide

  127. Ϋϥεෆมද໌
    ΫϥεΠϯελϯεʹ
    ڞ௨͢Δશମతͳಛੑ

    View Slide

  128. ͋ΔΦϒδΣΫτͷҰੜ
    create a.make(...)
    4
    4
    a.f(...)
    4
    a.g(...)

    View Slide

  129. ͋ΔΦϒδΣΫτͷҰੜ
    create a.make(...)
    4
    4
    a.f(...)
    4
    a.g(...)
    ࣄલ
    ࣄޙ
    ࣄલ
    ࣄޙ
    ෆม

    View Slide

  130. ͜ͷߟ͑ํ͸
    ΫϥεΛઃܭ͢Δͱ͖
    1FSMͰ΋࢖͑Δ

    View Slide

  131. ࢖͑Δ͚Ͳ
    ݴޠతͳࢧԉ͸ͳ͍

    View Slide

  132. View Slide

  133. ࢖͑Δ͚Ͳ
    ݴޠతͳࢧԉ͸ͳ͍
    γʔτϕϧτͳ͠Ͱര૸

    View Slide

  134. ্רͷޙ൒ʙԼר͸
    Ԇʑͱܧঝͷ࿩

    View Slide

  135. छྨͷܧঝ
    ෦෼ܕܧঝ
    Ϗϡʔܧঝ
    ੍໿ܧঝ
    ֦ுܧঝ
    ϑΝϯΫγϣφϧόϦΤʔγϣϯܧঝ
    ܕόϦΤʔγϣϯܧঝ
    ແޮԽܧঝ
    ۩ମԽܧঝ
    ߏ଄ܧঝ
    ࣮૷ܧঝ
    ڞ༗ੑ࣭ܧঝ

    View Slide

  136. ΦϒδΣΫτࢦ޲೉͍͠

    View Slide

  137. ೉қ౓
    ܧঝ
    Ϋϥε
    ؔ਺
    ແ ؆୯
    ΍Γͨ͘ͳ͍
    ೉͍͠

    View Slide

  138. ίʔυߦ΋
    ॻ͔ͣʹࡁΊ͹
    ͦΕʹӽͨ͜͠ͱ͸ͳ͍

    View Slide

  139. Πϯελϯε࡞Βͣ
    ܧঝͤͣࡁΊ͹
    ͦΕʹӽͨ͜͠ͱ͸ͳ͍

    View Slide

  140. ඞཁͳ͍ΦϒδΣΫτੜ੒
    ඞཁͳ͍ܧঝ
    ؾΛ͚ͭͯ࠷খʹ

    View Slide

  141. ϓϩδΣΫτʹ઎ΊΔࢠΫϥε཰
    VTFQBSFOUCBTF཰


    View Slide

  142. ΞϓϦέʔγϣϯશମͰ
    ࢖͑Δ΋ͷΛઃܭ͠
    ࢖͍ଓ͚Δͷ͸೉͍͠

    View Slide

  143. ঢ়ଶͷͳͯ͘ࡁΉ΋ͷʹ
    ঢ়ଶΛ༩͑ͯ͸͍͚ͳ͍

    View Slide

  144. ΫϥεϝιουͳΒ৺഑ͳ͍

    View Slide

  145. ΦϒδΣΫτࢦ޲ΛֶΜ্ͩͰ
    ͳΔ΂͘ෳࡶͳࣄଶΛආ͚Δ

    View Slide

  146. Ϋϥεϝιουͦͷޙ

    View Slide

  147. Ϋϥεϝιου࠷ߴظ
    ͳΜͰ΋ΫϥεϝιουͰ
    ෳࡶͳ͜ͱ͢Δ
    Ҿ਺ͲΜͲΜ૿͍͑ͯ͘

    View Slide

  148. ͍͍Ͱ͢Ͷ
    Service::PostEntry->post($db, %values);

    View Slide

  149. هࣄ͸ෳࡶ
    WBMVFTͷLFZ͕ݸʙ
    Service::PostEntry->post($db, %values);
    title body date url categories user_id
    blog_id comment_count og_image
    og_description permission is_scheduled
    ...

    View Slide

  150. هࣄΛ౤ߘ
    هࣄΛߋ৽
    Լॻ͖ʹ໭͢
    Լॻ͖Λߋ৽
    ༧໿౤ߘΛެ։
    هࣄΛ࡟আ
    Ϣʔεέʔε͞·͟·

    View Slide

  151. ΤϯτϦͷ૊Έཱͯʹ࢖͏Ϋϥε
    1PTU&OUSZ'BDUPSZ

    View Slide

  152. هࣄͷ౤ߘ
    my $factory = Factory->new;
    $factory->set_title($title);
    $factory->set_body($body);
    $factory->format_body($formatter);
    ...;
    $entry = $factory->get_entry;

    View Slide

  153. Լॻ͖ͷެ։
    my $factory = Factory->new;
    $factory->load_entry($draft);
    $factory->set_as_public;
    my $entry = $factory->get_entry;

    View Slide

  154. ެ։هࣄΛԼॻ͖ʹ໭͢
    my $factory = Factory->new;
    $factory->load_entry($entry);
    $factory->set_as_private;
    my $draft = $factory->get_entry;

    View Slide

  155. ೉͍͠ૢ࡞
    ॊೈͳΠϯλʔϑΣΠε
    ෳ਺ਓฤू΍༧໿౤ߘͳͲ
    ࡞ΕΔΑ͏ʹͳͬͨ

    View Slide

  156. ͋ΔΦϒδΣΫτͷҰੜ
    create a.make(...)
    4
    4
    a.f(...)
    4
    a.g(...)

    View Slide

  157. ͍ͯͶ͍ʹ࡞Δͱ
    ໾ʹཱͭ
    ΦϒδΣΫτࢦ޲࠷ߴ

    View Slide

  158. ࠷ߴ

    View Slide

  159. ͖ͷ͏ؾ෇͍ͨ

    View Slide

  160. Լר
    ࡏݿͳ͍

    View Slide

  161. ͩΜͩΜΑ͘ͳ͖͚ͬͯͨͲ
    ੲॻ͍ͨίʔυ͕େྔʹ͋Δ

    View Slide

  162. ςετίʔυʹ
    ಉ͡42-͕
    ݸ͘Β͍
    4&-&$5'30.FOUSZ

    View Slide

  163. શ෦ม͑Δͷ͍ͨ΁Μ
    ੩తղੳͯ͠ॻ͖׵͑

    View Slide

  164. ੩తղੳ
    ڈ೥ͷൃදΛݟͯ͘Ε

    View Slide

  165. print (1 * 2) + 3;
    ߏจ໦

    View Slide

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

    View Slide

  167. ߏจ໦
    print "(1 * 2) + 3";

    View Slide

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

    View Slide

  169. ͜͏͍͏΍ͭͰ
    ಛఆͷτʔΫϯྻΛஔ׵
    ͢Δ΍ͭ࡞ͬͨ

    View Slide

  170. 4&-&$5'30.FOUSZ
    ˣ
    4FSWJDF&[email protected]

    View Slide

  171. 3FQMBDF.FUIPE$BMM
    IUUQIJUPEFIBUFOBCMPHDPNFOUSZ

    View Slide

  172. ओʹςετͰίϐϖ͞Ε·
    ͬͯͨ͘42-Λ
    4FSWJDF૚ʹҠৡ

    View Slide

  173. εΫϦϓτͰճͯ͠ίϛοτ
    ߦ΄Ͳػցతʹมߋ

    View Slide

  174. "QQ135
    1FSMͷϦϑΝΫλϦϯά
    πʔϧ࡞Γ·ͨ͠
    ;ͩΜ͍͢͝࢖ͬͯΔ
    ڈ೥ͷൃදݟͯ͘Ε

    View Slide

  175. ௕೥։ൃͯ͠Δͱ
    ஌ݟू·ͬͯ͘Δ
    ৽͍͠ࢦ਑ʹ͋Θͤͯ
    ͋ͱ͔Β௚ͤΔͷ͕ॏཁ

    View Slide

  176. աڈΛࣺͯ
    ࠷ߴͷઃܭʹ
    ޲͔͍͍ͨ

    View Slide

  177. View Slide

  178. ࠷ߴ

    View Slide

  179. ΤϦοΫɾΤϰΝϯεͷ
    υϝΠϯۦಈઃܭ
    ग़൛
    ೔ຊޠ൛
    ,JOEMF൛

    View Slide

  180. ίΞυϝΠϯʹूதͯ͠
    ॆ࣮ͨ͠ϞσϧΛ࡞Ζ͏

    View Slide

  181. ίΞυϝΠϯ
    ιϑτ΢ΣΞͷ͏ͪ
    ΋ͬͱ΋ॏཁͰ೉͍͠ͱ͜Ζ

    View Slide

  182. ίΞυϝΠϯʹ஫ྗ
    ίΞυϝΠϯҎ֎Ͱ
    ࡞ΓࠐΈ͗͢Δͱແବ

    View Slide

  183. ϨΠϠԽΞʔΩςΫνϟ

    View Slide

  184. ϨΠϠԽΞʔΩςΫνϟ
    ϢʔβΠϯλϑΣʔε
    ΞϓϦέʔγϣϯ
    υϝΠϯ
    ΠϯϑϥετϥΫνϟ

    View Slide

  185. ϨΠϠԽΞʔΩςΫνϟ
    ϢʔβΠϯλϑΣʔε
    ΞϓϦέʔγϣϯ
    υϝΠϯ
    ΠϯϑϥετϥΫνϟ
    ৘ใͷදࣔɼίϚϯυͷղऍ
    ௐ੔໾ബ͍૚
    Ϗδωεϧʔϧ
    ιϑτ΢ΣΞͷ֩৺
    ӬଓԽ΍ϝοηʔδૹ৴ͳͲ
    Ұൠతͳٕज़

    View Slide

  186. υϝΠϯͷΦϒδΣΫτ
    ΤϯςΟςΟ
    ஋ΦϒδΣΫτ

    View Slide

  187. ΤϯςΟςΟ
    Ϣʔβʔ΍ϒϩά
    ঢ়ଶΛ࣋ͭ
    ಉ໊͡લͰ΋ผΠϯελϯε
    Ұҙͷ*%

    View Slide

  188. ஋ΦϒδΣΫτ
    ෆมͳ΋ͷ
    ྫ৭ɼ਺ࣈɼ਺
    ΠϯελϯεΛڞ༗Ͱ͖Δ

    View Slide

  189. ͸ͯͳϒϩάʹ͓͚Δ
    ΤϯςΟςΟͷྫ
    .PEFM6TFS
    .PEFM#MPH
    .PEFM&OUSZ

    View Slide

  190. ͸ͯͳϒϩάʹ͓͚Δ
    ஋ΦϒδΣΫτͷྫ
    .PEFM#MPH1MVT#BEHF

    View Slide

  191. ΤϯςΟςΟͱ
    ஋ΦϒδΣΫτ
    ҙࣝͯ͠࡞Δͱ
    ߟ͑Δ͜ͱ͕ݮΔ

    View Slide

  192. ΤϯςΟςΟ͍ͨ΁Μ
    ͳΔ΂͘஋ΦϒδΣΫτʹ

    View Slide

  193. ΤϯςΟςΟͷҰੜ
    create a.make(...)
    4
    4
    a.f(...)
    4
    a.g(...)

    View Slide

  194. ஋ΦϒδΣΫτͷҰੜ
    create a.make(...)
    4
    ঢ়ଶͳ͠

    View Slide

  195. ͦͷଞ
    αʔϏε

    View Slide

  196. αʔϏε
    υϝΠϯͷૢ࡞Ͱ͋Γͳ͕
    ΒΤϯςΟςΟʹ΋஋Φϒ
    δΣΫτʹ΋མͪண͔ͳ͍

    View Slide

  197. ঢ়ଶΛ࣋ͨͳ͍αʔϏεͱ
    ͯ͠ಠཱͤ͞Δ
    ྫޱ࠲ͷৼସػೳ

    View Slide

  198. $POUSPMMFS͔Β୤ग़ͨ͠
    ͱ͜Ζ4FSWJDFʹ୧Γͭ
    ͍͚ͨͲυϝΠϯۦಈઃܭ
    తʹ͸Ұൠతͳ֓೦ͩͬͨ

    View Slide

  199. ࠷ߴ

    View Slide

  200. ࠷ۙͷϓϩδΣΫτ
    %%%ΛऔΓೖΕΑ͏

    View Slide

  201. ͸ͯͳϒοΫϚʔΫ
    ϑϧεΫϥονத
    XJUI4DBMB

    View Slide

  202. 4DBMBؔ੢4VNNJU
    ͸ͯͳϒοΫϚʔΫJO4DBMB
    IUUQXXXTMJEFTIBSFOFUPBSBUTDBMB

    View Slide

  203. View Slide

  204. υϝΠϯۦಈઃܭχϡʔε

    View Slide

  205. View Slide

  206. ࠷ߴ

    View Slide

  207. ࣮ફυϝΠϯۦಈઃܭ
    ۩ମతͳ࣮૷
    +BWB
    )JCFSOBUF
    .POHP%#

    View Slide

  208. ࣾ಺Ͱษڧձ
    िষ
    ͏ͪͷϓϩδΣΫτͰ͸ʙ
    ײ૝΍࣭໰͸
    (JU)VC*TTVF

    View Slide

  209. View Slide

  210. View Slide

  211. ΈΜͳͰಡΉͱ௙Δ

    View Slide

  212. ʮ͸ͯͳࣾ಺Ͱ։࠵ͨ͠
    %%%ษڧձͷ༷ࢠΛ͝঺
    հ͠·͢ʯ
    IUUQEFWFMPQFSIBUFOBTUB⒎DPNFOUSZ

    View Slide

  213. ໊લͷ࿩

    View Slide

  214. ϢϏΩλεݴޠ
    νʔϜͰڞ༗͢Δݴޠ
    ීஈͷձ࿩͔Βίʔυ·Ͱ

    View Slide

  215. શһ͕ಉ͡ݴ༿Ͱ࿩ͤΔͱ௙Δ

    View Slide

  216. ٬ʮে༉ʯ
    ৬ਓʮࢵʯ
    ࣮ࡍʹ͸ಉ͡΋ͷΛࢦ͢

    View Slide

  217. σΟϨΫλʔʮ͓Έ͘͡ʯ
    ΤϯδχΞʮ-PUΫϥεʯ
    ࣮ࡍʹ͸ಉ͡΋ͷΛࢦ͢

    View Slide

  218. ͜ΕͰ͸͍͚ͳ͍

    View Slide

  219. ΤϯδχΞ΋
    σΟϨΫλʔ΋
    σβΠφʔ΋
    اը΋ฤू΋
    νʔϜϝϯόʔશһ
    ಉ͡ݴ༿Λ࿩͢

    View Slide

  220. ৽نҊ݅Λ࢝ΊΔͱ͖ͷձ࿩
    ʮ˓˓ͱººɼ;ͩΜͲͬͪͰݺͼ·͔͢ʯ
    ʮºº͔ͳʯ
    ʮººΫϥε࡞Γ·͢ʯ
    ʮºº͸˚˚͠·͔͢ʯ
    ʮºº͸˘˘͠·͢ʯ
    ˠººΫϥεʹ˘˘ϝιου࡞Δ

    View Slide

  221. View Slide

  222. DMBTT0NJLVKJ
    DMBTT0NJLVKJ$PNQPOFOU
    DMBTT0NJLVKJ7JFX
    PNJLVKJVSBOBV

    View Slide

  223. ೔ຊޠ͕͍͍͔͸ٞ࿦ͷ༨஍
    JGPNJLVKJFNQUZ
    NPTJPNJLVKJLBSB

    View Slide

  224. ೔ຊޠ͕͍͍͔͸ٞ࿦ͷ༨஍
    ެ༻ޠ͕ӳޠͩͱΑ͍
    JGPNJLVKJFNQUZ
    NPTJPNJLVKJLBSB

    View Slide

  225. ·ͩ·ͩ͜Ε͔Β

    View Slide

  226. ͸ͯͳϒϩά΋
    ౷ҰͰ͖ͯͳ͍

    View Slide

  227. αΠυόʔʹஔ͚Δ΍ͭ

    View Slide

  228. αΠυόʔʹஔ͚Δ΍ͭ
    ΢ΟδΣοτ
    Ϟδϡʔϧ

    View Slide

  229. ϓϩδΣΫτ໊
    ͸ͯͳϒϩά

    View Slide

  230. ίʔυωʔϜ
    &QJD

    View Slide

  231. )BUFOB&QJD 1FSM

    )BUFOB%JBSZ +4

    )BUFOB#MPH $IFG

    View Slide

  232. OFX)BUFOB%JBSZ#MPHT#MPH

    View Slide

  233. OFX)BUFOB%JBSZ#MPHT#MPH
    ϓϩδΣΫτ໊
    ϒϩάΛ഑৴͢ΔυϝΠϯ
    ϒϩάͭΛ͋ΒΘ͢Ϟσϧ

    View Slide

  234. ·ͩ·ͩ͜Ε͔Β

    View Slide

  235. ໊લͷ؅ཧ

    View Slide

  236. ༻ޠूNE
    νʔϜϝϯόʔͰ߹ҙ͔ͯ͠Βهೖ
    HJUͰ؅ཧ
    ΤϯςΟςΟͷछྨ
    ʮ˓˓ϖʔδʯͱ͔
    ϝϯόʔ૿͑ͨͱ͖ʹָ
    ߋ৽ΊΜͲ͏

    View Slide

  237. ίϝϯτʹॻ͘
    ࣮૷ͱͷဃ཭͕গͳ͍
    ϒϩάνʔϜͰ͸ฤू΍اըͷਓʹ
    ΋͔·ΘͣίʔυΛݟ͍ͤͯΔ
    ʮͪΐͬͱ͸Կ΍ͬͯΔ͔Θ͔ͬͨʯ

    View Slide

  238. ձ࿩
    l࠷΋௕ظؒϢϏΩλεݴޠͷݱঢ়Λ
    ͖ͪΜͱද͠ଓ͚Δͷ͸ɼνʔϜͰ
    ͷձ࿩΍ίʔυ಺ͷϞσϧͩɽz
    ࣮ફυϝΠϯۦಈઃܭ1

    View Slide

  239. ΄͔ͷ࿩୊

    View Slide

  240. ίʔυ͸ม͑ΒΕΔ
    ετϨʔδ͸Ή͔͍ͣ͠
    BMUFSUBCMF
    ஌ݟืू

    View Slide

  241. ޷ධ
    ൃചத

    View Slide

  242. ৮Γ΍͢͞

    View Slide

  243. ͸ͯͳΠϯλʔϯ
    ʙ

    View Slide

  244. View Slide

  245. ϒϩάνʔϜͰ͸
    ೥͔Β
    Πϯλʔϯੜड͚ೖΕ

    View Slide

  246. View Slide

  247. View Slide

  248. View Slide

  249. View Slide

  250. View Slide

  251. View Slide

  252. νʔϜ഑ଐ͔Β
    िؒͷ͏ͪʹ
    Կ౓͔ϦϦʔε
    Կ౓͔ࠂ஌

    View Slide

  253. ͸ͯͳڭՊॻ
    (JU)VCͰެ։த
    IUUQTHJUIVCDPNIBUFOB)BUFOB5FYUCPPL

    View Slide

  254. ΠϯλʔϯڭՊॻ
    ੲ͸3JEHF.P$P
    ϒϩάͷΞʔΩςΫνϟΛ΋ͱʹ࡮৽
    ৽ਓݚमͰ΋

    View Slide

  255. ༨ܭͳ͜ͱ͠ͳ͍ͷͰ
    ؾʹͳͬͨΒશ෦ಡΊΔ

    View Slide

  256. ࠓ೥ͷΠϯλʔϯ
    ͓ͱͱ͍഑ଐ
    ΋͏৽ػೳಈ͖ͭͭ͋Δ

    View Slide

  257. ΦϒδΣΫτࢦ޲΍%%%
    ؾʹ͠ͳͯ͘΋
    γϯϓϧʹॻ͚Δ

    View Slide

  258. ·ͱΊ

    View Slide

  259. ࿩͍ͨ͜͠ͱ
    ϑϨʔϜϫʔΫͷྺ࢙
    ϒϩάͷϑϨʔϜϫʔΫ
    ΦϒδΣΫτࢦ޲
    ϨΨγʔͳίʔυͷॻ͖׵͑
    υϝΠϯۦಈઃܭ
    ໊લ
    ৮Γ΍͢͞

    View Slide

  260. ·ͱΊ
    ΋͏͙͢೥
    ·ͩ·ͩΠέΔ
    ߴ଎ʹ։ൃͰ͖Δ

    View Slide

  261. ͍ͪͲ1FSM͔Βग़ͯ
    ΦϒδΣΫτࢦ޲΍%%%
    ֎ͷੈքͷ஌ݟΛ
    1FSMʹ࣋ͬͯؼΔ

    View Slide

  262. ׬

    View Slide