$30 off During Our Annual Pro Sale. View Details »

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
    ͸ͯͳϒϩάͷ
    ։ൃϑϩʔ

    View Slide

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

    View Slide

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

    View Slide

  4. ͸ͯͳϒϩά
    IBUFOBCMPHDPN

    View Slide

  5. ͸ͯͳϒϩά
    w೥݄։ൃ։࢝
    w1FSM
    w1MBDL14(* 4UBSMFU

    w$BSUPO
    w3PVUFS4JNQMF$POpH&/7
    w%#*XSBQQFS42-.BLFS
    wDBQJTUSBOP

    View Slide

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

    View Slide

  7. QVMMSFRVFTUT
    DPNNJUT
    QFSZFBS

    View Slide

  8. PO

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. ೥:"1$

    View Slide

  15. ೥:"1$

    View Slide

  16. ೥:"1$

    View Slide

  17. ೥:"1$

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  23. ։ൃͷྲྀΕ
    wதظܭը ൒೥

    w୹ظܭը ݄

    wΞαΠϯ
    w։ൃ
    wϦϦʔε

    View Slide

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

    View Slide

  25. CSBODIઓུ
    NBTUFS
    TUBHJOHNBTUFS
    UPQJDCSBODI
    UPQJDCSBODI
    SFMFBTF

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    ϥϕϧͰ
    ؅ཧ

    View Slide

  30. ΞαΠϯ
    wಉܥ౷ͷ࢓ࣄΛಉ͡ΤϯδχΞ
    ʹΞαΠϯ͚ͭͮ͠ΔଐਓԽ
    wҙࣝͯ͠୲౰Λม͑Δ

    View Slide

  31. ΞαΠϯ͓Έ͘͡
    wIUUQ
    IJUPEFBQQTQPUDPN
    BTTJHO@PNJLVKJ

    View Slide

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

    View Slide

  33. View Slide

  34. View Slide

  35. View Slide

  36. View Slide

  37. IUUQTHJUIVCDPN
    TIJNPCBZBTIJ
    QVMMSFRMBCFM

    View Slide

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

    View Slide

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

    View Slide

  40. ৽ن*TTVFొ࿥

    View Slide

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

    View Slide

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

    View Slide

  43. NJMFTUPOF
    wJTTVFΛNJMFTUPOFʹඥ෇͚Δ

    View Slide

  44. ઢද

    View Slide

  45. εέδϡʔϧ؅ཧ
    wσΟϨΫλʔ͕ઢද؅ཧ
    wਐ௙֬ೝɺεέδϡʔϧҾ͖௚͠
    XFFLMZ

    wΤϯδχΞ͕࢖͏πʔϧ͸HIF
    ͚ͩ

    View Slide

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

    View Slide

  47. ςετɺ$*

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  53. View Slide

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

    View Slide

  55. ίʔυΧόϨοδ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  59. ϦϦʔε؅ཧ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  65. View Slide

  66. View Slide

  67. View Slide

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

    View Slide

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

    View Slide

  70. EFTDSJCFQVMMSFRVFTUSC
    ۙ೔ެ։༧ఆ

    View Slide

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

    View Slide

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

    View Slide

  73. EFWIPTUSPVUJOH
    wSFWFSTFQSPYZ OHJOY
    ͷઃ
    ఆʹҰʑQVTIͨ͘͠ͳ͍
    wOHJOYMVBͰಈతϧʔςΟϯ
    ά
    wOHY@MVBϞδϡʔϧ

    View Slide

  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;
    }

    View Slide

  75. ͦͷଞͷͱΓ͘Έ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  79. ϖʔδදࣔ଎౓

    View Slide

  80. JTTVF਺

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  87. View Slide

  88. View Slide