Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

͸ͯͳϒϩάͷςετ

Slide 7

Slide 7 text

UFTUT UFTUTNP CVJMETEBZ NJOCVJME FOHJOFFST

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

՝୊ΛςετͰΧόʔʁ

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

՝୊Λղܾ͢Δςετ

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

[! {! "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"! ]! }! ]

Slide 30

Slide 30 text

[! {! "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-Ͱ͋Δ

Slide 31

Slide 31 text

[! {! "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

Slide 32

Slide 32 text

[! {! "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͸ શମͰϢχʔΫ

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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Ͱ͋Δ';! }

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

ଟݴޠରԠͷ࢓૊Έ CMPHNBOBHF MPD bCMPHNBOBHF` ϒϩά؅ཧ .BOBHF#MPH

Slide 43

Slide 43 text

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

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

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

ϒϩά؅ཧ͕Ͱ͖·͢

! !

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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') %]! ! !

ϒϩά؅ཧ͕Ͱ͖·͢

! !

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

·ͱΊ

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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