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
34
38k
Hatena Blog Development Flow
はてなブログの開発フロー
YAPC ASIA Tokyo 2013 で発表したものです
Yasuhiro Onishi
September 21, 2013
Tweet
Share
More Decks by Yasuhiro Onishi
See All by Yasuhiro Onishi
「手を動かした者だけが世界を変える」ソフトウェア開発だけではない開発者人生
onishi
18
10k
アニメから得た学びを発表会 in 関西 はてな スポンサーLT
onishi
1
81
大吉祥寺.pm 基調講演
onishi
4
8.8k
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
今日から始められるテスト自動化 〜 基礎知識から生成AI活用まで 〜
magicpod
1
140
AI時代のIssue駆動開発のススメ
moongift
PRO
0
200
Blue/Green Deployment を用いた PostgreSQL のメジャーバージョンアップ
kkato1
0
120
FastMCP OAuth Proxy with Cognito
hironobuiga
3
180
Kubernetesの「隠れメモリ消費」によるNode共倒れと、Request適正化という処方箋
g0xu
0
110
開発チームとQAエンジニアの新しい協業モデル -年末調整開発チームで実践する【QAリード施策】-
qa
0
260
RGBに陥らないために -プロダクトの価値を届けるまで-
righttouch
PRO
0
110
AgentCoreとLINEを使った飲食店おすすめアプリを作ってみた
yakumo
2
240
スピンアウト講座06_認証系(API-OAuth-MCP)入門
overflowinc
0
1.1k
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
360
Phase04_ターミナル基礎
overflowinc
0
2.2k
事例から紐解くSHIFT流QA支援 ~大規模プロジェクトの品質管理支援、QA組織立ち上げ~ / 20260320 Nozomu Koketsu
shift_evolve
PRO
0
140
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
21k
A better future with KSS
kneath
240
18k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
260
Everyday Curiosity
cassininazir
0
170
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
91
Side Projects
sachag
455
43k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
240
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
400
Evolving SEO for Evolving Search Engines
ryanjones
0
170
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
200
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
Writing Fast Ruby
sferik
630
63k
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