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
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.7k
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.1k
今の生産性改善活動で大切にしている考え方
shibayu36
8
8.9k
エンジニアメンター制度の効果的な運用を目指して/improve-mentor-system
shibayu36
27
10k
グレードイメージ具体化のため昇格理由を公開する
shibayu36
8
6k
Other Decks in Programming
See All in Programming
Hono + Inertia + React で LP を構築した話
oukayuka
2
180
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
36
21k
初めての模倣学習とVLA
natsutan
0
320
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
3.8k
My Marp Sample
sinoue0108
0
130
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
730
不幸な GC
chencmd
0
810
高専キャリア LT 発表内容
crysta1221
4
4.2k
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
450
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.8k
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
740
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
120
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Utilizing Notion as your number one productivity tool
mfonobong
4
560
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
800
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
750
Navigating Weather and Climate Data
rabernat
0
490
Side Projects
sachag
455
43k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
300
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
180
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
790
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
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ઃఆϑΝΠϧ ࣗಈςετ͠Α͏
·ͱΊ
ػցʹΒͤΔ ਓ͕ؾΛ͚ͭΔ ՝ ྫ) ςετ
͍͜͠ͱͯ͠ͳ͍ ୯ମςετΑΓΉ͠Ζ؆୯
ςετ͍Ζ͍Ζ͋ͬͯ ࢝Ίํ͔Βͳ͍
ʑͷ՝ΛςετͰ ղܾ͢Δͱ͜Ζ͔Β͡ΊΔ