Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
課題をテストで解決する
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
shibayu36
April 20, 2014
Programming
2.5k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
課題をテストで解決する
shibayu36
April 20, 2014
More Decks by shibayu36
See All by shibayu36
非定型業務をAI slackbotで自動化する ~ 社内要望を自動壁打ちするbotを作った ~/automating-ad-hoc-work-with-ai-slackbot
shibayu36
0
750
顧客との商談議事録をみんなで読んで顧客解像度を上げよう
shibayu36
0
1k
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
5.4k
EMこそClaude Codeでコード調査しよう
shibayu36
0
1.2k
詳しくない分野でのVibe Codingで困ったことと学び/vibe-coding-in-unfamiliar-area
shibayu36
3
5.9k
個人CLAUDE.md紹介と設定から学んだこと/introduce-my-claude-md
shibayu36
0
2k
今の生産性改善活動で大切にしている考え方
shibayu36
8
8.8k
エンジニアメンター制度の効果的な運用を目指して/improve-mentor-system
shibayu36
27
10k
グレードイメージ具体化のため昇格理由を公開する
shibayu36
8
6k
Other Decks in Programming
See All in Programming
Claspは野良GASの夢をみるか
takter00
0
210
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
150
AI 輔助遺留系統現代化的經驗分享
jame2408
1
970
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.5k
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
1
110
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
210
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
140
Vite+ Unified Toolchain for the Web
naokihaba
0
340
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.5k
Performance Engineering for Everyone
elenatanasoiu
0
210
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
110
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
It's Worth the Effort
3n
188
29k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Evolving SEO for Evolving Search Engines
ryanjones
0
220
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
250
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
370
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
150
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
210
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ͷॻࣜϛε • ࢦఆͨ͠ϑΝΠϧύεΛؒҧ͑Δ • ϩδοΫϛε -> ςετ͋ΔͷͰ΄ͱΜͲͳ͍ ਓ͕ؾΛ͚ͭΔ
ςετͰΧόʔ
ςετ͍ͨ͜͠ͱ
[email protected]
! 10 5 * * * apache perl /path/to/dir/script/echo.pl!
30 09 * * * apache perl /path/to/dir/script/sleep.pl
ςετ͍ͨ͜͠ͱ
[email protected]
! 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ઃఆϑΝΠϧ ࣗಈςετ͠Α͏
·ͱΊ
ػցʹΒͤΔ ਓ͕ؾΛ͚ͭΔ ՝ ྫ) ςετ
͍͜͠ͱͯ͠ͳ͍ ୯ମςετΑΓΉ͠Ζ؆୯
ςετ͍Ζ͍Ζ͋ͬͯ ࢝Ίํ͔Βͳ͍
ʑͷ՝ΛςετͰ ղܾ͢Δͱ͜Ζ͔Β͡ΊΔ