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

Hatena Blog Development Flow

Hatena Blog Development Flow

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

8c41c75791b57fe19aa63b1a3a29386c?s=128

Yasuhiro Onishi

September 21, 2013
Tweet

Transcript

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

  2. ɹJEPOJTIJେ੢߁༟ ɹ0/*4)* ɹ!ZBTVIJSP@POJTIJ ɹגࣜձࣾ͸ͯͳ ɹ͸ͯͳϒϩά

  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 BTTJHO@PNJLVKJ

  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ͰಈతϧʔςΟϯ ά wOHY@MVBϞδϡʔϧ

  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