Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
課題をテストで解決する
shibayu36
April 20, 2014
Programming
2
1.9k
課題をテストで解決する
shibayu36
April 20, 2014
Tweet
Share
More Decks by shibayu36
See All by shibayu36
今の生産性改善活動で大切にしている考え方
shibayu36
7
3.6k
エンジニアメンター制度の効果的な運用を目指して/improve-mentor-system
shibayu36
27
9.3k
グレードイメージ具体化のため昇格理由を公開する
shibayu36
8
5.2k
新機能作成時に開発ブランチに細かくmergeしていく戦略/merge-strategy-for-new-feature
shibayu36
6
16k
一から始めるJavaScriptユニットテスト/js-unit-test-from-scratch
shibayu36
8
31k
技術ブログを書くことについて/writing-tech-blog
shibayu36
17
25k
はてなと技術研修
shibayu36
1
5.5k
はてなブログチームの開発フローとGitHub
shibayu36
144
74k
Fluentd, mongoDB, Kibanaを利用したはてなブログABテストの事例
shibayu36
30
11k
Other Decks in Programming
See All in Programming
ZOZOTOWNにおけるDatadogの活用と、それを支える全社管理者の取り組み / 2022-07-27
tippy
1
3k
ちょっとつよい足トラ
logilabo
0
350
OSS貢献を気軽にしたい Let's Go Talk #1
yuyaabo
2
230
Rに管理されてみる
kazutan
0
250
パスワードに関する最近の動向
kenchan0130
1
320
フロントエンドエンジニアが変える現場のモデリング意識/modeling-awareness-changed-by-front-end-engineers
uggds
32
13k
クラウド KMS の活用 / TOKYO BLOCKCHAIN TECH MEETUP 2022
odanado
PRO
0
180
リーダブルテストコード / #vstat
jnchito
46
35k
JetpackCompose 導入半年で感じた 改善点
spbaya0141
0
140
Windows コンテナ Dojo 第5回 OpenShift で学ぶ Kubernetes 入門
oniak3ibm
PRO
0
130
Pythonによる開発をアップデートするライブラリの紹介
daikikatsuragawa
1
330
FargateとAthenaで作る、機械学習システム
nayuts
0
170
Featured
See All Featured
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
181
15k
Building Adaptive Systems
keathley
25
1.1k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
212
20k
The MySQL Ecosystem @ GitHub 2015
samlambert
239
11k
GraphQLの誤解/rethinking-graphql
sonatard
31
6.8k
Making the Leap to Tech Lead
cromwellryan
113
7.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
638
52k
Side Projects
sachag
450
37k
We Have a Design System, Now What?
morganepeng
35
3k
WebSockets: Embracing the real-time Web
robhawkes
57
5.5k
The Language of Interfaces
destraynor
148
21k
Designing with Data
zakiwarfel
91
4k
Transcript
՝ΛςετͰղܾ͢Δ DevLOVEؔ 2014/04/19 shiba_yu36
ࣗݾհ
!TIJCB@ZV • ͯͳΞϓϦέʔγϣϯΤϯδχΞ • ͯͳϒϩάνʔϜ • PerlɺςετɺσϓϩΠɺ։ൃڥ
ϒϩά http://shibayu36.hatenablog.com/
ࠓͷ ͯͳϒϩάͷςετ ՝Λղܾ͢Δςετࣄྫ ՝ͱςετ
ͯͳϒϩάͷςετ
UFTUT UFTUTNP CVJMETEBZ NJOCVJME FOHJOFFST
Perlͷ୯ମςετ ;Δ·͍ςετ Model DB Controller View JavaScript lint ͦͷଞ crontab
nginx ઃఆ߲ syntax
ςετͷํ • શͯͷϝιουΛςετ • PerlҎ֎ͷ෦ • ՝ΛςετͰΧόʔ
ςετͷํ • શͯͷϝιουΛςετ • PerlҎ֎ͷ෦ • ՝ΛςετͰΧόʔ
՝ΛςετͰΧόʔʁ
՝ʁ ॻࣜϛε ༁Ε υΩϡϝϯτ σβΠφͱͷڠۀ ઃఆϛε
՝ʁ ॻࣜϛε ༁Ε υΩϡϝϯτ σβΠφͱͷڠۀ ઃఆϛε ਓ͕ؾΛ͚ͭΔ
ਓ͕ؾΛ͚ͭΔ ՝ʁ ॻࣜϛε ༁Ε υΩϡϝϯτ σβΠφͱͷڠۀ ઃఆϛε ςετͰΧόʔ
՝Λղܾ͢Δςετ
ݴޠʹΑΒͳ͍ ՝ͱςετ ݴޠʹΑΔ ୯ମςετ
՝1 crontabΛσϓϩΠͨ͠Β ಈ͔ͳ͔ͬͨ
• crontabͷॻࣜϛε • ࢦఆͨ͠ϑΝΠϧύεΛؒҧ͑Δ • ϩδοΫϛε -> ςετ͋ΔͷͰ΄ͱΜͲͳ͍ ݪҼ
ݪҼ • crontabͷॻࣜϛε • ࢦఆͨ͠ϑΝΠϧύεΛؒҧ͑Δ • ϩδοΫϛε -> ςετ͋ΔͷͰ΄ͱΜͲͳ͍ ਓ͕ؾΛ͚ͭΔ
ςετͰΧόʔ
ςετ͍ͨ͜͠ͱ MAILTO=shibayu36@hatena.ne.jp! 10 5 * * * apache perl /path/to/dir/script/echo.pl!
30 09 * * * apache perl /path/to/dir/script/sleep.pl
ςετ͍ͨ͜͠ͱ MAILTO=shibayu36@hatena.ne.jp! 10 5 * * * apache perl /path/to/dir/script/echo.pl!
30 09 * * * apache perl /path/to/dir/script/sleep.pl ϑΝΠϧऴʹվߦ͋Δ ࢦఆϑΝΠϧଘࡏ͢Δ ࢦఆਖ਼͍͠
ϑΝΠϧऴʹվߦ͋Δ? my $crontab = file('config/crontab')->slurp;! like $crontab, qr/\n$/, 'ϑΝΠϧඌʹվߦඞཁ'; ϑΝΠϧ༰Λ
ਖ਼نදݱͰνΣοΫ
ࢦఆϑΝΠϧଘࡏ͢Δ? my @files = $crontab =~ m{/path/to/dir/(.*\.pl)}g;! ! for my
$file (@files) {! ok -e $file, "$file ͕ଘࡏ";! }
ࢦఆϑΝΠϧଘࡏ͢Δ? my @files = $crontab =~ m{/path/to/dir/(.*\.pl)}g;! ! for my
$file (@files) {! ok -e $file, "$file ͕ଘࡏ";! } QSPKFDUͬΆ͍ϑΝΠϧ୳͢ ͦΕͧΕϑΝΠϧ͋Δ͔
ߋʹςετ͢Δ • crontabͷParser࣮Λ͏ • PerlͩͱParse::Crontab • ͷࢦఆϛεͱ͔νΣοΫͯ͘͠ΕΔ
গ͠ͷςετͰਓ͕ ؾΛ͚ͭΔඞཁແ͘ͳͬͨ
՝2 ઃఆϛεΛͯ͠ σϓϩΠͯ͠͠·ͬͨ
ΞϓϦέʔγϣϯͷઃఆ • ڥ͝ͱͷઃఆͱ͔ • DBʹ֨ೲ͢Δ·Ͱͳ͍σʔλ • etc
[! {! "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"! ]! }! ]
[! {! "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@VSM63-Ͱ͋Δ
[! {! "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
[! {! "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 શମͰϢχʔΫ
Ͳ͏༷ͬͯΛ͑Δ? υΩϡϝϯτ ؾ͔ͮΕͳ͍ ϛεΛ͢Δ
͜Εςετʹͯ͠͠·͏
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_urlhttpͷURLͰ͋Δ";! ! cmp_deeply $config->{permission}, any('public', 'private'),! 'permissionpublic͔privateͰ͋Δ';! }
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_urlhttpͷURLͰ͋Δ";! ! cmp_deeply $config->{permission}, any('public', 'private'),! 'permissionpublic͔privateͰ͋Δ';! } CMPH@VSM63-Ͱ͋Δ QFSNJTTJPO QVCMJD͔QSJWBUF
CMPH@VSM શମͰϢχʔΫ my $blogs_config_uniq = [! uniq_by { $_->{blog_url} }
@$blogs_config,! ];! ! is scalar @$blogs_config_uniq,! scalar @$blogs_config,! "blog_url͕શମͰϢχʔΫͰ͋Δ";
υΩϡϝϯτ͔Βςετʹ • ؾ͔Εͳͯ͘ɺςετ͕མͪͯΒͤ ͯ͘ΕΔ • ϛε͕͋ͬͯςετͰݕ
IUUQTIJCBZVIBUFOBCMPHDPNFOUSZ ઃఆͷ༷ΛυΩϡϝϯτʹ ॻ͘ͷͰͳ͘ɺςετʹͯ͠͠·͏
ൃల • ઃఆͷΫϥεΛ࡞Δ • http://hitode909.hatenablog.com/entry/ 2014/04/10/114403
՝3 ༁ΛΕͯ σϓϩΠͯ͠͠·ͬͨ
ଟݴޠରԠͷΈ CMPHNBOBHF MPD bCMPHNBOBHF` ϒϩάཧ .BOBHF#MPH
<html>! <head>! <title>[% loc('blog.manage') %]</title>! </head>! <body>! <p>[% loc('blog.manage.description') %]</p>!
</body>! </html> <html>! <head>! <title>[% loc('blog.manage') %]</title>! </head>! <body>! <p>ϒϩάཧ͕Ͱ͖·͢</p>! </body>! </html>
Ͳ͏ͬͯݕ͢Δ͔ • Viewʹຊޠ͕ೖͬͯͳ͍͜ͱͷςετ • ຊਓͳͷͰɺେ͜ΕͰղܾͰ͖Δ
my @files = glob('templates/*.html');! ! for my $file (@files) {!
my $content = file($file)->slurp;! my $has_japanese = $content =~ /[^[:ascii:]]+/;! ok ! $has_japanese, "$file ຊޠΛؚ·ͳ͍";! } <html>! <head>! <title>[% loc('blog.manage') %]</title>! </head>! <body>! <p>ϒϩάཧ͕Ͱ͖·͢</p>! </body>! </html>
՝4 υΩϡϝϯτʹ ؾ͍ͮͯΒ͑ͳ͍
ରࡦ4 IUUQTIJCBZVIBUFOBCMPHDPNFOUSZ υΩϡϝϯτͷॴΛΒͤΔͨΊʹɺ མͪΔςετΛ࡞Δ
՝5 Nginxͷઃఆ͕ ϦϑΝΫλϦϯά͞Εͳ͍ ֬ೝ͕͍ͨ͠Ί
ରࡦ5 NginxΛҰ࣌తʹىಈͯ͠ ςετΛ͢Δ
IUUQTIJCBZVIBUFOBCMPHDPNFOUSZ nginxͷproxyઃఆϑΝΠϧ ࣗಈςετ͠Α͏
·ͱΊ
ػցʹΒͤΔ ਓ͕ؾΛ͚ͭΔ ՝ ྫ) ςετ
͍͜͠ͱͯ͠ͳ͍ ୯ମςετΑΓΉ͠Ζ؆୯
ςετ͍Ζ͍Ζ͋ͬͯ ࢝Ίํ͔Βͳ͍
ʑͷ՝ΛςετͰ ղܾ͢Δͱ͜Ζ͔Β͡ΊΔ