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
Hatena Blog Development Flow
Search
Yasuhiro Onishi
September 21, 2013
Technology
38k
34
Share
Hatena Blog Development Flow
はてなブログの開発フロー
YAPC ASIA Tokyo 2013 で発表したものです
Yasuhiro Onishi
September 21, 2013
More Decks by Yasuhiro Onishi
See All by Yasuhiro Onishi
「手を動かした者だけが世界を変える」ソフトウェア開発だけではない開発者人生
onishi
18
11k
アニメから得た学びを発表会 in 関西 はてな スポンサーLT
onishi
1
85
大吉祥寺.pm 基調講演
onishi
4
9k
YAPC::Kyoto 2023 Keynote
onishi
3
11k
2016 Devsumi Kansai
onishi
3
1.6k
Hatena-Camp
onishi
2
4.6k
Hatena Blog for Engineer
onishi
2
3.2k
hatena-diary-blog-xss
onishi
5
1.2k
wget.pl
onishi
3
1.5k
Other Decks in Technology
See All in Technology
責任あるソフトウェアエンジニアリングの紹介4章・5章 / RSE_Ch4-5
ido_kara_deru
0
370
さきさん文庫の書籍ができるまで
sakiengineer
0
300
形式手法特論:公平性制約の位相的特徴づけ #kernelvm / Kernel VM Study Kansai 12th
ytaka23
1
570
Spring Boot における AOT Cache 活用テクニックと 起動時間改善事例
ntt_dsol_java
0
170
組織の中で自分を経営する技術
shoota
0
220
権限管理設計を完全に理解した
rsugi
2
240
管理アカウント単一運用からAWS Organizationsに移行するの大変で滅
hiramax
0
300
電子辞書Brainをネットに繋げてみた(自力編)
raspython3
0
310
プラットフォームエンジニア ワークショップ/ platform-workshop
databricksjapan
0
120
APIテストとは?
nagix
0
150
Anthropic AIネイティブ・スタートアップ構築のプレイブック を理解する
nagatsu
0
220
最低限これだけ押さえれ大丈夫_Claude Enterprise/Team企業展開ガバナンス入門
tkikuchi
1
530
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
380
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
エンジニアに許された特別な時間の終わり
watany
107
240k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Are puppies a ranking factor?
jonoalderson
1
3.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
590
4 Signs Your Business is Dying
shpigford
187
22k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.3k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Tell your own story through comics
letsgokoyo
1
930
Transcript
2013/09/21 YAPC ASIA TOKYO גࣜձࣾͯͳ େ߁༟JEPOJTIJ ͯͳϒϩάͷ ։ൃϑϩʔ
ɹJEPOJTIJେ߁༟ ɹ0/*4)* ɹ!ZBTVIJSP@POJTIJ ɹגࣜձࣾͯͳ ɹͯͳϒϩά
%FWFM,5:1SPG 5FYU)BUFOB 8FC&NCFE 3FENJOF$IBO
ͯͳϒϩά IBUFOBCMPHDPN
ͯͳϒϩά w݄։ൃ։࢝ w1FSM w1MBDL14(* 4UBSMFU w$BSUPO w3PVUFS4JNQMF $POpH&/7 w%#*XSBQQFS42-.BLFS wDBQJTUSBOP
ϒϩάάϧʔϓͰɺͯͳεϖʔεͱ࿈ܞͯ͠ܝࣔ൘ΛઃஔͰ͖ΔΑ͏ʹ͠·ͨ͠ϒϩάͷίϝϯτ Λɺͯͳ*%Λࢦఆͯ͠ڋ൱Ͱ͖ΔΑ͏ʹ͠·ͨ͠εϚʔτϑΥϯJ1BEͰॻ͖͘͢ɺಡΈ͢ ͍ʂJ04ΞϓϦΛϢχόʔαϧΞϓϦԽ͠·ͨ͠'MJDLS͔Βͷը૾ͷݕࡧͱషΓ͚ʹରԠ͠·͠ ͨιʔείʔυΛ؆୯ʹڞ༗͠Α͏ʂ(JTU͔ΒͷషΓ͚ʹରԠ͠·ͨ͠Πϥ ετɾϚϯΨ࡞Λϒϩάʹߘ͠Α͏ʂQJYJW͔ΒͷషΓ͚ʹରԠ͠·ͨͯ͠ͳϒϩά"UPN1VC"1*Λެ ։͠·ͨ͠ɻαʔυύʔςΟͷϒϩάߘπʔϧΛར༻ɾ࡞Ͱ͖·͢هࣄΛॻ͖ͳ͕ΒදࣔΛ֬ ೝʂฤूը໘ʹϦΞϧλΠϜϓϨϏϡʔػೳΛՃ͠·ͨ͠ϒϩάάϧʔϓʹࢀՃ͢Δࡍʹɺهࣄ ͷΧςΰϦʔΛࢦఆͰ͖ΔΑ͏ʹ͠·ͨ͠ϔομϝχϡʔΛϦχϡʔΞϧʂϒϩάΛॻ͘ͱ͖ಡΉ ͱ͖ʹศརʹͳΓ·͓ͨ͠ֆඳ͖ػೳΛύϫʔΞοϓʂʮಁ໌ϖϯʯʮృΓͭͿ͠ʯʮεϙΠ τʯΛՃ͠·ͨ͠ಈըͷషΓ͚ΛڧԽʂχίχίಈըͱ*OTUBHSBNಈըʹରԠ͠·ͨ͠
ίϝϯτཝͳͲͰχοΫωʔϜΛදࣔɺϦϯΫϘλϯͰλΠτϧΛࣗಈऔಘɺͳͲͷػೳՃΛߦ͍· ͨ͠ϒϩάͰ؆୯ͳֆΛॻ͜͏ʂฤूαΠυόʔʹʮ͓ֆඳ͖ػೳʯΛՃ͠·ͨ͠ ฤूը໘ʹʮҾ༻ʯϘλϯΛՃɺஶ໊ਓϒϩάϖʔδΛެ։ɺ΄͔ϒϩάͰؒΛݟ͚ͭΑ ͏ʂͯͳϒϩάάϧʔϓΛެ։͠·ͨ͠5VNCMSͰڞ༗͘͢͠ͳͬͨ΄͔ɺଟ͘ͷػೳՃɾ मਖ਼Λߦ͍·ͨ͠.5ܗࣜͷϒϩάΠϯϙʔτʹରԠʂͯͳ֎ͷαʔϏε͔ΒҠߦ͘͢͠ͳΓ· ͨ͠ʮ-*/&ͰૹΔʯ΄͔ɺ͍͔ͭ͘ͷػೳՃɾमਖ਼Λߦ͍·ͨ͠σβΠϯς ʔϚςʔϚετΞΛ͞ΒʹڧԽͨ͠΄͔ɺԼॻ͖ҰཡͳͲΛՃ͠·͓ͨͨͤ͠͠·ͨ͠ɻͯ ͳϒϩάͱͯͳμΠΞϦʔͷશυϝΠϯͰ5XJUUFS$BSETʹରԠ͠·͍ͨ͠ϒϩάεοΩϦ ͱදࣔɻهࣄΛׂ͢Δʮଓ͖ΛಡΉʯه๏ΛϦϦʔε͠·ͨͯ͠ͳϒϩά͕5XJUUFS$BSETʹ ରԠ͠·ͨ͠ɻπΠʔτͰهࣄͷ֓ཁ͕දࣔ͞Ε·͢ʦه͋Γʧʦ࠶ه͋Γඒຯ͍͠ใΛϒϩ άʹʂฤूαΠυόʔ͔ΒϨετϥϯΛհͰ͖ΔΑ͏ʹ͠·ͨ͠σβΠϯςʔϚςʔϚετΞΛ ڧԽʂͦͷ΄͔ଟͷػೳՃɾमਖ਼Λߦ͍·ͨ͠εϚʔτϑΥϯεϚϗͷฤूπʔϧόʔ͕ύϫ ʔΞοϓʂషΓ͚ػೳͰɺͯͳ5γϟπΛΒ͓͏ʂʂهࣄ͝ͱͷϒοΫϚʔΫ͍͍Ͷʂ ΛɺτοϓϖʔδͰ֬ೝͰ͖ΔΑ͏ʹ͠·ͨ͠σβΠϯςʔϚϒϩάͬͱՄѪ͘ͳͪ͘Όʂ ެࣜσβΠϯςʔϚʹʮ#,6."ʯΛՃ͠·ͨ͠τϐοΫ͍·Γ্͕ͬͯΔ͋ͷʹࢀՃ͠ Α͏ʂʮτϐοΫʯϖʔδΛϦϦʔε͠·ͨ͠σβΠϯςʔϚΦϦδφϧͷςʔϚΛڞ༗͠Α͏ʂ ि࿈ଓ ৽ػೳ ϦϦʔε
QVMMSFRVFTUT DPNNJUT QFSZFBS
PO
ຊͷΞδΣϯμ w()&Λத৺ʹͨ͠։ൃϑϩʔ wࣗಈԽɾޮԽɾ҆ఆԽͷͨΊ ͷऔΈ w ։ൃϑϩʔҎ֎ͷ5*14গ͠
ຊͷ·ͱΊ wࣗಈԽͰ͖ΔͷࣗಈԽ͢Δ wϛεͷ࠶ൃࢭΛΈԽ͢Δ
Α͍։ൃϓϩηε wϓϩηεͷϑϨʔϜϫʔΫԽ w҆৺ײɺϚωδϝϯτੑ wඪ४Խ୭͕ͬͯେৎ wνʔϜαʔϏεʹ͋ͬͨͷ
Α͍։ൃϓϩηε wλεΫཧɺϫʔΫϑϩʔ wςετɺ$* wϦϦʔεཧ
λεΫཧɺ ϫʔΫϑϩʔ
:"1$
:"1$
:"1$
:"1$
wιʔγϟϧίʔσΟϯά w*TTVF1VMM3FRVFTU w1SJWBUF3FQPTJUPSZ wใڞ༗ɾϨϏϡʔπʔϧ
w༏ઌ͕ແ͍ wظ͕ͳ͍ wෳਓΞαΠϯͰ͖ͳ͍ wΨϯτνϟʔτͳʹͦΕ (JU)VC*TTVF
(JU)VCͷ*TTVF λεΫཧπʔϧͰͳ͍
͓͢͢Ί w(JU)VCϨϏϡʔπʔϧ wλεΫཧπʔϧͱซ༻͠Α͏ wUSFMMPDPNͱ͔
ͯͳϒϩάνʔϜ wπʔϧΛز͍ͭͨ͘ͳ͍ wແཧΓ(JU)VC͚ͩͰΔ
։ൃͷྲྀΕ wதظܭը wظܭը ݄ wΞαΠϯ w։ൃ wϦϦʔε
CSBODIઓུ wNBTUFS wຊ൪ͱಉҰɺৗʹ݈શ wTUBHJOHNBTUFS wϦϦʔεՄೳͳͷ͕શͯ NFSHF͞Ε͍ͯΔ wUPQJDCSBODI wػೳ͝ͱͷ։ൃϒϥϯν
CSBODIઓུ NBTUFS TUBHJOHNBTUFS UPQJDCSBODI UPQJDCSBODI SFMFBTF
*TTVF׆༻ w*TTVF w1SPEVDU#BDLMPH w୭Ͱొ͍͍ͯ͠ w"TTJHOFE*TTVF w4QSJOU#BDLMPH wΞαΠϯݖݶσΟϨΫλʔ w༏ઌϥϕϧͰ؆қཧ
*TTVF13 wணखͨ͠Β͙͢1VMM3FRVFTU wਐߦϥϕϧͰཧ wϨϏϡʔ͕ࡁΜͩΒTUBHJOH NBTUFSʹNFSHF
͙͢1VMM3FRVFTU w༷ݕ౼1VMM3FRVFTU্Ͱ w༷ͷϨϏϡʔ wσβΠφʔ1VMM3FRVFTU wͳΜͰ*TTVF্Ͱձ
*TTVFొ ΞαΠϯ13 ϨϏϡʔґཔ ϨϏϡʔத ϦϦʔεͪ
TUBUJOHNBTUFS NBTUFS ϦϦʔε ϥϕϧͰ ཧ
ΞαΠϯ wಉܥ౷ͷࣄΛಉ͡ΤϯδχΞ ʹΞαΠϯ͚ͭͮ͠ΔଐਓԽ wҙࣝͯ͠୲Λม͑Δ
ΞαΠϯ͓Έ͘͡ wIUUQ IJUPEFBQQTQPUDPN BTTJHO@PNJLVKJ
QVMMSFRMBCFM w1VMM3FRVFTUϥϕϧΛؾܰ ʹม͑ΒΕͳ͍ w"1*Ͱม͑ΒΕΔ w$ISPNF֦ுΛར༻
None
None
None
None
IUUQTHJUIVCDPN TIJNPCBZBTIJ QVMMSFRMBCFM
னա͗ϨϏϡʔλΠϜ wຖϥϯνޙʙ wʮϨϏϡʔͪʯϑϥάͷ *TTVFΛย͔ͬΒॲཧ͢Δ
৽ن*TTVFొ javascript: location.href = 'http://GHE/USER/REPOS/issues/new? title=' + document.getSelection().toString() || document.title
+ '&body=' + location.href
৽ن*TTVFొ
৽ن*TTVFొ UJUMF CPEZ BTTJHOFF NJMFTUPOF MBCFMT
NJMFTUPOF wNJMFTUPOFظΛઃఆͰ͖Δ
NJMFTUPOF wJTTVFΛNJMFTUPOFʹඥ͚Δ
ઢද
εέδϡʔϧཧ wσΟϨΫλʔ͕ઢදཧ wਐ֬ೝɺεέδϡʔϧҾ͖͠ XFFLMZ wΤϯδχΞ͕͏πʔϧHIF ͚ͩ
*TTVF·ͱΊ w*TTVFͰ༏ઌͱظ͕ܾΊ ΒΕͳ͍ w༏ઌΞαΠϯͷ༗ແͱϥϕ ϧͰ wظNJMFTUPOF͔ผͰཧ
ςετɺ$*
ςετͷجຊ wසൟʹ࣮ߦ͢ΔʢࣗಈԽ͢Δʣ wෆ۩߹͕͋ͬͨΒճؼςετ wཏతͳςετ͕͋Ε҆৺ͯ͠ ϦϑΝΫλϦϯάͰ͖Δ
ςετ w։ൃऀͷखݩͷςετ wϑΝΠϧมߋΛࣗಈݕ wKFOLJOTʹΑΔ$* wͲͷϒϥϯνͰɺQVTIͨ͠ Βࣗಈςετ wTUBHJOHNBTUFSͷQVTI ͞Βʹಛผѻ͍ ޙड़
KFOLJOT wϝΠϯ wશϒϥϯν͕QVTIຖʹςε τ͞ΕΔ wϦϦʔε wTUBHJOHNBTUFS NBTUFS wΧόϨοδ wΧόϨοδઐ༻ճΔ
ςετϞδϡʔϧ w)BSSJFU w5FTUNZTRME wQSPWFຖʹNZTRMEΛཱͯΔ w%#*Y3FXSJUF%4/
$BTQFS+4 w+4Ͱ࡞ΒΕͨ1IBOUPN+4ͷϢ ʔςΟϦςΟ wIUUQDBTQFSKTPSH wςετ$P⒎FF4DSJQUͰهड़ w;Δ·͍ͷςετΛॻ͘
None
ςϯϓϨʔτͷςετ w9TMBUFͷςϯϓϨʔτͷςετ wςϯϓϨʔτ͕ίϯύΠϧՄೳ͔ wຊޠؚ·Εͯͳ͍͔ ࠃࡍԽ
ίʔυΧόϨοδ
NFUSJDTςετ wίʔυͷෳࡶ͞Λςετ wϦϑΝΫλϦϯάରબఆ wIUUQTNFUBDQBOPSH NPEVMF1FSM.FUSJDT-JUF
॥తෳࡶ ϝιουͷ͞
ςετͷ·ͱΊ wগͣͭ͠ͰͰ͖ΔςετΛ૿ ͍ͯ͘͠ wෆ۩߹͕͋ͬͨΒճؼςετΛ ͭ͘ΔɺͳͲಉ͡ϛεΛ܁Γฦ ͞ͳ͍
ϦϦʔεཧ
ϦϦʔεཧ wͳΔ͘͘εςʔδϯάڥʹ w։ൃςετσϓϩΠ w͍ϑΟʔυόοΫ wେ͖ͳखΓΛແ͘͢
ܭըϦϦʔε w։ൃܭըͰϦϦʔεΛఆΊ͍ͯ Δͷ
ఆظϦϦʔε wि࣍ϦϦʔεʢຖिਫ༵ʣ wఆظϦϦʔεʹؒʹ߹ΘͤΑ͏ ͱ͍͏ҙ͕ࣝಇ͘ w۠Γ͕͍ͭͯ։ൃͷϦζϜ͕ ͏·ΕΔ
ܧଓϦϦʔε wTUBHJOHNBTUFSͷNFSHF ͕*3$ʹ௨͞ΕΔ w͋Δఔ૿͑ͨΒϦϦʔε w݁ہɺຖϦϦʔε ˞ͨͩ͠ɺٳલϦϦʔεېࢭ 18:25 ikachan01: ʲϦϦʔεʳHatena::Epic::Admin::EntryϦϑΝΫλϦϯά (4݅)
https://...
EFTDSJCFQVMMSFRVFTUSC wTUBHJOHNBTUFSͷςετ͕௨ ͬͨΒࣗಈ࣮ߦ͞ΕΔ wϦϦʔε༻ͷQVMMSFRVFTU wHGNͷνΣοΫϦετػೳ w<>νΣοΫϦετ0'' w<Y>νΣοΫϦετ0/
None
None
None
18:25 hitode909: https://... ஶ໊ʹΤϯδχΞΛՃ ͜ΕϦϦʔε͍͍ͯ͠Ͱ͔͢ > onishi 18:26 onishi ϦϦʔε͓Ͷ͕͍͠·͢
> hitode909 18:30 hitode909: https://... ஶ໊ʹΤϯδχΞΛՃ ϦϦʔε͠·ͨ͠ > #diary 18:31 hitode909: https://... ஶ໊ʹΤϯδχΞΛՃ ຊ൪֬ೝ͓ئ͍͠·͢ > hitode909
18:25 hitode909: https://... ஶ໊ʹΤϯδχΞΛՃ ͜ΕϦϦʔε͍͍ͯ͠Ͱ͔͢ > onishi 18:26 onishi ϦϦʔε͓Ͷ͕͍͠·͢
> hitode909 18:30 hitode909: https://... ஶ໊ʹΤϯδχΞΛՃ ϦϦʔε͠·ͨ͠ > #diary 18:31 hitode909: https://... ஶ໊ʹΤϯδχΞΛՃ ຊ൪֬ೝ͓ئ͍͠·͢ > hitode909 ίϐϖ ίϐϖ ίϐϖ
EFTDSJCFQVMMSFRVFTUSC ۙެ։༧ఆ
ϩʔΧϧ։ൃ wTFUVQεΫϦϓτ wNZTRMEJ⒎ wIUUQTHJUIVCDPN POJTIJNZTRMEJ⒎ wQMFOW SCFOW w$BSUPO #VOEMFS
EFWIPTU wτϐοΫϒϥϯνΛ؆୯ʹαʔ όʔ্Ͱ࣮ߦ͢ΔΈ wDBQEFWIPTUTFUVQ wϒϥϯν໊͔ΒࣗಈͰυϝΠϯ ͕ܾఆ͠ɺݕূڥ͕ग़དྷΔ
EFWIPTUSPVUJOH wSFWFSTFQSPYZ OHJOY ͷઃ ఆʹҰʑQVTIͨ͘͠ͳ͍ wOHJOY MVBͰಈతϧʔςΟϯ ά wOHY@MVBϞδϡʔϧ
location / { proxy_set_header Host $http_host; set $upstream_socket ""; rewrite_by_lua
' local m = ngx.re.match( ngx.var.host, "^([^.]+[.]dev)[.]" ) if m then ngx.var.upstream_socket = "/tmp/"..m[1]..".sock" else ngx.exit(ngx.HTTP_NOT_FOUND) end '; proxy_pass http://unix:$upstream_socket; }
ͦͷଞͷͱΓ͘Έ
"#ςετ wݕূՄೳͳͷΛϦϦʔε͢Δ w໎ͬͨΒग़ͯ֬͠ೝͨ͠ΒΑ͍ wˠϦϦʔεαΠΫϧ͕͘ͳΔ
"#ςετ wDIBOLPతͳͷ wಛఆͷ݅ͰػೳΛग़͚͠Δ wελοϑҙͰ݅Λ͍͡Ε Δ
ܭଌɾ౷ܭ wαʔϏεʹ͓͚Δ,1* wΫϦοΫܭଌ w+4ؚΊͨϖʔδͷදࣔ w6"ຖͷ+4Τϥʔ wΤϯδχΞຖͷJTTVF
ϖʔδදࣔ
JTTVF
*3$ར༻ wEJBSZνʔϜશһʹ௨ wϑΟʔυόοΫ wΤΰαʔν wTUBHJOHNBTUFSঢ়گ wKFOLJOTͷςετ࣮ߦ݁Ռ wຊ൪ͷΤϥʔ
ڭҭ wݚम wIUUQTHJUIVCDPN IBUFOB)BUFOB5FYUCPPL wίʔσΟϯάن wϖΞϓϩٛԽ
ϖΞϓϩάϥϛϯά wຖिϖΞ࣮ࢪ͢ΔͷΛϧʔϧԽ wҰਓͰΔͷ͕ਏ͍λεΫΛ Δ͖͔͚ͬʹ wศརؔΤσΟλઃఆͳͲͷ ҉͕ڞ༗͞ΕΔ
ϦϑΝΫλϦϯά wNFUSJDTΛࢀߟʹϦϑΝΫλϦ ϯάରΛબఆ wि˓࣌ؒͱ͔࣌ؒΛܾΊΔ wখ͍͞୯ҐͰ1VMM3FRVFTU
·ͱΊ wਓϛεΛ͢ΔͷͰΈԽɾ πʔϧར༻Λ৺͕͚Δ w։ൃϑϩʔͷվળʹίετΛ͔ ͚Δ w݁ہτʔλϧͷύϑΥʔϚϯ εɺαʔϏε্࣭͢Δ
ਓࡐืू w҆৺ͯ͠։ൃͰ͖ΔڥͰҰॹʹɹɹ ϒϩάΛ࡞Γ·͠ΐ͏ʂ www.hatena.ne.jp/company/staff
None
None