iPadOSでマウス・キーボード対応アプリを作る / iPadOS App using Pointer and Keyboard

2e72046813bf3dc01173fe54919a6d1d?s=47 cc4966
September 20, 2020

iPadOSでマウス・キーボード対応アプリを作る / iPadOS App using Pointer and Keyboard

iOSDC ( 2020 https://iosdc.jp/2020/ ) での発表「iPadOSでマウス・キーボード対応アプリを作る」の資料です。
資料中のスクショで説明に使ってるアプリは https://github.com/cc4966/iosdc2020-ipados-pointer-keyboard にあります。

iPadOS 13.4でついにマウスやトラックパッドを接続可能になったことでキーボードとマウスが揃い、iPadは以前よりもさらに作業・創作用マシンとしての真価を発揮できるようになりました。
このトークではマウス・キーボード対応アプリで抑えるべきポイントについてまとめます。

多くのアプリはマウスやキーボード対応をしていなくても大きな問題になることはありませんが、ドキュメント編集アプリなど、閲覧にとどまらない機能を提供するアプリではマウスへの対応を行うことがその使い勝手に大きく影響します。
また実際にテキストエディタでマウス対応を行った経験を踏まえて、マウス対応そのもの以外にもマウスやキーボードをフル活用するアプリで対応しておくと良いAPIについても合わせてお話しいたします。

- iPadOSにおけるマウス・キーボード
- マウス対応のための準備
- まず抑えるべき簡単な変更
- マウスカーソルの変更について
- マウス操作とタッチ操作を振り分ける
- あると嬉しいコンテキストメニュー
- iOS/iPadOSとキーボード
- シフトキーを使った範囲選択
- ショートカットコマンドなど

2e72046813bf3dc01173fe54919a6d1d?s=128

cc4966

September 20, 2020
Tweet

Transcript

  1. SPLVSPLV J1BE04ͰϚ΢εɾΩʔϘʔυର ԠΞϓϦΛ࡞Δ J04%$

  2. ࣗݾ঺հ SPLVSPLV w SPLVSPLV໺தྋ w ॴଐϐΫγϒגࣜձࣾ w 5XJUUFS!@IUUQTUXJUUFSDPN@ w झຯͰॎॻ͖ΤσΟλΛ࡞͍ͬͯΔ

    w J04%$J04%$ w %SPJE,BJHJ
  3. J04ͰมΘͬͨ͜ͱ ࠓ೔࿩͢Ϛ΢εͷ࿩ɺΩʔϘʔυͷ࿩ w ϙΠϯλʔσόΠε͕࢖͑ΔΑ͏ʹͳͬͨ͜ͱʢϚ΢ε΍τϥοΫύουʣ w ΩʔΠϕϯτ͕र͑ΔΑ͏ʹͳͬͨ͜ͱʢΩʔϘʔυʣ

  4. Ϛ΢εɾΩʔϘʔυରԠ Կ͕خ͍͠ͷ͔ w ৽͍͠࡞ۀ؀ڥ w J1BE1SP༻ͷ.BHJD,FZCPBSE͸τϥοΫύουʴΩʔϘʔυ w ૢ࡞ੑͷ޲্ w ૢ࡞ͷਫ਼౓Ϛ΢ε΍τϥοΫύουͰ͸ࢦΑΓ΋ࡉ͔͍ૢ࡞͕Մೳ

    w ૢ࡞ͷ଎౓ίϯςΩετϝχϡʔ΍ΩʔϘʔυγϣʔτΧοτ w ૢ࡞ͷ෼཭εΫϩʔϧͱυϥοάˍυϩοϓͳͲͷ෼཭
  5. Ξ΢τϥΠϯ Ϛ΢εͷ࿩ɺΩʔϘʔυͷ࿩ w ϙΠϯλʔͷ࿩ w ίϯςΩετϝχϡʔͷ࿩ w δΣενϟʔͷ࿩ w ΩʔϘʔυͷ࿩

    w ·ͱΊ
  6. ϙΠϯλʔ 6*1PJOUFS*OUFSBDUJPO

  7. ϙΠϯλʔ ݟͨ໨ w J1BE04Ҏ߱͸Ϛ΢ε΍τϥοΫύουΛ઀ଓ͢Δ͜ͱ͕Ͱ͖Δ w σϑΥϧτઃఆͩͱ͕࣌ؒܦͭͱফ͑ΔάϨʔͷؙ

  8. ϙΠϯλʔ ݟͨ໨ w σϑΥϧτઃఆͩͱ͕࣌ؒܦͭͱফ͑ΔάϨʔͷؙ w ൃදͰ͸ݟ΍͢͞ͷͨΊʹҎԼͷઃఆΛ࢖͍ͬͯ·͢ w ࣗಈతʹϙΠϯλΛඇදࣔΦϯˠΦϑ w Χϥʔͳ͠ˠϨου

  9. ϙΠϯλʔ γϛϡϨʔλʔ w ϙΠϯλʔσόΠεʢϚ΢εɾτϥοΫύουʣ͕࢖͑ΔΑ͏ʹͳͬͨ w J1BE04Ҏ߱ͷγϛϡϨʔλʔ w $BQUVSF$VSTPSΛԡ͢ͱϚ΢εͱΩʔϘʔυ͕Ωϟϓνϟ͞ΕΔ

  10. ϙΠϯλʔ γϛϡϨʔλʔ w ϙΠϯλʔσόΠεʢϚ΢εɾτϥοΫύουʣ͕࢖͑ΔΑ͏ʹͳͬͨ w J1BE04Ҏ߱ͷγϛϡϨʔλʔ w $BQUVSF$VSTPSΛԡ͢ͱϚ΢εͱΩʔϘʔυ͕Ωϟϓνϟ͞ΕΔ w &TDΛԡ͢ͱΩϟϓνϟʔϞʔυ͔Βൈ͚Δ

  11. ϙΠϯλʔ γϛϡϨʔλʔ w ϙΠϯλʔσόΠεʢϚ΢εɾτϥοΫύουʣ͕࢖͑ΔΑ͏ʹͳͬͨ w J1BE04Ҏ߱ͷγϛϡϨʔλʔ w &TDΩʔͷڍಈͷ֬ೝ͍ͨ͠ͱ͖͸1SFGFSFODFT͔ΒઃఆΛม͑Δͱྑ͍

  12. ϙΠϯλʔ ͭͷ͜ͱ w ࣗಈͰରԠ͞Ε͍ͯΔ͜ͱ w ؆୯ʹରԠͰ͖Δ͜ͱ w ΑΓΧελϚΠζ͍ͨ͠৔߹

  13. ϙΠϯλʔ ࣗಈʹରԠ͞Ε͍ͯΔ͜ͱ w 6*#BS#VUUPO*UFN w φϏήʔγϣϯόʔͳͲ w 6*5BC#BS*UFN w λϒόʔͷΞΠςϜ

    w 6*5FYU'JFME6*5FYU7JFX w ςΩετೖྗཝ
  14. ϙΠϯλʔ ؆୯ʹରԠͰ͖Δ͜ͱ w 6*#VUUPO w JT1PJOUFS*OUFSBDUJPO&OBCMFEΛ USVFʹ͢Δ͚ͩ w ϘλϯશମͰ͸ͳ͘จࣈͷͱ͜ Ζ͚ͩ

  15. ϙΠϯλʔ ΤϑΣΫτͷछྨ w QPJOUFS4UZMF1SPWJEFSͰฦ͢ޮՌ w IPWFSྖҬ͕ബ͘෴ΘΕΔ w IJHIMJHIUྖҬશମΛ্͕࣋ͪΔ w BVUPNBUJDࣗಈׂΓ౰ͯ

    w MJGUϙΠϯλʔ͕ԼʹજΓࠐΉ
  16. ϙΠϯλʔ ΤϑΣΫτͷछྨ w ಉ͡ΤϑΣΫτͰ΋Ϙλϯͷେ͖͞Ͱ ڍಈ͕มΘΔ w ϙΠϯλʔͷάϨʔ΋എܠ৭͕ೱ͍࣌ ͱബ͍࣌Ͱ໌Δ͕͞มԽ͢Δ w Ϙλϯʹഎܠ͕͋Δ࣌ͱͳ͍࣌Ͱ

    BVUPNBUJDͷΤϑΣΫτ͕ҟͳΔ
  17. ϙΠϯλʔ ྖҬ͕େ͖͍৔߹ʢഎܠʹಁ໌౓͕͋Δʣ എܠʹಁ໌౓͕͋Δ ௨ৗ ྖҬ͕େ͖͍৔߹ σϑΥϧτͷ·· ϥϕϧपลͷΈΛIJHIMJHIU ϥϕϧपลͷΈΛIJHIMJHIU IPWFS ϙΠϯλʔ͸ͦͷ··

    ࢦఆͨ͠ྖҬΛബ͘৭෇͚ ϙΠϯλʔ͸ͦͷ·· ࢦఆͨ͠ྖҬΛബ͘৭෇͚ IJHIMJHIU ϙΠϯλʔ͸ࢦఆͨ͠ྖҬͷܗঢ় ϙΠϯλʔͷྖҬΛബ͘৭෇͚ ϙΠϯλʔ͸ͦͷ·· ࢦఆͨ͠ྖҬΛബ͘৭෇͚ʢؙ֯ʣ MJGU ϙΠϯλʔ͸ݟ͑ͳ͘ͳΔ ࢦఆͨ͠ྖҬʹϒϥʔ ϙΠϯλʔ͸ͦͷ·· ࢦఆͨ͠ྖҬʹϒϥʔ BVUPNBUJD IJHIMJHIUʹಉ͡ IJHIMJHIUʹಉ͡
  18. ϙΠϯλʔ ྖҬ͕େ͖͍৔߹ºഎܠ͕ෆಁ໌ͷ৔߹ എܠ͕ෆಁ໌ͷ৔߹ ௨ৗ ྖҬ͕େ͖͍৔߹ σϑΥϧτͷ·· MJGUʹಉ͡ MJGUʹಉ͡ IPWFS ϙΠϯλʔ͸ͦͷ··

    ࢦఆͨ͠ྖҬΛബ͘৭෇͚ ϙΠϯλʔ͸ͦͷ·· ࢦఆͨ͠ྖҬΛബ͘৭෇͚ IJHIMJHIU ϙΠϯλʔ͸ࢦఆͨ͠ྖҬͷܗঢ় ϙΠϯλʔͷྖҬΛബ͘৭෇͚ ϙΠϯλʔ͸ͦͷ·· ࢦఆͨ͠ྖҬΛബ͘৭෇͚ MJGU ϙΠϯλʔ͸ݟ͑ͳ͘ͳΔ ࢦఆͨ͠ྖҬ্͕͕࣋ͪΔ ϙΠϯλʔ͸ͦͷ·· ࢦఆͨ͠ྖҬ্͕͕࣋ͪΔ BVUPNBUJD MJGUʹಉ͡ MJGUʹಉ͡
  19. ϙΠϯλʔ ϘλϯɾΤϑΣΫτͷৼΔ෣͍ w BVUPNBUJD͸ద੾ͳΤϑΣΫτʹͳΔ w എܠ৭͕ಁ໌౓Λ࣋ͭͱ͖͸IJHIMJHIU w എܠ৭͕ෆಁ໌ͳ৔߹͸MJGU w 6*#VUUPOͷΤϑΣΫτ͸Կ΋͠ͳͯ͘΋៉ྷʹಈ͘Α͏ʹͳ͍ͬͯΔͷͰج

    ຊతʹ͸มߋ͢Δඞཁ͸ͳ͍
  20. ϙΠϯλʔ 6*#VUUPOҎ֎΁ͷϙΠϯλʔରԠ w 6*#VUUPOҎ֎ʹ͍ͭͯ w 6*1PJOUFS*OUFSBDUJPOΛ࢖͏ w ೚ҙͷܗঢ়ΛࢦఆͰ͖Δ w Ξχϝʔγϣϯ΋Մೳ

    w ͦͷଞͷޮՌ΋ରԠՄೳ
  21. ϙΠϯλʔ J1BE04Ҏ֎ʹ͍ͭͯ w ͜ͷൃදͰJ1BE04ݶఆͷ࿩͸͜͜·Ͱͷ6*1PJOUFS*OUFSBDUJPO͚ͩ w J04΍$BUBMZTUͰ͸6*1PJOUFS*OUFSBDUJPO͸ಈ࡞͠ͳ͍ w ͓ͦΒ͘ʜʜ w J04΋Ϛ΢εରԠ͞Ε͍ͯΔ͕ΞΫηγϏϦςΟͱͯ͠ͷଆ໘͕ڧ͍

    w J04ʹ͸Ϛ΢ε͸઀ଓͰ͖Δ͕τϥοΫύου͸઀ଓͰ͖ͳ͍ w $BUBMZTU͸NBD04ͷϚ΢εΧʔιϧͷੈք؍Λଚॏͨ͠
  22. ίϯςΩετϝχϡʔ 6*$POUFYU.FOV*OUFSBDUJPO

  23. ίϯςΩετϝχϡʔ NBD04ͷ৔߹ w J04ͷίϯςΩετϝχϡʔˠ w NBD04ͷίϯςΩετϝχϡʔˣ

  24. ίϯςΩετϝχϡʔ J04Ͱͷಋೖʢ$BUBMZTUొ৔ͷλΠϛϯάʣ w 6*$POUFYU.FOV*OUFSBDUJPO w ӈΫϦοΫͰίϯςΩετϝχϡʔΛදࣔ w $POUSPM  λοϓPSΫϦοΫ

    ΋Մ w ϩϯάλοϓͰ΋ίϯςΩετϝχϡʔΛ දࣔʢͬͪ͜͸͋Ε͹ϓϨϏϡʔ΋දࣔʣ w ϓϨϏϡʔΛλοϓͨ͠ࡍͷڍಈ͸ࣗ෼ ͰܾΊΔ͜ͱ͕Ͱ͖Δ
  25. ίϯςΩετϝχϡʔ ࣅͨػೳʢ%5PVDIొ৔ͷλΠϛϯάʣ w 6*7JFX$POUSPMMFS1SFWJFXJOH%FMFHBUF w J04Ͱ%5PVDIͱҰॹʹ௥Ճ͞Εͨ w %5PVDI͢ΔͱϓϨϏϡʔ͕ग़Δ w ্ʹεϫΠϓε͢ΔͱΞΫγϣϯϝχϡʔ͕ग़Δ

    w ͞Βʹڧ͘ԡ͔͢λοϓ͢ΔͱભҠ͢Δ w ίϯςΩετϝχϡʔͷొ৔ͰEFQSFDBUFEʹͳͬͨ
  26. ͓·͚ υϥοάˍυϩοϓ w J04Ͱಋೖ͞Εͨ w 6*%SBH*OUFSBDUJPO w λοϓ΋ϖϯγϧ΋ϩϯάλοϓ͢Δඞཁ͕͋ͬͨ w Ϛ΢εͰ͸ϊʔλΠϜͰυϥοάΛ։࢝Ͱ͖Δ

    w 6*%SPQ*OUFSBDUJPO w Ϛ΢εͩͱυϩοϓઌΛࢦͰӅͣ͞ʹࡁΉ let dragInteraction = UIDragInteraction(delegate: self) dragInteraction.isEnabled = true // for iOS dragView.addInteraction(dragInteraction)
  27. δΣενϟʔ 6*(FTUVSF3FDPHOJ[FS

  28. δΣενϟʔʢ)PWFSʣ J04Ͱ৽نͰ௥Ճ͞Εͨ΋ͷ w 6*)PWFS(FTUVSF3FDPHOJ[FSͷ௥Ճ w $BUBMZTUରԠͰೖͬͨ΋ͷ w υΩϡϝϯτʹ͸ 6*)PWFS(FTUVSF3FDPHOJ[FSIBT OPF⒎FDUXIFOZPVSBQQSVOT

    JOJ04ͱॻ͔Ε͍ͯΔ͕࣮ࡍʹ͸ ػೳ͢Δ
  29. δΣενϟʔʢ)PWFSʣ ༨ஊɿ4XJGU6* w 4JXGU6*ʹ΋PO)PWFS΍IPWFS&⒎FDU͕͋Δ w PO)PWFS QFSGPSN  w IPWFS&⒎FDU

    @  w ͜ΕΒ͸J04΍$BUBMZTUͰ͸ಈ࡞͠ͳ͍ w 6*1PJOUFS*OUFSBDUJPOͱಉ࣮͡૷ʹͳ͍ͬͯΔͷ͔
  30. طଘͷδΣενϟʔ ΋ͬͱϚ΢εରԠ w J04·ͰεΫϦʔϯλονͱ1FODJMʹΑΔΠϕϯτͷछ w J04͔Β্هʹՃ͑ͯϚ΢εɾτϥοΫύουʹΑΔΠϕϯτͷछʹ w EJSFDU QFODJM JOEJSFDU1PJOUFS

    w 6*"QQMJDBUJPO4VQQPSUT*OEJSFDU*OQVU&WFOUTΛ*OGPQMJTUͰ:&4ʹ͢ΔͱϚ ΢εɾτϥοΫύουͷΠϕϯτΛ۠ผՄೳʹͳΔ
  31. طଘͷδΣενϟʔ ΋ͬͱϚ΢εରԠ 6*"QQMJDBUJPO4VQQPSUT*OEJSFDU* OQVU&WFOUT :&4 /0 6*5PVDIͷUZQF JOEJSFDU1PJOUFS͕ೖͬͯ͘Δ ϙΠϯλʔ͸EJSFDUʹू໿͞ΕΔ 6*3PUBUJPO(FTUVSF3FDPHOJ[FS

    OVNCFS0G5PVDIFT OVNCFS0G5PVDIFT 6*1JODI(FTUVSF3FDPHOJ[FS OVNCFS0G5PVDIFT OVNCFS0G5PVDIFT 6*(FTUVSF3FDPHOJ[FSͷ BMMPXFE5PVDI5ZQFT JOEJSFDU1PJOUFS͕࢖͑Δ ϙΠϯλʔ͸EJSFDUʹू໿͞ΕΔ
  32. طଘͷδΣενϟʔ εΫϦʔϯλονɺ1FODJMɺϙΠϯλʔ w Ϛ΢εɾτϥοΫύου͸MPDBUJPOͷ ਫ਼౓͕ඇৗʹߴ͍ w ࠓ·Ͱ࠲ඪ͸ը໘ͷϐΫηϧղ૾౓ ͚ͩͷ཭ࢄ஋͕ͩͬͨ࿈ଓ஋ʹͳΔ

  33. δΣενϟʔ 6*5BQ(FTUVSF3FDPHOJ[FS w CVUUPO.BTL3FRVJSFE w ΫϦοΫछผΛࢦఆͰ͖Δ w QSJNBSZΫϦοΫ w TFDPOEBSZӈΫϦοΫ

    w εΫϦʔϯλον͔ΒͷΠϕϯτ͸ڋ൱͠ͳ͍ݶΓૹΒΕͯ͘Δ w BMMPXFE5PVDI5ZQFTΛJOEJSFDU1PJOUFSͷΈʹ͢Δͱڋ൱Ͱ͖Δ
  34. δΣενϟʔ 3PUBUJPO1JODI w BMMPXFE5PVDI5ZQFTΛۭ഑ྻʹ͢ΔͱτϥοΫύου༝དྷʹݶఆͰ͖Δ w ಺෦తʹ6*&WFOUUZQF͕USBOTGPSNͳͷͰ w ͭ·ΓUPVDIFTΠϕϯτͰ͸ͳ͍ͷͰ͕ۭ͜͜഑ྻʹͳΔ

  35. δΣενϟʔ 6*1BO(FTUVSF3FDPHOJ[FS w BMMPXFE5PVDI5ZQFTΛۭ഑ྻʹ͢ΔͱϚ΢εɾτϥοΫύουʹݶఆͰ͖Δ w ಺෦తʹ6*&WFOUUZQF͕TDSPMMͳͷͰ w BMMPXFE4DSPMM5ZQFT.BTL w εΫϩʔϧछผΛࢦఆͰ͖Δʢ6*&WFOUUZQF͕TDSPMMͷࡍͷϑΟϧλʣ

    w EJTDSFUFϚ΢εͷϗΠʔϧ w DPOUJOVPVTτϥοΫύου
  36. δΣενϟʔ म০Ωʔ w 6*(FTUVSF3FDPHOJ[FSʹम০Ωʔͷঢ়ଶ͕௥Ճ͞Εͨ w NPEJpFS'MBHT

  37. δΣενϟʔʴΩʔϘʔυ ൣғબ୒ w ͜Ε·Ͱ4IJGU΍$PNNBOEͰͷൣғબ୒͸ଘࡏ͔ͨ͠ w ෺ཧΩʔϘʔυͰͷจࣈೖྗ͸04ͷ*.&͕ղऍͨ͠΋ͷΛ6*5FYU*OQVUܦ ༝Ͱͷड͚औΔ w ͜ͷͱ͖จࣈྻͷൣғબ୒͸ΩʔϘʔυͰߦ͑Δ͕ɺ͋͘·Ͱॲཧ͍ͯ͠ Δͷ͸ΞϓϦͷ֎ͩͬͨ

  38. ΩʔϘʔυ 6*,FZ

  39. ΩʔϘʔυ ΩʔϘʔυʹ͍ͭͯͷτϐοΫ w ΩʔίϚϯυʢΩʔϘʔυγϣʔτΧοτʣ w ϑϧΩʔϘʔυΞΫηεʢJ04͔Βʣ w ΩʔΠϕϯτʢJ04͔Βʣ

  40. ΩʔϘʔυ ΩʔϘʔυγϣʔτΧοτ w 6*3FTQPOEFSͷLFZ$PNNBOETʹ6*,FZ$PNNBOEΛొ࿥͓͚ͯͩ͘͠ w ࣗ໌Ͱ͸ͳ͍γϣʔτΧοτʹ͸6*,FZ$PNNBOEʹEJTDPWFSBCJMJUZ5JUMFΛ ηοτ͢Δͱྑ͍ w $PNNBOEΩʔΛ௕ԡͨ͠͠ͱ͖ʹEJTDPWFSBCJMJUZ5JUMFͷ͋ΔγϣʔτΧ οτҰཡ͕දࣔ͞ΕΔ

  41. ΩʔϘʔυ ϑϧΩʔϘʔυΞΫηε w ઃఆʼΞΫηγϏϦςΟʼΩʔϘʔυ ʼϑϧΩʔϘʔυΞΫηε w J04ͷૢ࡞Λ͢΂ͯΩʔϘʔυ͚ͩ ͰͰ͖ΔΑ͏ʹͳΓ·͢ w 5BC

    (ͰλονδΣενϟʔͷ࠶ݱ
  42. ΩʔϘʔυ ϑϧΩʔϘʔυΞΫηε w ϑΥʔΧεͷ࿮ઢ͸਌ͷWJFXͷUJOU$PMPS w ͨͿΜ࿮ઢ͕਌ͷ7JFXʹඳը͞ΕΔ͔Β w 5BCͰϑΥʔΧεΛ౰ͯΒΕΔͷ͸͓ͦΒ͘ҎԼͷͭ w JT"DDFTTJCJMJUZ*UFN͔ͭBDDFTTJCJMJUZ3FTQPOET5P6TFS*OUFSBDUJPO

    w JT6TFS*OUFSBDUJPO&OBCMFE͔ͭDBO#FDPNF'PDVTFE w "DDFTTJCJMJUZ*UFNͷݕࡧʢ5BC 'ʣͰBDDFTTJCJMJUZ-BCFM͕࢖ΘΕΔ
  43. ΩʔϘʔυ J04ͷ৽ػೳ w 6*1SFTTʹLFZ͕௥Ճ͞Εͨ w QSFTTFT#FHBO QSFTTFT&OEFEͰ֬ೝͰ͖Δ w ԡ͞Εͨ཭͞ΕͨΩʔίʔυ ͕શͯΘ͔ΔΑ͏ʹͳͬͨ

    w ϑϧΩʔϘʔυΞΫηεͷޙ w ςΩετೖྗΑΓ΋લ
  44. ·ͱΊ ϙΠϯλʔɾΩʔϘʔυ w ϘλϯͳͲʹϙΠϯλʔΠϯλϥΫγϣϯΛద੾ʹઃఆ͠Α͏ w ίϯςΩετϝχϡʔ΍υϥοάˍυϩοϓͳͲΛ׆༻͍ͯ͜͠͏ w δΣενϟʔΛϑϧ׆༻͢Δ͜ͱͰࡉ΍͔ͳػೳΛఏڙͰ͖Δ w δΣενϟʔͰΩʔϘʔυͷम০Ωʔͷঢ়ଶ͕Θ͔ΔΑ͏ʹͳͬͨ

    w ΩʔίϚϯυʹ͸EJTDPWFSBCJMJUZ5JUMFΛઃఆͯ͠ҰཡͰ͖ΔΑ͏ʹ͠Α͏ w ੜͷΩʔΠϕϯτ͕औΕΔΑ͏ʹͳΓΩʔϘʔυͷ׆༻ͷ෯͕޿͕ͬͨ
  45. ऴΘΓ