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

課題をテストで解決する

shibayu36
April 20, 2014

 課題をテストで解決する

shibayu36

April 20, 2014
Tweet

More Decks by shibayu36

Other Decks in Programming

Transcript

  1. ՝୊ΛςετͰղܾ͢Δ
    DevLOVEؔ੢ 2014/04/19
    shiba_yu36

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. !TIJCB@ZV
    • ͸ͯͳΞϓϦέʔγϣϯΤϯδχΞ
    • ͸ͯͳϒϩάνʔϜ
    • PerlɺςετɺσϓϩΠɺ։ൃ؀ڥ

    View Slide

  4. ϒϩά
    http://shibayu36.hatenablog.com/

    View Slide

  5. ࠓ೔ͷ࿩
    ͸ͯͳϒϩάͷςετ
    ՝୊Λղܾ͢Δςετࣄྫ
    ՝୊ͱςετ

    View Slide

  6. ͸ͯͳϒϩάͷςετ

    View Slide

  7. UFTUT
    UFTUTNP
    CVJMETEBZ NJOCVJME
    FOHJOFFST

    View Slide

  8. Perlͷ୯ମςετ
    ;Δ·͍ςετ
    Model DB
    Controller View
    JavaScript
    lint
    ͦͷଞ
    crontab
    nginx
    ઃఆ߲໨
    syntax

    View Slide

  9. ςετͷํ਑
    • શͯͷϝιουΛςετ
    • PerlҎ֎ͷ෦෼΋
    • ՝୊ΛςετͰΧόʔ

    View Slide

  10. ςετͷํ਑
    • શͯͷϝιουΛςετ
    • PerlҎ֎ͷ෦෼΋
    • ՝୊ΛςετͰΧόʔ

    View Slide

  11. ՝୊ΛςετͰΧόʔʁ

    View Slide

  12. ՝୊ʁ
    ॻࣜϛε
    ຋༁๨Ε
    υΩϡϝϯτ
    σβΠφͱͷڠۀ
    ઃఆϛε

    View Slide

  13. ՝୊ʁ
    ॻࣜϛε
    ຋༁๨Ε
    υΩϡϝϯτ
    σβΠφͱͷڠۀ
    ઃఆϛε
    ਓ͕ؾΛ͚ͭΔ

    View Slide

  14. ਓ͕ؾΛ͚ͭΔ
    ՝୊ʁ
    ॻࣜϛε
    ຋༁๨Ε
    υΩϡϝϯτ
    σβΠφͱͷڠۀ
    ઃఆϛε
    ςετͰΧόʔ

    View Slide

  15. ՝୊Λղܾ͢Δςετ

    View Slide

  16. ݴޠʹΑΒͳ͍
    ՝୊ͱςετ
    ݴޠʹΑΔ
    ୯ମςετ

    View Slide

  17. ՝୊1
    crontabΛσϓϩΠͨ͠Β
    ಈ͔ͳ͔ͬͨ

    View Slide

  18. • crontabͷॻࣜϛε
    • ࢦఆͨ͠ϑΝΠϧύεΛؒҧ͑Δ
    • ϩδοΫϛε -> ςετ͋ΔͷͰ΄ͱΜͲͳ͍
    ݪҼ

    View Slide

  19. ݪҼ
    • crontabͷॻࣜϛε
    • ࢦఆͨ͠ϑΝΠϧύεΛؒҧ͑Δ
    • ϩδοΫϛε -> ςετ͋ΔͷͰ΄ͱΜͲͳ͍
    ਓ͕ؾΛ͚ͭΔ
    ςετͰΧόʔ

    View Slide

  20. ςετ͍ͨ͜͠ͱ
    [email protected]!
    10 5 * * * apache perl /path/to/dir/script/echo.pl!
    30 09 * * * apache perl /path/to/dir/script/sleep.pl

    View Slide

  21. ςετ͍ͨ͜͠ͱ
    [email protected]!
    10 5 * * * apache perl /path/to/dir/script/echo.pl!
    30 09 * * * apache perl /path/to/dir/script/sleep.pl
    ϑΝΠϧऴ୺ʹվߦ͋Δ
    ࢦఆϑΝΠϧଘࡏ͢Δ
    ೔෇ࢦఆਖ਼͍͠

    View Slide

  22. ϑΝΠϧऴ୺ʹվߦ͋Δ?
    my $crontab = file('config/crontab')->slurp;!
    like $crontab, qr/\n$/, 'ϑΝΠϧ຤ඌʹվߦඞཁ';
    ϑΝΠϧ಺༰Λ
    ਖ਼نදݱͰνΣοΫ

    View Slide

  23. ࢦఆϑΝΠϧଘࡏ͢Δ?
    my @files = $crontab =~ m{/path/to/dir/(.*\.pl)}g;!
    !
    for my $file (@files) {!
    ok -e $file, "$file ͕ଘࡏ";!
    }

    View Slide

  24. ࢦఆϑΝΠϧଘࡏ͢Δ?
    my @files = $crontab =~ m{/path/to/dir/(.*\.pl)}g;!
    !
    for my $file (@files) {!
    ok -e $file, "$file ͕ଘࡏ";!
    }
    QSPKFDU಺ͬΆ͍ϑΝΠϧ୳͢
    ͦΕͧΕϑΝΠϧ͋Δ͔

    View Slide

  25. ߋʹςετ͢Δ
    • crontabͷParser࣮૷Λ࢖͏
    • PerlͩͱParse::Crontab
    • ೔෇ͷࢦఆϛεͱ͔νΣοΫͯ͘͠ΕΔ

    View Slide

  26. গ͠ͷςετͰਓ͕
    ؾΛ͚ͭΔඞཁແ͘ͳͬͨ

    View Slide

  27. ՝୊2
    ઃఆϛεΛͯ͠
    σϓϩΠͯ͠͠·ͬͨ

    View Slide

  28. ΞϓϦέʔγϣϯͷઃఆ
    • ؀ڥ͝ͱͷઃఆͱ͔
    • DBʹ֨ೲ͢Δ·Ͱ΋ͳ͍σʔλ
    • etc

    View Slide

  29. [!
    {!
    "blog_url" : "http://shibayu36.hatenablog.com/",!
    "permission" : "public",!
    "can_be_edited_by" : [!
    "shiba_yu36"!
    ]!
    },!
    {!
    "blog_url" : "http://shibayu36-private.hatenablog.com/",!
    "permission" : "private",!
    "can_be_edited_by" : [!
    "shiba_yu36",!
    "shiba_yu37"!
    ]!
    },!
    {!
    "blog_url" : "http://blog.example.com/",!
    "permission" : "public",!
    "can_be_edited_by" : [!
    "example-user"!
    ]!
    }!
    ]

    View Slide

  30. [!
    {!
    "blog_url" : "http://shibayu36.hatenablog.com/",!
    "permission" : "public",!
    "can_be_edited_by" : [!
    "shiba_yu36"!
    ]!
    },!
    {!
    "blog_url" : "http://shibayu36-private.hatenablog.com/",!
    "permission" : "private",!
    "can_be_edited_by" : [!
    "shiba_yu36",!
    "shiba_yu37"!
    ]!
    },!
    {!
    "blog_url" : "http://blog.example.com/",!
    "permission" : "public",!
    "can_be_edited_by" : [!
    "example-user"!
    ]!
    }!
    ]
    CMPH@VSM͸63-Ͱ͋Δ

    View Slide

  31. [!
    {!
    "blog_url" : "http://shibayu36.hatenablog.com/",!
    "permission" : "public",!
    "can_be_edited_by" : [!
    "shiba_yu36"!
    ]!
    },!
    {!
    "blog_url" : "http://shibayu36-private.hatenablog.com/",!
    "permission" : "private",!
    "can_be_edited_by" : [!
    "shiba_yu36",!
    "shiba_yu37"!
    ]!
    },!
    {!
    "blog_url" : "http://blog.example.com/",!
    "permission" : "public",!
    "can_be_edited_by" : [!
    "example-user"!
    ]!
    }!
    ]
    QFSNJTTJPO͸
    QVCMJD͔QSJWBUF

    View Slide

  32. [!
    {!
    "blog_url" : "http://shibayu36.hatenablog.com/",!
    "permission" : "public",!
    "can_be_edited_by" : [!
    "shiba_yu36"!
    ]!
    },!
    {!
    "blog_url" : "http://shibayu36-private.hatenablog.com/",!
    "permission" : "private",!
    "can_be_edited_by" : [!
    "shiba_yu36",!
    "shiba_yu37"!
    ]!
    },!
    {!
    "blog_url" : "http://blog.example.com/",!
    "permission" : "public",!
    "can_be_edited_by" : [!
    "example-user"!
    ]!
    }!
    ]
    CMPH@VSM͸
    શମͰϢχʔΫ

    View Slide

  33. Ͳ͏΍ͬͯ࢓༷Λ఻͑Δ?
    υΩϡϝϯτ
    ؾ͔ͮΕͳ͍
    ϛεΛ͢Δ

    View Slide

  34. ͜Ε΋ςετʹͯ͠͠·͏

    View Slide

  35. my $blogs_config = decode_json(file('blogs.json')->slurp);!
    !
    for my $config (@$blogs_config) {!
    !
    my $blog_url = URI->new($config->{blog_url});!
    is $blog_url->scheme, 'http', "blog_url͸httpͷURLͰ͋Δ";!
    !
    cmp_deeply $config->{permission}, any('public', 'private'),!
    'permission͸public͔privateͰ͋Δ';!
    }

    View Slide

  36. my $blogs_config = decode_json(file('blogs.json')->slurp);!
    !
    for my $config (@$blogs_config) {!
    !
    my $blog_url = URI->new($config->{blog_url});!
    is $blog_url->scheme, 'http', "blog_url͸httpͷURLͰ͋Δ";!
    !
    cmp_deeply $config->{permission}, any('public', 'private'),!
    'permission͸public͔privateͰ͋Δ';!
    }
    CMPH@VSM͸63-Ͱ͋Δ
    QFSNJTTJPO͸
    QVCMJD͔QSJWBUF

    View Slide

  37. CMPH@VSM͸
    શମͰϢχʔΫ
    my $blogs_config_uniq = [!
    uniq_by { $_->{blog_url} } @$blogs_config,!
    ];!
    !
    is scalar @$blogs_config_uniq,!
    scalar @$blogs_config,!
    "blog_url͕શମͰϢχʔΫͰ͋Δ";

    View Slide

  38. υΩϡϝϯτ͔Βςετʹ
    • ؾ෇͔Εͳͯ͘΋ɺςετ͕མͪͯ஌Βͤ
    ͯ͘ΕΔ
    • ϛε͕͋ͬͯ΋ςετͰݕ஌

    View Slide

  39. IUUQTIJCBZVIBUFOBCMPHDPNFOUSZ

    ઃఆͷ࢓༷ΛυΩϡϝϯτʹ
    ॻ͘ͷͰ͸ͳ͘ɺςετʹͯ͠͠·͏

    View Slide

  40. ൃల
    • ઃఆͷΫϥεΛ࡞Δ
    • http://hitode909.hatenablog.com/entry/
    2014/04/10/114403

    View Slide

  41. ՝୊3
    ຋༁Λ๨Εͯ
    σϓϩΠͯ͠͠·ͬͨ

    View Slide

  42. ଟݴޠରԠͷ࢓૊Έ
    CMPHNBOBHF
    MPD bCMPHNBOBHF`

    ϒϩά؅ཧ .BOBHF#MPH

    View Slide

  43. !
    !
    [% loc('blog.manage') %]!
    !
    !
    [% loc('blog.manage.description') %]!
    !

    !
    !
    [% loc('blog.manage') %]!
    !
    !
    ϒϩά؅ཧ͕Ͱ͖·͢!
    !

    View Slide

  44. Ͳ͏΍ͬͯݕ஌͢Δ͔
    • Viewʹ೔ຊޠ͕ೖͬͯͳ͍͜ͱͷςετ
    • ೔ຊਓͳͷͰɺେ఍͜ΕͰղܾͰ͖Δ

    View Slide

  45. my @files = glob('templates/*.html');!
    !
    for my $file (@files) {!
    my $content = file($file)->slurp;!
    my $has_japanese = $content =~ /[^[:ascii:]]+/;!
    ok ! $has_japanese, "$file ͸೔ຊޠΛؚ·ͳ͍";!
    }
    !
    !
    [% loc('blog.manage') %]!
    !
    !
    ϒϩά؅ཧ͕Ͱ͖·͢!
    !

    View Slide

  46. ՝୊4
    υΩϡϝϯτʹ
    ؾ͍ͮͯ΋Β͑ͳ͍

    View Slide

  47. ରࡦ4
    IUUQTIJCBZVIBUFOBCMPHDPNFOUSZ

    υΩϡϝϯτͷ৔ॴΛ஌ΒͤΔͨΊʹɺ
    མͪΔςετΛ࡞Δ

    View Slide

  48. ՝୊5
    Nginxͷઃఆ͕
    ϦϑΝΫλϦϯά͞Εͳ͍
    ֬ೝ͕೉͍ͨ͠Ί

    View Slide

  49. ରࡦ5
    NginxΛҰ࣌తʹىಈͯ͠
    ςετΛ͢Δ

    View Slide

  50. IUUQTIJCBZVIBUFOBCMPHDPNFOUSZ

    nginxͷproxyઃఆϑΝΠϧ΋
    ࣗಈςετ͠Α͏

    View Slide

  51. ·ͱΊ

    View Slide

  52. ػցʹ΍ΒͤΔ
    ਓ͕ؾΛ͚ͭΔ
    ՝୊
    ྫ) ςετ

    View Slide

  53. ೉͍͜͠ͱͯ͠ͳ͍
    ୯ମςετΑΓΉ͠Ζ؆୯

    View Slide

  54. ςετ͍Ζ͍Ζ͋ͬͯ
    ࢝Ίํ෼͔Βͳ͍

    View Slide

  55. ೔ʑͷ՝୊ΛςετͰ
    ղܾ͢Δͱ͜Ζ͔Β͸͡ΊΔ

    View Slide