Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
課題をテストで解決する
Search
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
1.4k
顧客との商談議事録をみんなで読んで顧客解像度を上げよう
shibayu36
0
1.1k
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
5.8k
EMこそClaude Codeでコード調査しよう
shibayu36
0
1.2k
詳しくない分野でのVibe Codingで困ったことと学び/vibe-coding-in-unfamiliar-area
shibayu36
3
6k
個人CLAUDE.md紹介と設定から学んだこと/introduce-my-claude-md
shibayu36
0
2.2k
今の生産性改善活動で大切にしている考え方
shibayu36
8
8.9k
エンジニアメンター制度の効果的な運用を目指して/improve-mentor-system
shibayu36
27
10k
グレードイメージ具体化のため昇格理由を公開する
shibayu36
8
6.1k
Other Decks in Programming
See All in Programming
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
400
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
100
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
560
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
420
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
320
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
970
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
440
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
220
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
270
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
360
速習iPhone Duo対応
yuukiw00w
2
880
すこし踏み込む CancellationToken
htkym
2
1.4k
Featured
See All Featured
Building AI with AI
inesmontani
PRO
1
1.3k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
The Invisible Side of Design
smashingmag
301
52k
Context Engineering - Making Every Token Count
addyosmani
9
1.2k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
The Curse of the Amulet
leimatthew05
3
15k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Navigating Weather and Climate Data
rabernat
0
540
Art, The Web, and Tiny UX
lynnandtonic
304
22k
A designer walks into a library…
pauljervisheath
211
25k
Leo the Paperboy
mayatellez
10
2.3k
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ઃఆϑΝΠϧ ࣗಈςετ͠Α͏
·ͱΊ
ػցʹΒͤΔ ਓ͕ؾΛ͚ͭΔ ՝ ྫ) ςετ
͍͜͠ͱͯ͠ͳ͍ ୯ମςετΑΓΉ͠Ζ؆୯
ςετ͍Ζ͍Ζ͋ͬͯ ࢝Ίํ͔Βͳ͍
ʑͷ՝ΛςετͰ ղܾ͢Δͱ͜Ζ͔Β͡ΊΔ