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
大吉祥寺.pm 基調講演
onishi
3
5k
YAPC::Kyoto 2023 Keynote
onishi
3
9.6k
2016 Devsumi Kansai
onishi
3
1.3k
Hatena-Camp
onishi
2
4.2k
Hatena Blog for Engineer
onishi
2
3k
hatena-diary-blog-xss
onishi
5
1.1k
wget.pl
onishi
3
1.4k
Redmine::ChanでIRCからプロジェクト管理
onishi
5
5.2k
The new Text::Hatena
onishi
2
240
Other Decks in Technology
See All in Technology
LINE WORKSへ簡単通知!Incoming Webhookアプリの紹介
mmclsntr
0
110
データ分析を支える技術 生成AI再入門
ishikawa_satoru
0
380
GoとアクターモデルでES+CQRSを実践! / proto_actor_es_cqrs
ytake
1
160
エンジニアリングマネージャーはどう学んでいくのか #devsumi / How Do Engineering Managers Continue to Learn and Grow?
expajp
4
1.3k
サーバーレスAPI(API Gateway+Lambda)とNext.jsで 個人ブログを作ろう!
shuntaka
PRO
0
560
Datadog Cloud SIEMを使ってAWS環境の脅威を可視化した話/lifeistech-datadog-cloud-siem
gidajun
0
480
AWSサービスメニュー開発をしていてAWSを好きだ!と感じた瞬間
toru_kubota
0
130
運用改善、不都合な真実 / 20240722-ssmjp-kaizen
opelab
17
8.4k
コミュニティサービスに「あなたへ」フィードを リリースするまでの試行錯誤
takapy
1
150
さらに高品質・高速化を目指すAI時代のテスト設計支援と、めざす先 / AI Test Lab vol.1
shift_evolve
0
190
20240725 LLMによるDXのビジョンと、今何からやるべきか @Azure OpenAI Service Dev Day
nrryuya
3
1.2k
地理情報とAPIのトレンド
nagix
0
160
Featured
See All Featured
RailsConf 2023
tenderlove
16
720
Thoughts on Productivity
jonyablonski
64
4.1k
Why You Should Never Use an ORM
jnunemaker
PRO
51
8.9k
Facilitating Awesome Meetings
lara
46
5.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
321
23k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
224
21k
How GitHub (no longer) Works
holman
305
140k
Fantastic passwords and where to find them - at NoRuKo
philnash
42
2.7k
Code Reviewing Like a Champion
maltzj
517
39k
Embracing the Ebb and Flow
colly
81
4.3k
BBQ
matthewcrist
82
9k
The Language of Interfaces
destraynor
151
23k
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