Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hatena Blog Development Flow

Hatena Blog Development Flow

はてなブログの開発フロー
YAPC ASIA Tokyo 2013 で発表したものです

Yasuhiro Onishi

September 21, 2013
Tweet

More Decks by Yasuhiro Onishi

Other Decks in Technology

Transcript

  1. 2013/09/21 YAPC ASIA TOKYO גࣜձࣾ͸ͯͳ େ੢߁༟JEPOJTIJ ͸ͯͳϒϩάͷ ։ൃϑϩʔ

  2. ɹJEPOJTIJେ੢߁༟ ɹ0/*4)* ɹ[email protected] ɹגࣜձࣾ͸ͯͳ ɹ͸ͯͳϒϩά

  3. %FWFM,5:1SPG 5FYU)BUFOB 8FC&NCFE 3FENJOF$IBO

  4. ͸ͯͳϒϩά IBUFOBCMPHDPN

  5. ͸ͯͳϒϩά w೥݄։ൃ։࢝ w1FSM w1MBDL14(* 4UBSMFU w$BSUPO w3PVUFS4JNQMF $POpH&/7 w%#*XSBQQFS42-.BLFS wDBQJTUSBOP

  6. ϒϩάάϧʔϓͰɺ͸ͯͳεϖʔεͱ࿈ܞͯ͠ܝࣔ൘ΛઃஔͰ͖ΔΑ͏ʹ͠·ͨ͠ϒϩάͷίϝϯτ Λɺ͸ͯͳ*%Λࢦఆͯ͠ڋ൱Ͱ͖ΔΑ͏ʹ͠·ͨ͠εϚʔτϑΥϯJ1BEͰ΋ॻ͖΍͘͢ɺಡΈ΍͢ ͍ʂJ04ΞϓϦΛϢχόʔαϧΞϓϦԽ͠·ͨ͠'MJDLS͔Βͷը૾ͷݕࡧͱషΓ෇͚ʹରԠ͠·͠ ͨιʔείʔυΛ؆୯ʹڞ༗͠Α͏ʂ(JTU͔ΒͷషΓ෇͚ʹରԠ͠·ͨ͠Πϥ ετɾϚϯΨ࡞඼Λϒϩάʹ౤ߘ͠Α͏ʂQJYJW͔ΒͷషΓ෇͚ʹରԠ͠·ͨ͠͸ͯͳϒϩά"UPN1VC"1*Λެ ։͠·ͨ͠ɻαʔυύʔςΟͷϒϩά౤ߘπʔϧΛར༻ɾ࡞੒Ͱ͖·͢هࣄΛॻ͖ͳ͕ΒදࣔΛ֬ ೝʂฤूը໘ʹϦΞϧλΠϜϓϨϏϡʔػೳΛ௥Ճ͠·ͨ͠ϒϩάάϧʔϓʹࢀՃ͢Δࡍʹɺهࣄ ͷΧςΰϦʔΛࢦఆͰ͖ΔΑ͏ʹ͠·ͨ͠ϔομϝχϡʔΛϦχϡʔΞϧʂϒϩάΛॻ͘ͱ͖΋ಡΉ ͱ͖ʹ΋ศརʹͳΓ·͓ͨ͠ֆඳ͖ػೳΛύϫʔΞοϓʂʮಁ໌ϖϯʯʮృΓͭͿ͠ʯʮεϙΠ τʯΛ௥Ճ͠·ͨ͠ಈըͷషΓ෇͚ΛڧԽʂχίχίಈըͱ*OTUBHSBNಈըʹରԠ͠·ͨ͠

    ίϝϯτཝͳͲͰχοΫωʔϜΛදࣔɺϦϯΫϘλϯͰλΠτϧΛࣗಈऔಘɺͳͲͷػೳ௥ՃΛߦ͍· ͨ͠ϒϩάͰ؆୯ͳֆΛॻ͜͏ʂฤूαΠυόʔʹʮ͓ֆඳ͖ػೳʯΛ௥Ճ͠·ͨ͠ ฤूը໘ʹʮҾ༻ʯϘλϯΛ௥Ճɺஶ໊ਓϒϩάϖʔδΛެ։ɺ΄͔ϒϩάͰ஥ؒΛݟ͚ͭΑ ͏ʂ͸ͯͳϒϩάάϧʔϓΛެ։͠·ͨ͠5VNCMSͰڞ༗͠΍͘͢ͳͬͨ΄͔ɺଟ͘ͷػೳ௥Ճɾ मਖ਼Λߦ͍·ͨ͠.5ܗࣜͷϒϩάΠϯϙʔτʹରԠʂ͸ͯͳ֎ͷαʔϏε͔ΒҠߦ͠΍͘͢ͳΓ· ͨ͠ʮ-*/&ͰૹΔʯ΄͔ɺ͍͔ͭ͘ͷػೳ௥Ճɾमਖ਼Λߦ͍·ͨ͠σβΠϯς ʔϚςʔϚετΞΛ͞ΒʹڧԽͨ͠΄͔ɺԼॻ͖ҰཡͳͲΛ௥Ճ͠·͓ͨ͠଴ͨͤ͠·ͨ͠ɻ͸ͯ ͳϒϩάͱ͸ͯͳμΠΞϦʔͷશυϝΠϯͰ5XJUUFS$BSETʹରԠ͠·ͨ͠௕͍ϒϩά΋εοΩϦ ͱදࣔɻهࣄΛ෼ׂ͢Δʮଓ͖ΛಡΉʯه๏ΛϦϦʔε͠·ͨ͠͸ͯͳϒϩά͕5XJUUFS$BSETʹ ରԠ͠·ͨ͠ɻπΠʔτͰهࣄͷ֓ཁ͕දࣔ͞Ε·͢ʦ௥ه͋Γʧʦ࠶௥ه͋Γඒຯ͍͠৘ใΛϒϩ άʹʂฤूαΠυόʔ͔ΒϨετϥϯΛ঺հͰ͖ΔΑ͏ʹ͠·ͨ͠σβΠϯςʔϚςʔϚετΞΛ ڧԽʂͦͷ΄͔ଟ਺ͷػೳ௥Ճɾमਖ਼Λߦ͍·ͨ͠εϚʔτϑΥϯεϚϗͷฤूπʔϧόʔ͕ύϫ ʔΞοϓʂషΓ෇͚ػೳͰɺ͸ͯͳ5γϟπΛ΋Β͓͏ʂʂهࣄ͝ͱͷϒοΫϚʔΫ਺΍͍͍Ͷʂ ΛɺτοϓϖʔδͰ΋֬ೝͰ͖ΔΑ͏ʹ͠·ͨ͠σβΠϯςʔϚϒϩά͸΋ͬͱՄѪ͘ͳͪ͘Όʂ ެࣜσβΠϯςʔϚʹʮ#,6."ʯΛ௥Ճ͠·ͨ͠τϐοΫ͍·੝Γ্͕ͬͯΔ͋ͷ࿩୊ʹࢀՃ͠ Α͏ʂʮτϐοΫʯϖʔδΛϦϦʔε͠·ͨ͠σβΠϯςʔϚΦϦδφϧͷςʔϚΛڞ༗͠Α͏ʂ ि࿈ଓ ৽ػೳ ϦϦʔε
  7.  QVMMSFRVFTUT  DPNNJUT QFSZFBS

  8. PO

  9. ຊ೔ͷΞδΣϯμ w()&Λத৺ʹͨ͠։ൃϑϩʔ wࣗಈԽɾޮ཰Խɾ҆ఆԽͷͨΊ ͷऔ૊Έ w ։ൃϑϩʔҎ֎ͷ5*14΋গ͠

  10. ຊ೔ͷ·ͱΊ wࣗಈԽͰ͖Δ΋ͷ͸ࣗಈԽ͢Δ wϛεͷ࠶ൃ๷ࢭΛ࢓૊ΈԽ͢Δ

  11. Α͍։ൃϓϩηε wϓϩηεͷϑϨʔϜϫʔΫԽ w҆৺ײɺϚωδϝϯτੑ wඪ४Խ୭͕΍ͬͯ΋େৎ෉ wνʔϜ΍αʔϏεʹ͋ͬͨ΋ͷ

  12. Α͍։ൃϓϩηε wλεΫ؅ཧɺϫʔΫϑϩʔ wςετɺ$* wϦϦʔε؅ཧ

  13. λεΫ؅ཧɺ ϫʔΫϑϩʔ

  14. ೥:"1$

  15. ೥:"1$

  16. ೥:"1$

  17. ೥:"1$

  18. wιʔγϟϧίʔσΟϯά w*TTVF1VMM3FRVFTU w1SJWBUF3FQPTJUPSZ w৘ใڞ༗ɾϨϏϡʔπʔϧ

  19. w༏ઌ౓͕ແ͍ wظ೔͕ͳ͍ wෳ਺ਓΞαΠϯͰ͖ͳ͍ wΨϯτνϟʔτͳʹͦΕ (JU)VC*TTVF

  20. (JU)VCͷ*TTVF͸ λεΫ؅ཧπʔϧͰ͸ͳ͍

  21. ͓͢͢Ί w(JU)VC͸ϨϏϡʔπʔϧ wλεΫ؅ཧπʔϧͱซ༻͠Α͏ wUSFMMPDPNͱ͔

  22. ͸ͯͳϒϩάνʔϜ wπʔϧΛزͭ΋࢖͍ͨ͘ͳ͍ wແཧ΍Γ(JU)VC͚ͩͰ΍Δ

  23. ։ൃͷྲྀΕ wதظܭը ൒೥ w୹ظܭը ݄ wΞαΠϯ w։ൃ wϦϦʔε

  24. CSBODIઓུ wNBTUFS wຊ൪ͱಉҰɺৗʹ݈શ wTUBHJOHNBTUFS wϦϦʔεՄೳͳ΋ͷ͕શͯ NFSHF͞Ε͍ͯΔ wUPQJDCSBODI wػೳ͝ͱͷ։ൃϒϥϯν

  25. CSBODIઓུ NBTUFS TUBHJOHNBTUFS UPQJDCSBODI UPQJDCSBODI SFMFBTF

  26. *TTVF׆༻ w*TTVF w1SPEVDU#BDLMPH w୭Ͱ΋ొ࿥͍͍ͯ͠ w"TTJHOFE*TTVF w4QSJOU#BDLMPH wΞαΠϯݖݶσΟϨΫλʔ w༏ઌ౓͸ϥϕϧͰ؆қ؅ཧ

  27. *TTVF13 wணखͨ͠Β͙͢1VMM3FRVFTU wਐߦ͸ϥϕϧͰ؅ཧ wϨϏϡʔ͕ࡁΜͩΒTUBHJOH NBTUFSʹNFSHF

  28. ͙͢1VMM3FRVFTU w࢓༷ݕ౼΋1VMM3FRVFTU্Ͱ w࢓༷ͷϨϏϡʔ΋ wσβΠφʔ΋1VMM3FRVFTU wͳΜͰ΋*TTVF্Ͱձ࿩

  29.  *TTVFొ࿥  ΞαΠϯ13  ϨϏϡʔґཔ  ϨϏϡʔத  ϦϦʔε଴ͪ

     TUBUJOHNBTUFS  NBTUFS ϦϦʔε ϥϕϧͰ ؅ཧ
  30. ΞαΠϯ wಉܥ౷ͷ࢓ࣄΛಉ͡ΤϯδχΞ ʹΞαΠϯ͚ͭͮ͠ΔଐਓԽ wҙࣝͯ͠୲౰Λม͑Δ

  31. ΞαΠϯ͓Έ͘͡ wIUUQ IJUPEFBQQTQPUDPN [email protected]

  32. QVMMSFRMBCFM w1VMM3FRVFTU͸ϥϕϧΛؾܰ ʹม͑ΒΕͳ͍ w"1*Ͱ͸ม͑ΒΕΔ w$ISPNF֦ுΛར༻

  33. None
  34. None
  35. None
  36. None
  37. IUUQTHJUIVCDPN TIJNPCBZBTIJ QVMMSFRMBCFM

  38. னա͗ϨϏϡʔλΠϜ wຖ೔ϥϯνޙʙ wʮϨϏϡʔ଴ͪʯϑϥάͷ *TTVFΛยͬ୺͔Βॲཧ͢Δ

  39. ৽ن*TTVFొ࿥ javascript: location.href = 'http://GHE/USER/REPOS/issues/new? title=' + document.getSelection().toString() || document.title

    + '&body=' + location.href
  40. ৽ن*TTVFొ࿥

  41. ৽ن*TTVFొ࿥ UJUMF CPEZ BTTJHOFF NJMFTUPOF MBCFMT

  42. NJMFTUPOF wNJMFTUPOF͸ظ೔ΛઃఆͰ͖Δ

  43. NJMFTUPOF wJTTVFΛNJMFTUPOFʹඥ෇͚Δ

  44. ઢද

  45. εέδϡʔϧ؅ཧ wσΟϨΫλʔ͕ઢද؅ཧ wਐ௙֬ೝɺεέδϡʔϧҾ͖௚͠ XFFLMZ wΤϯδχΞ͕࢖͏πʔϧ͸HIF ͚ͩ

  46. *TTVF·ͱΊ w*TTVFͰ͸༏ઌ౓ͱظ೔͕ܾΊ ΒΕͳ͍ w༏ઌ౓͸ΞαΠϯͷ༗ແͱϥϕ ϧͰ wظ೔͸NJMFTUPOF͔ผͰ؅ཧ

  47. ςετɺ$*

  48. ςετͷجຊ wසൟʹ࣮ߦ͢ΔʢࣗಈԽ͢Δʣ wෆ۩߹͕͋ͬͨΒճؼςετ w໢ཏతͳςετ͕͋Ε͹҆৺ͯ͠ ϦϑΝΫλϦϯάͰ͖Δ

  49. ςετ w։ൃऀͷखݩͷςετ wϑΝΠϧมߋΛࣗಈݕ஌ wKFOLJOTʹΑΔ$* wͲͷϒϥϯνͰ΋ɺQVTIͨ͠ Βࣗಈςετ wTUBHJOHNBTUFS΁ͷQVTI ͸͞Βʹಛผѻ͍ ޙड़

  50. KFOLJOT wϝΠϯ wશϒϥϯν͕QVTIຖʹςε τ͞ΕΔ wϦϦʔε wTUBHJOHNBTUFS NBTUFS wΧόϨοδ wΧόϨοδઐ༻೔ճ૸Δ

  51. ςετϞδϡʔϧ w)BSSJFU w5FTUNZTRME wQSPWFຖʹNZTRMEΛཱͯΔ w%#*Y3FXSJUF%4/

  52. $BTQFS+4 w+4Ͱ࡞ΒΕͨ1IBOUPN+4ͷϢ ʔςΟϦςΟ wIUUQDBTQFSKTPSH wςετ͸$P⒎FF4DSJQUͰهड़ w;Δ·͍ͷςετΛॻ͘

  53. None
  54. ςϯϓϨʔτͷςετ w9TMBUFͷςϯϓϨʔτͷςετ wςϯϓϨʔτ͕ίϯύΠϧՄೳ͔ w೔ຊޠؚ·Εͯͳ͍͔ ࠃࡍԽ

  55. ίʔυΧόϨοδ

  56. NFUSJDTςετ wίʔυͷෳࡶ͞Λςετ wϦϑΝΫλϦϯάର৅બఆ wIUUQTNFUBDQBOPSH NPEVMF1FSM.FUSJDT-JUF

  57. ॥؀తෳࡶ౓ ϝιουͷ௕͞

  58. ςετͷ·ͱΊ wগͣͭ͠Ͱ΋Ͱ͖ΔςετΛ૿΍ ͍ͯ͘͠ wෆ۩߹͕͋ͬͨΒճؼςετΛ ͭ͘ΔɺͳͲಉ͡ϛεΛ܁Γฦ ͞ͳ͍

  59. ϦϦʔε؅ཧ

  60. ϦϦʔε؅ཧ wͳΔ΂͘͸΍͘εςʔδϯά؀ڥʹ w։ൃςετσϓϩΠ w͸΍͍ϑΟʔυόοΫ wେ͖ͳख໭ΓΛແ͘͢

  61. ܭըϦϦʔε w։ൃܭըͰϦϦʔε೔ΛఆΊ͍ͯ Δ΋ͷ

  62. ఆظϦϦʔε wि࣍ϦϦʔεʢຖिਫ༵ʣ wఆظϦϦʔεʹؒʹ߹ΘͤΑ͏ ͱ͍͏ҙ͕ࣝಇ͘ w۠੾Γ͕͍ͭͯ։ൃͷϦζϜ͕ ͏·ΕΔ

  63. ܧଓϦϦʔε wTUBHJOHNBTUFS΁ͷNFSHF ͕*3$ʹ௨஌͞ΕΔ w͋Δఔ౓૿͑ͨΒϦϦʔε w݁ہɺຖ೔ϦϦʔε ˞ͨͩ͠ɺٳ೔લ೔͸ϦϦʔεېࢭ 18:25 ikachan01: ʲϦϦʔεʳHatena::Epic::Admin::EntryϦϑΝΫλϦϯά (4݅)

    https://...
  64. EFTDSJCFQVMMSFRVFTUSC wTUBHJOHNBTUFSͷςετ͕௨ ͬͨΒࣗಈ࣮ߦ͞ΕΔ wϦϦʔε༻ͷQVMMSFRVFTU wHGNͷνΣοΫϦετػೳ w<>νΣοΫϦετ0'' w<Y>νΣοΫϦετ0/

  65. None
  66. None
  67. None
  68. 18:25 hitode909: https://... ஶ໊࿮ʹΤϯδχΞΛ௥Ճ ͜ΕϦϦʔε͍͍ͯ͠Ͱ͔͢ > onishi 18:26 onishi ϦϦʔε͓Ͷ͕͍͠·͢

    > hitode909 18:30 hitode909: https://... ஶ໊࿮ʹΤϯδχΞΛ௥Ճ ϦϦʔε͠·ͨ͠ > #diary 18:31 hitode909: https://... ஶ໊࿮ʹΤϯδχΞΛ௥Ճ ຊ൪֬ೝ͓ئ͍͠·͢ > hitode909
  69. 18:25 hitode909: https://... ஶ໊࿮ʹΤϯδχΞΛ௥Ճ ͜ΕϦϦʔε͍͍ͯ͠Ͱ͔͢ > onishi 18:26 onishi ϦϦʔε͓Ͷ͕͍͠·͢

    > hitode909 18:30 hitode909: https://... ஶ໊࿮ʹΤϯδχΞΛ௥Ճ ϦϦʔε͠·ͨ͠ > #diary 18:31 hitode909: https://... ஶ໊࿮ʹΤϯδχΞΛ௥Ճ ຊ൪֬ೝ͓ئ͍͠·͢ > hitode909 ίϐϖ ίϐϖ ίϐϖ
  70. EFTDSJCFQVMMSFRVFTUSC ۙ೔ެ։༧ఆ

  71. ϩʔΧϧ։ൃ wTFUVQεΫϦϓτ wNZTRMEJ⒎ wIUUQTHJUIVCDPN POJTIJNZTRMEJ⒎ wQMFOW SCFOW w$BSUPO #VOEMFS

  72. EFWIPTU wτϐοΫϒϥϯνΛ؆୯ʹαʔ όʔ্Ͱ࣮ߦ͢Δ࢓૊Έ wDBQEFWIPTUTFUVQ wϒϥϯν໊͔ΒࣗಈͰυϝΠϯ ͕ܾఆ͠ɺݕূ؀ڥ͕ग़དྷΔ

  73. EFWIPTUSPVUJOH wSFWFSTFQSPYZ OHJOY ͷઃ ఆʹҰʑQVTIͨ͘͠ͳ͍ wOHJOY MVBͰಈతϧʔςΟϯ ά [email protected]Ϟδϡʔϧ

  74. 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; }
  75. ͦͷଞͷͱΓ͘Έ

  76. "#ςετ wݕূՄೳͳ΋ͷΛϦϦʔε͢Δ w໎ͬͨΒग़ͯ֬͠ೝͨ͠ΒΑ͍ wˠϦϦʔεαΠΫϧ͕଎͘ͳΔ

  77. "#ςετ wDIBOLPతͳ΋ͷ wಛఆͷ৚݅ͰػೳΛग़͠෼͚Δ wελοϑ͸೚ҙͰ৚݅Λ͍͡Ε Δ

  78. ܭଌɾ౷ܭ wαʔϏεʹ͓͚Δ,1* wΫϦοΫ਺ܭଌ w+4΋ؚΊͨϖʔδͷදࣔ଎౓ w6"ຖͷ+4Τϥʔ਺ wΤϯδχΞຖͷJTTVF਺

  79. ϖʔδදࣔ଎౓

  80. JTTVF਺

  81. *3$ར༻ wEJBSZνʔϜશһʹ௨஌ wϑΟʔυόοΫ wΤΰαʔν wTUBHJOHNBTUFSঢ়گ wKFOLJOTͷςετ࣮ߦ݁Ռ wຊ൪ͷΤϥʔ

  82. ڭҭ wݚम wIUUQTHJUIVCDPN IBUFOB)BUFOB5FYUCPPL wίʔσΟϯάن໿ wϖΞϓϩٛ຿Խ

  83. ϖΞϓϩάϥϛϯά wຖिϖΞ࣮ࢪ͢ΔͷΛϧʔϧԽ wҰਓͰ΍Δͷ͕ਏ͍λεΫΛ΍ Δ͖͔͚ͬʹ wศརؔ਺΍ΤσΟλઃఆͳͲͷ ҉໧஌͕ڞ༗͞ΕΔ

  84. ϦϑΝΫλϦϯά wNFUSJDTΛࢀߟʹϦϑΝΫλϦ ϯάର৅Λબఆ wि˓࣌ؒͱ͔࣌ؒΛܾΊΔ wখ͍͞୯ҐͰ1VMM3FRVFTU

  85. ·ͱΊ wਓ͸ϛεΛ͢ΔͷͰ࢓૊ΈԽɾ πʔϧར༻Λ৺͕͚Δ w։ൃϑϩʔͷվળʹίετΛ͔ ͚Δ w݁ہτʔλϧͷύϑΥʔϚϯ εɺαʔϏε඼࣭͸޲্͢Δ

  86. ਓࡐืू w҆৺ͯ͠։ൃͰ͖Δ؀ڥͰҰॹʹɹɹ ϒϩάΛ࡞Γ·͠ΐ͏ʂ www.hatena.ne.jp/company/staff

  87. None
  88. None