Git Bootcamp

Git Bootcamp

2017年4~5月開催「ブートキャンプ特別講座」の資料になります。

Eea9a05e6e222a3d50c73f54a49fadf4?s=128

Recruit Technologies

June 02, 2017
Tweet

Transcript

  1. Git Bootcamp 2017, 12th April @ Recruit Technologies

  2. Git Bootcamp • ΧϦΩϡϥϜ • Git-it Ͱ Git ͷ࢖͍ํΛମܥతʹֶͿ •

    Git Tips ू • ͜Μͳ࣌Ͳ͏͢Δʁ Git ԋशฤ • ࣮ࡍʹGitHubͰNode.jsʹίϯτϦϏϡʔτͯ͠ΈΔ
  3. Gitͱ͸ • ෼ࢄόʔδϣϯ؅ཧγεςϜ • "෼ࢄ"ͷ෦෼ʹ͔ͳΓ஫ྗ͞ΕͯΔ • ࠓ΍։ൃऀ಺Ͱͷdefact standard

  4. Git Χϧλ • GitͷΠϝʔδΛڧԽͤ͞ΔͨΊͷΧϧλ • ্ख͘ΠϝʔδΛͭͳ͛ΒΕΔͰ͠ΐ͏͔

  5. A B C D

  6. ໰୊

  7. A B C D git checkout -b fix/42

  8. A B C D git checkout -b fix/42; git commit

  9. A B C D git merge --ff-only

  10. A B C D git merge --no-ff

  11. ΋ͬͱ׳Ε͍͖ͯ·͠ΐ͏

  12. Git it Λ࣮ߦ͢Δ • Լهͷͱ͜Ζ͔Βμ΢ϯϩʔυ࣮ͯ͠ߦ • https://github.com/jlord/git-it-electron/releases • ΞϓϦέʔγϣϯϑΥϧμͷԼʹgit-itΛ഑ஔ্ͨ͠Ͱ ࣮ߦ͍ͯͩ͘͠͞

    • securityͷΤϥʔ͕ग़ͨΒઃఆ>ηΩϡϦςΟͱϓϥΠ όγ>μ΢ϯϩʔυͨ͠ΞϓϦέʔγϣϯͷ࣮ߦڐՄ> ͢΂ͯͷΞϓϦέʔγϣϯΛڐՄʢ͋ͱͰ໭ͯ͠Ͷʣ
  13. Git it Λ࣮ߦ͢Δ • େମ1࣌ؒ͘Β͍Λ໨҆ʹશ෦ճ౴͍ͯͩ͘͠͞ɻ • git ͷίϚϯυʹ৮Εͭͭ΋͜ͷػձʹGitHubͷ ΞΧ΢ϯτ͕ͳ͍ਓ͸࡞͓͖ͬͯ·͠ΐ͏ɻ •

    ૣ͍ਓͰ1࣌ؒ͘Β͍ɺ஗ͯ͘΋2࣌ؒ͘Β͍Ͱऴ ΘΔҹ৅Ͱ͕͢ɺऴΘΓํ࣍ୈͰ࣍ͷΧϦΩϡϥ ϜΛܾΊ·͢ɻ
  14. ͍͍ͩͨΈΜͳ͕ऴΘͬͨΒ ࣍ʹਐΈ·͢

  15. ͦͷલʹ • ΈΜͳͷҙݟ͕ฉ͍ͯΈ͍ͨ • GitͬͯҰޱʹݴͬͯ΋ΈΜͳ͕஌Γ͍ͨॴ΍ ࠔͬͯΔͱ͜ΖΛڞ༗͓͖͍ͯͨ͠ • ͦͷ্Ͱ๻͕Θ͔Δ஌ݟΛڞ༗͢Δ

  16. Git খ࢙

  17. NOTE: ͜Ε͔Β࿩͢࿩͸શ͘໾ʹཱ ͪ·ͤΜɻ ιϑτ΢ΣΞখ࿩ͱͯ͠ฉ͍ ͍ͯͩ͘͞ɻ

  18. Gitখ࢙ • Linus TorvaldsɺLinuxΛ࡞ͬͨࠓΛੜ͖Δι ϑτ΢ΣΞͷ఻આ͕LinuxͷΧʔωϧΛ؅ཧ͢ ΔͨΊʹ2िؒͰ։ൃͨ͠ͷ͕Git

  19. Gitখ࢙ • Before Git: 90೥୅ޙ൒ɺLinuxΧʔωϧί ϛϡχςΟ͸ͱ͋Δ໰୊ʹৗʹ೰·͞Ε͍ͯͨ • ͱ͋Δ໰୊ͱ͸ɺΧʔωϧ։ൃऀ͕ଟ͘ͳͬͯ ͖ͨ͜ͱʹ΋ؔΘΒͣɺશһ͕ϋοϐʔʹͳΔ SCM(Software

    Configuration Management) πʔϧ͕ଘࡏ͠ͳ͍͜ͱͰ͢ɻ
  20. Gitখ࢙ • Before Git: Linus Torvalds ͸ CVS Λௐࠪ͠ ·ͨ͠ɻ͔ͦ͠͠ͷ݁Ռ͸ɻɻɻ

  21. Gitখ࢙ • Before Git: Linus Torvalds ͸ CVS Λௐࠪ͠ ·ͨ͠ɻ͔ͦ͠͠ͷ݁Ռ͸ɻɻɻ

    ࠷ѱ
  22. Gitখ࢙ • Before Git: tarball, diff, patch Ͱӡ༻͢Δ ΋ɺࣗ෼ͰίϯϑϦΫτղফͨ͠Γɺpatchͷ ϚʔδΛͨ͠Γͯͨ͠ͷͰɺɺɺ

    ແཧʂ
  23. Ұํͦͷࠒ

  24. Gitখ࢙ • Before Git: Larry McVoy (Sun Microsystems ͷΤϯδχΞ)͕BitKeeperͱݺ͹ΕΔ෼ࢄ όʔδϣϯ؅ཧγεςϜΛ࡞Δ

    Hey Linus! ͜ΕͲ͏ΑʁLinux։ൃʹऔΓೖΕͯ Έͳ͍ʁ
  25. Gitখ࢙ • Larry McVoy: BitKeeper Λ࡞ΔͨΊͷձࣾͰ ͋Δ BitMover Λ࢝ΊΔɻ BitKeeper

    ࢖ͬͯ޿Ίͯ͘Εʔ
  26. Gitখ࢙ • Linusୡ͸BitKeeperΛ࢖͍࢝Ίɺ݁Ռͱͯ͠ LinuxΧʔωϧϋοΧʔͷଟ͘͸ϋοϐʔʹɻ BitKeeper ͍͍͡ΌΜ

  27. ͔͠͠

  28. Gitখ࢙ • BitKeeperʹ͸ผͳ໰୊͕͋Γ·ͨ͠ • BitKeeperͷϥΠηϯε͸एׯ෩มΘΓ • BitKeeper͸OSSʹ΋ؔΘΒͣɺϑϦʔͰ࢖͏ ͨΊʹ͸શͯͷChangeLogΛެ։͠ͳ͍ͱ͍ ͚ͳ͍ͱ͍͏΋ͷ

  29. Gitখ࢙ • ΤϯλʔϓϥΠζͰBitKeeperΛ࢖͏ʹ͸঎༻ ϥΠηϯεΛങͬͯprivateͰӡ༻͢Δඞཁ͕ ͋Δ • BitKeeperΛforkͯ͠উखʹެ։͞Εͳ͍Α͏ ͳpatchΛద༻͢Δౕ΋ग़͖ͯͯϥΠηϯεҧ ൓Λ๷͖͗Εͳ͘ͳΔڪΕ΋͋ͬͨ

  30. Gitখ࢙ • ఔͳͯ͘͠BitKeeperͷιʔείʔυ͸Open Ͱ͸ͳ͘ͳͬͯ͠·ͬͨɻ BitKeeperͷίʔυ͸OSSͰ͸ͳ͘͠·͢

  31. Gitখ࢙ • LinuxΧʔωϧͷϝϯόʔ͸͜Εʹࠔ࿭͠·͠ ͨɺLinuxͱ͍͏OSSͷਃ͠ࢠͱ΋ݴ͏΂͖ ιϑτ΢ΣΞͷιʔε͸OSSͰ؅ཧ͞Ε͍ͯ ͳ͍ͷͰ͢ɻ

  32. Gitখ࢙ • Linus͔Β͢Ε͹ιʔείʔυ͕؅ཧͰ͖Ε͹ ͍͍ͷͰͦͷลͷ໰୊͸ಛʹؾʹͯ͠ͳ͔ͬ ͕ͨɺBitKeeperͷ໰୊͸ͦͷ··फڭɾ੓࣏ ࿦૪ʹͳ͍͖ͬͯ·ͨ͠ɾɾɾ ໰୊͕͋ΔͳΒ΋ͬͱ͍͍ͷ Λ࡞ͬͯ͘ΕΑ

  33. Gitখ࢙ • Andrew Tridgell: rsync/Sambaͷ࡞ऀ BitKeeperͷϦόʔεΤϯδχ ΞϦϯάͯ͠৽͍͠ͷ࡞Ζ͏

  34. Gitখ࢙ • BitKeeperΛΤϛϡϨʔτ͢ΔίʔυΛॻ͍ͯ ׬શʹϦόʔεΤϯδχΞϦϯά͢Δମ੍ • ͦΕʹؾ͍ͮͨBitKeeperଆ͸҉߸ԽͳͲͰର ࡦ • LinuxଆͱBitKeeperଆͷؔ܎͸ѱԽ͍͖ͯ͠ ·ͨ͠

  35. Gitখ࢙ • LinusͷݟղɿBitKeeperΛ௒͑Δ΋ͬͱ͍͍ ΋ͷΛ࡞ͬͯͳ͍ɺ΍ͬͯΔ͜ͱ͸Πλζϥʹ ؔ܎ΛѱԽ͍ͤͯ͞Δ͚ͩͩɻ फڭɾ੓࣏࿦૪͸͏Μ͟Γͩ

  36. Gitখ࢙ • Larry / Linus ͸2005೥ʹి࿩ͰձٞΛ͠ɺ௕ ࣌ؒͷٞ࿦ͷ຤ɺBitKeeperΛLinuxͰ͸࢖Θ ͳ͍ࣄ͕ܾ·Γ·ͨ͠ɻ ܾผͷ࣌

  37. Gitখ࢙ • ͔ͦ͜ΒͷLinusͷಈ͖͸ߴ଎Ͱͨ͠ɻ • ͍͔ͭ͘طଘͷ෼ࢄ؅ཧγεςϜΛௐࠪ͠ɺ ࢖͍෺ʹͳΒͳ͍ͱ൑அ • ϑϧεΫϥονͰॻ͖௚͢͜ͱʹܾఆ

  38. Gitখ࢙ • 1೔Ͱಈ͘ͱ͜Ζ·Ͱ࡞Γɺ2೔໨Ͱgitʹର͠ ͯgitͦͷ΋ͷΛίʔυ؅ཧͤ͞Δ͜ͱʹ੒ޭ (self hosting) • 2िؒޙʹ͸LinuxΧʔωϧΛ͜ΕͰ؅ཧ͠Α ͏ͱϝʔϦϯάϦετʹpost •

    ໿2िؒͰgit͕Ͱ͖ͨͱݴΘΕ͍ͯΔ
  39. Gitখ࢙ $ git log e83c516 commit e83c5163316f89bfbde7d9ab23ca2e25604af290 Author: Linus Torvalds

    <torvalds@ppc970.osdl.org> Date: Thu Apr 7 15:13:13 2005 -0700 Initial revision of "git", the information manager from hell
  40. Gitখ࢙ • 4݄3೔͔Β։ൃΛ࢝Ίͯɺ4݄7೔ʹ͸ͳΜΒ ͔ͷ΋ͷ͕ಈ͍͍ͯͯɺ4݄16೔ʹ͸linux ΧʔωϧΛ֨ೲͰ͖Δ·ͰʹͳΔɻ͜Ε͕2ि ؒ଍ΒͣͰgitΛ࡞ͬͨͱݴΘΕΔΏ͑ΜͰ͋ Δɻ

  41. Git খ࿩

  42. Gitখ࿩ • gitͷMLͰɺͳͥgitͰC++Λ࢖Θͳ͍ͷ͔ͱ͍ ͏࣭໰ʹରͯ͠ɺLinusͷճ౴ > > GitͷιʔείʔυΛ࢝ΊͯΈͨ࣌ɺ2ͭͷ͜ͱ͕಄ʹͻ͔͔ͬͬͨɻ > 1. C++͡Όͳͯ͘७ਮͳCɻཧ༝͸ෆ໌ɻҠ২ੑͱ͔ݴΘͳ͍ͰΑɻ

    > Ϋιͩɻ Ϋι·ΈΕͳͷ͸Φϝʔͷํͩɻ C++͸൵ࢂͳݴޠͩɻ͔͠΋ɺগͳ͔Β͵਺ͷϓϩάϥϚʔ͕࢖͍ͬͯͯɺ׬શແܽͷͲ͏͠Α͏΋ͳ͍Ϋι Λੜ੒͢Δͷ͕ΊͪΌΊͪΌ؆୯ʹͳ͍ͬͯΔͱ͍͏఺ͰɺΑ͚͍ʹ൵ࢂͩɻϚδͰɺCΛબ୒͢Δཧ༝͕ ʮԿ΋ͳ͔ͬͨʯͱͯ͠΋ͩɺC++ϓϩάϥϚʔආ͚ʹͳΔͱ͍͏͚ͩͰɺCΛ࢖͏େ໊ٛ෼ʹͳΔɻ
  43. Git Tipsू

  44. Git Tips • ๻͕GitΛ࢖͏্Ͱ΍͍ͬͯΔࣄΛڭ͑ͯ஌ݟ Λڞ༗͠·͢

  45. Git Tips ͦͷ1: Tig

  46. Git Tips ͦͷ1: Tig • gitΛ࢖͍΍͘͢͢Δπʔϧ • ݸਓతʹ͸͜Ε͕ͳ͍ͱgit࢖͑ͳ͍͍ͬͯ͏ Ґ࢖͍΍͍͢ •

    tig Ͱ add ͨ͠Γ tig ͰऔΓফͨ͠Γ͢ΔͷΛ Α͘΍Δ
  47. DEMO

  48. Git Tips ͦͷ2: git hook

  49. Git Tips ͦͷ2: git hook • git Ͱίϛοτ࣌΍push࣌ʹίϚϯυΛ࣮ߦ ͢Δπʔϧ •

    node.jsϓϩδΣΫτͰ͸husky͍ͬͯ͏πʔ ϧ͕͋ͬͯͦΕΛ࢖ͬͯhookͤ͞Δ͜ͱ͕ଟ ͍
  50. DEMO

  51. Git Tips ͦͷ3: git diff algorithm

  52. None
  53. None
  54. git diff --histogram ΋͋Δ

  55. ͜Μͳͱ͖Ͳ͏͢Δʁ Git͓ࠔΓ࣌ͷϔϧϓ

  56. ͏͔ͬΓؒҧͬͯadd/commit ͯ͠͠·ͬͨ΋ͷΛݩʹ໭͢

  57. ͏͔ͬΓؒҧͬͯadd/commit ͨ͠ͱ͖ # git reset Λ࢖͍·͠ΐ͏ $ git reset --soft

    HEAD^ // ҰݸલͷίϛοτΛऔফ͠ $ git reset --soft HEAD^^ // ೋݸલͷίϛοτΛऔΓফ͢ # ͪͳΈʹ tig Ͱ΍Δͱ add ͷ৔߹͸΋ͬͱ؆୯ $ tig status
  58. ͏͔ͬΓؒҧͬͯpushͯ͠͠ ·ͬͨ΋ͷΛݩʹ໭͢

  59. ͏͔ͬΓؒҧͬͯpushͨ͠ͱ͖ # ·ͣɺνʔϜ։ൃத͸ master ΁ͷ௚push͸ۃྗආ͚Δ (Pull RequestϕʔεͰશһ͕؂ ࢹͰ͖ΔΑ͏ʹ͠ͳ͕Β։ൃ͢Δʣ # masterҎ֎ͷϒϥϯνʢࣗ෼ͷϒϥϯνͳΒpushͯ͠΋औΓฦ͕ͭ͘͠ʣ

    # master ͷ৔߹ɺͦͷλΠϛϯάͰclone͞ΕͨΓpull͞ΕͨΓ͢Δͱඇৗʹ໘౗ͳ͜ͱʹ ͳΔ $ git rebase -i Ͱpushͯ͠͠·ͬͨίϛοτΛऔΓফ͢ $ ͜ͷ git rebase ͕ΊͬͪΌ࢖͏ $ git rebase -i ͢ΔͱΤσΟλ͕։͘ͷͰɺͦͷΤσΟλ্Ͱ֘౰ίϛοτΛ࡟আ $ ࡟আͨ͠Β git push -f Ͱforce push $ master ΁ͷ force push ͸ݫېͳ͕࣌͋ΔͷͰඇৗʹؾΛ͚ͭΔ
  60. ͏͔ͬΓؒҧͬͯmaster mergeͯ͠͠·ͬͨ΋ͷΛݩ ʹ໭͢

  61. ͏͔ͬΓؒҧͬͯmaster merge ͨ͠ͱ͖ # جຊ͸ revert ͢Δ # master ʹpush͞Εͨ΋ͷΛ҆શʹऔΓফ͢ͷ͸revertͰ΍Δͷ͕ྑ͍

    # ͨͩ͠ɺrevert͢Δͱrevert commit(औΓফͨ͢Ίͷcommit͕ͭ͘) # git ͷຊདྷతͳ࢖͍ํͱͯ͠͸revert͕ਖ਼͍͠ $ git revert HEAD~2 (ೋݸલͷίϛοτΛrevert)
  62. ผͷϒϥϯν͔Βίϛοτ͠ ͯ͠·ͬͨͷͰऔΓࠐΈ͍ͨ

  63. ผͷϒϥϯν͔Βίϛοτͯ͠ ͠·ͬͨͷͰऔΓࠐΈ͍ͨ # cherry pick # ίϛοτͨ͠΋ͷΛcherry-pickͯ͠ผϒϥϯνʹ΋ίϛοτͨ͜͠ͱʹ͢Δ $ git cherry-pick

    <ίϛοτ൪߸> # pushͯ͠ͳ͚Ε͹Ұ୴reset --soft ͯͦ͠ΕΛผϒϥϯνʹͯ͠push͢Δํ͕ଟ͍͔΋ɻ
  64. ίϛοτͨ͋͠ͱͰtypo͕ ͋ͬͯtypoͨ͠Βtypo͕typo ͯͨ͠

  65. ίϛοτͨ͋͠ͱͰtypo͕͋ͬͯ typoͨ͠Βtypo͕typoͯͨ͠ # git log fix: typo fix: typo feat:

    Add new feature Έ͍ͨͳͱ͖ # git rebase -i HEAD~{3} ͔ͯ͠Β औΓࠐΈ͍ͨ΍ͭͱऔΓࠐΈͨ͘ͳ͍΍ͭΛ෼͚ͯϚʔδ͢Δ
  66. ίϛοτͨ͋͠ͱͰtypo͕͋ͬͯ typoͨ͠Βtypo͕typoͯͨ͠ ίϛοτϝοηʔδΛ fixup ͱ͔ squash ʹ͓ͯ͘͠ͱ git rebase -i

    --autosquash Ͱϋο ϐʔʹͳΔ git commit --fixup <COMMIT ID> Ͱ΋ྑ͍ ※ autosquashΛ࢖͏࣌͸௚લͷίϛοτͷϝοηʔδͷઌ಄਺จࣈؚ͕·Ε͍ͯΔඞཁ͕ ͋Δɻ
  67. Trial github.com/recruit-tech/git- bootcamp

  68. passwordΛ͏͔ͬΓೖΕ ͪΌͬͨͷͰաڈͷίϛοτ ͔Βશͯ࡟আ͍ͨ͠

  69. passwordΛ͏͔ͬΓೖΕͪΌͬͨͷ Ͱաڈͷίϛοτ͔Βશͯ࡟আ͍ͨ͠ # git filter-branch Λ࢖͏ $ git filter-branch -f

    --tree-filter 'rm -f password.txt' HEAD $ git push origin master --force
  70. Trial github.com/recruit-tech/git- bootcamp

  71. git commit Ͱ࢖ͬͨemail/ nameΛม͍͑ͨ

  72. passwordΛ͏͔ͬΓೖΕͪΌͬͨͷ Ͱաڈͷίϛοτ͔Βશͯ࡟আ͍ͨ͠ # git filter-branch ͷ commit-filter Λ࢖͏ $ git

    filter-branch -f --commit-filter 'if [ "$GIT_AUTHOR_EMAIL" = "yosuke.furukawa@gmail.com" ]; then GIT_AUTHOR_NAME="Yochan"; GIT_AUTHOR_EMAIL="yosuke.furukawa2@gmail.com"; git commit-tree "$@"; else git commit-tree "$@"; fi' HEAD
  73. Trial github.com/recruit-tech/git- bootcamp

  74. SVN͔ΒGitʹӡ༻ม͍͑ͨΜ ͚ͩͲɻ

  75. SVN͔ΒGitʹӡ༻ม͍͑ͨΜ ͚ͩͲɻ • SVN => தԝूݖܕ • Git => ෼ࢄܕ

    • Ұ൪͍͍ͷ͸Github͕ࠓ΍σϑΝΫτελϯμʔυͳͷ ͰɺͦΕҎ֎Ͱ΍ΔͳΒ߱ΓΔͧͬͯڴͯ͠΋ՄɻͦΕ Ͱฆڄͨ͠Β๻ΛݺΜͰ͍ͩ͘͞ɻ • see: http://qiita.com/YusukeHosonuma/items/ 14c59f3878d640a401a1
  76. GitFlow͕͍͍ͷʁ GitHubFlow͕͍͍ͷʁ http://qiita.com/mint__/ items/ bfc58589b5b1e0a1856a

  77. GitFlow͕͍͍ͷʁGitHubFlow ͕͍͍ͷʁ • ޷͖ͳ΋ͷΛ࢖͏ͱྑ͍ • ๻ͷ޷͖ͳͷ͸GithubFlowͷํɺmaster͕ ઈର҆ఆՔಇ͓ͤͯ͘͞΂͖ͱ͍͏໿ଋ͕क ΒΕ͍ͯΔͳΒͲͪΒͰ΋Մೳ

  78. RepositoryͲͷ୯ҐͰΘ͚Δ ͷ͕͍͍ͷʁ

  79. جຊతʹ͸Repository͸ϓϩ δΣΫτͰҰ͕ͭྑ͍ • ϚΠΫϩαʔϏε౳ͰϓϩδΣΫτ෼͚Δࣄ ΋ଟ͍͕ɺϦϙδτϦ͕෼͔ΕΔ㲈։ൃऀؒʹ ύʔςΟγϣϯΛઃ͚Δʹ౳͍͠ • ϓϩδΣΫτΛࣦഊͤ͞Δํ๏ɿhttp:// yosuke-furukawa.hatenablog.com/entry/ 2016/12/31/225913

  80. git reflog

  81. git reflog ࠷ѱϩʔΧϧ͕ফ͑ͨΓϒϥϯν͕ফ͑ͨΓͨ࣌͠ͷ࠷ऴखஈ $ git reset --hard HEAD^^ # HEAD^ͱࢦఆ͢Δͭ΋Γ͕ؒҧ͑ͨ!

    $ git reflog f5cb888 HEAD@{0}: head^^: updating HEAD 05b76fe HEAD@{1}: commit: 2.6.2 a546c2c HEAD@{2}: pull origin master: Fast-forward 843a591 HEAD@{3}: commit: rename package.json authors 6c66867 HEAD@{4}: pull origin master: Fast-forward 3e15c9e HEAD@{5}: checkout: moving from add_recruit_tech_problems to master 4af78a2 HEAD@{5}: commit: feat: add scope $ git reset --hard HEAD@{1} # reset hard લʹ໭ΕΔ
  82. git bisect

  83. git bisect Ͳ͔͜Β͔ɺੑೳ͕མͪͨɾςετ͕failʹͳͬͨ౳ͷ৔߹ͰͲ͜ͷίϛοτͰͦͷݱ৅͕ى ͖ͨͷ͔Λಛఆ͢ΔͨΊͷํ๏ɺೋ෼୳ࡧͰݕࡧͯ͘͠ΕΔ $ git bisect start HEAD v2.0

    # v2.0Ͱ͸େৎ෉͚ͩͬͨͲHEADͰ͸໰୊͕͋Δ $ git bisect run <ςετίϚϯυ> # ͜ΕͰࣗಈతʹςετ͠ͳ͕Βfail/successͰίϛοτΛݟ͚ͭͯ͘ΕΔ $ git bisect good $ git bisect bad # खಈͰςετ͢ΔͳΒ͜ͷ΍Γํ͕͋Δ
  84. ͋Γ͕ͱ͏͍͟͝·ͨ͠