å€ãã®å Žåããã®åäœã®çç±ã¯ãããŒã¿ããŒã¹ã§çºçããããŸããŸãªãªãœãŒã¹ã®ãããã¯ãšãããã«å¿ããŠãããã®ãªãœãŒã¹ã®åŸ æ©æéãé·ããªãããšã§ãã ããšãã°ãç°ãªãã»ãã·ã§ã³ã®2ã€ä»¥äžã®ã¯ãšãªãããŒãã«å ã®åãããŒã¿ãŸãã¯ããŒãã«æ§é èªäœãåæã«å€æŽããããšããç¶æ³ã§åé¡ãçºçããŸãã
ãã®ç¶æ³ãç解ããã«ã¯ãDBAã¯ã©ã®ããã»ã¹ããããã¯ãããã©ã®ããã»ã¹ããããã¯ãããŠããããç解ããå¿ èŠããããŸãããŸãããããã¯ããã»ã¹ããã£ã³ã»ã«ãŸãã¯ã匷å¶çµäºãããæçµçã«çµæã確èªã§ããŸãã
ãã®èšäºã§ã¯ãPostgreSQLã®ããã¯ã®ãããã¯ã«è§ŠããŠãããã¯ãæäœããããŒã«ã«ã€ããŠèª¬æããŸãã ããããæåã«ããããã¯èªäœãç解ããŠã¿ãŸãããã
ã¡ãã£ãšããçè«ïŒããã¯ã«é¢ããæè²ããã°ã©ã
ããŒã¿ããŒã¹ããã¯ãšã¯äœã§ããïŒ ãŠã£ãããã£ã¢ã®å®çŸ©ã¯æ¬¡ã®ãšããã§ãããDBMSã®ããã¯ïŒEngãLockïŒ-è¡çªãé²ããããŒã¿ã®æŽåæ§ãç¶æããããã«ãã¢ã¯ã»ã¹ãå¶éãŸãã¯æä»çã«è¡ããã©ã³ã¶ã¯ã·ã§ã³ã«ãããªããžã§ã¯ãã®ãã£ããã£ã®ããŒã¯ãã
PostgeSQLã¯ãMVCCã¢ãã«ãå®è£ ããããšã«ãããããŒã¿ã®æŽåæ§ãç¶æããŸãã MVCCïŒMultiVersion Concurrency ControlïŒã¯ãããŒã¿ããŒã¹ãžã®äžŠåã¢ã¯ã»ã¹ã確ä¿ããããã®ã¡ã«ããºã ã®1ã€ã§ããããã¯ãåãŠãŒã¶ãŒã«ããŒã¿ããŒã¹ã®ãããããã¹ãããã·ã§ããããæäŸããããšã§æ§æãããŸãã ãã®ãããªã¹ãããã·ã§ããã®ç¹å¥ãªãããããã£ãã¯ããŠãŒã¶ãŒãããŒã¿ããŒã¹ã«å ããå€æŽãããã©ã³ã¶ã¯ã·ã§ã³ãã³ãããããããŸã§ä»ã®ãŠãŒã¶ãŒã«ã¯èŠããªãããšã§ãã
PostgreSQLã¯ãé©æ°çãªSSIåé¢ã¬ãã«ïŒã·ãªã¢ã«åå¯èœãªã¹ãããã·ã§ããåé¢ãã·ãªã¢ã«åå¯èœãªã¹ãããã·ã§ããåé¢ïŒã䜿çšããŠãæãå³ãããã©ã³ã¶ã¯ã·ã§ã³åé¢ã¬ãã«ã§ãæŽåæ§ãä¿èšŒããŸãã
ãã®ãããã¯ãããããç解ããã«ã¯ãããã¯ããã®äœæ¥ãäžè¬çãªç«¶äºã¢ã¯ã»ã¹ã«é¢ããHabré ã®èšäºãšAlexander Zhuravlevã®ããã°ã®èšäºãèªãããšãã§ããŸãã
äºæãã¬ç¶æ³
æ®å¿µãªãããããŒã¿ã®æŽåæ§ã確ä¿ããããã®ã¡ã«ããºã ãå®è£ ãããšããããã¯ããã«çä¿¡èŠæ±ã«å¯ŸåŠã§ããªãç¶æ³ãçºçããŸãã ããã¯ãã£ãã«èµ·ãããŸããããã¯ãšãªãããŒãã«å šäœãé·æéãããã¯ããŠãããšããç¶æ³ãçºçãããšããã©ãã«ã«ã€ãªããå¯èœæ§ããããŸãã
ããšãã°ã1ç§ããã100ã®UPDATEã¯ãšãªãçºçãã1000ã¬ã³ãŒãã®ããŒãã«ã«å¯ŸããŠé·æéåŠçãããã¯ãšãªãéå§ãããšã5ã6æéã§ããŒãã«ã®ãµã€ãºããããã180äžã¬ã³ãŒãã«å¢å ããããŒãã«ã®ç©çãµã€ãºãå¢å ããŸãïŒããŒã¿ããŒã¹ã«ã¯ãã¹ãŠã®ããŒãžã§ã³ãæ ŒçŽãããããé·ããã©ã³ã¶ã¯ã·ã§ã³ãå®äºãããŸã§è¡ã
ãã®ç¶æ³ããã詳现ã«æ€èšããŠãã ããã
ããããã³ã°ã®äŸ
ããããŒã¿ããŒã¹ã«pgsqlblocks_testingããŒãã«ãããã rule_pgsqlblocks_testingã«ãŒã«ããããšããŸãã ããšãã°ãpgAdmin SQLãšãã£ã¿ãŒã䜿çšããŠããé·ããã¯ãšãªã10åéãšãã¥ã¬ãŒãããŸãã
SELECT * FROM public.pgsqlblocks_testing LIMIT 1000; SELECT pg_sleep(600);
Pidããã»ã¹16728
ãã1ã€ã®ãšãã£ã¿ãŒãéããå¥ã®ãªã¯ãšã¹ããå®è¡ããŠã«ãŒã«ãåé€ããŸãã
DROP RULE rule_pgsqlblocks_testing ON public.pgsqlblocks_testing;
Pidããã»ã¹16726
ãŸããããããèŠæ±ã¯SELECTèŠæ±ã«ãã£ãŠãããã¯ãããŸãã ãã®å Žåã®MVCCã¯ã pgsqlblocks_testingããŒãã«ãæ瀺çã«ããã¯ããªããšå®è¡ã§ããŸããã§ããã
ããã¯ããŒã«
æ¢åã®ããã¯ãã©ã®ããã«è¡šç€ºããŸããïŒ pg_locksããã¯ããŒãã«ãšpg_stat_activityãã¥ãŒã®ã¯ãšãªãèªåã§äœæããããpgAdminã«çµã¿èŸŒãŸããŠããããŒã«ã䜿çšã§ããŸãã
pgAdminã®ãµãŒããŒã¹ããŒã¿ã¹
pgAdminã¯ãPostgreSQLããŒã¿ããŒã¹ãæäœããããã®éåžžã«äŸ¿å©ã§ã·ã³ãã«ãªãœãããŠã§ã¢ã§ãã çŸæç¹ã§ã¯ãçŸåšã®ããŒãžã§ã³ã¯pgAdmin IIIã§ããã9ææ«ã«ã®ã¿ãªãªãŒã¹ãããŸãã
pgAdmin III
pgAdmin IIIã§ããã¯ããã³ã¢ã¯ãã£ãããã»ã¹ã«é¢ããæ å ±ã衚瀺ããã«ã¯ãããŒã¿ããŒã¹ã«adminpackæ¡åŒµæ©èœãå¿ èŠã§ãã ãã®æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ãããšã[ããŒã«]-[ãµãŒããŒã¹ããŒã¿ã¹]ã¡ãã¥ãŒããå¿ èŠãªãŠã£ã³ããŠãéããŸãã
ãã®ãŠã£ã³ããŠã«ã¯ãããã»ã¹ãå«ãŸããããŒãã«ãšãããŒã¿ããŒã¹å ã«æ¢åã®ããã¯ãå«ãŸããããŒãã«ã衚瀺ãããŸãã å€æ°ã®ããã»ã¹éã§è¿·åã«ãªããªãããã«ãã¹ããŒã¿ã¹ã«å¿ããŠããã»ã¹ã®è²ã調æŽã§ããŸãïŒã¢ã¯ãã£ãããããã¯ãéã¢ã¯ãã£ãããŸãã¯ãé ããã

è¡šã§ã¯ãåãããã¯ããã³ãããã¯ããã»ã¹ã¯å¥ã ã®è¡ã§è¡šãããŠããã誰ã誰ããããã¯ããŠããããè¿ éã«å€æããæ¹æ³ã¯ãããŸããã ãã®åé¡ã解決ããã«ã¯ããªã¬ãŒã·ã§ã³åã®å ±éã®å€ãšèš±å¯ãããåã®åªããå€ã«ãã£ãŠçµåãããè¡ãèŠã€ããããã«ãç°ãªãè¡ãäºãã«æ¯èŒããå¿ èŠããããŸãã
ãŠã£ã³ããŠã«ã¯ãéžæããããã»ã¹ããã£ã³ã»ã«ãŸãã¯çµäºããããã®2ã€ã®ãã¿ã³ããããŸãã ããããã®ããã»ã¹ãçµäºããåŸããŠã£ã³ããŠãæŽæ°ããè¡ãååºŠç §åããŠçµæãè©äŸ¡ããå¿ èŠããããŸãã
ãããã£ãŠãpgAdmin IIIã¯ããã¯ãæäœããããã®ããŒã«ãšããŠäœ¿çšã§ããŸãããããã€ãã®ãã€ãã¹ç¹ããããŸãïŒããŒã¿ããŒã¹ã®äºåèšå®ãå¿ èŠã§ãããããã¯ããã©ãããªåœ¢åŒã§è¡šç€ºãïŒãããã¯ããããããã¯ãããããã»ã¹ã®ããªãŒãã¥ãŒãªãïŒãåé¡ã®ããããã»ã¹ã®æ€çŽ¢ãšãã®çµäºã®è©äŸ¡ãè€éã«ããŸãã ãã®ãããã¿ã¹ã¯ã«ãšã£ãŠæã䟿å©ãªããŒã«ã§ã¯ãããŸããã
pgAdmin IV
pgAdmin IVãã€ã³ã¹ããŒã«ããŠå®è¡ãããšãpgAdmin IIIãšåã圢åŒã§æ¢åã®ããã¯ã確èªã§ããŸãã

ããã...ããã§ã§ããããšã¯ããã ãã§ãã PgAdmin IVã¯ããã»ã¹ã«å¯Ÿããã¢ã¯ã·ã§ã³ã®ããŒã«ããŒã倱ãããã®ãã¥ãŒããããã»ã¹ããã£ã³ã»ã«ãŸãã¯çµäºã§ããªããªããŸãããããã«ãããpgAdmin IVã¯ããã¯ãæäœããããã®äžäŸ¿ãªããŒã«ã«ãªããŸãã
DBã¯ãšãª
ããŒã¿ããŒã¹ã«ã¯ããããã¯ãããã¯ãšãªãšãããã¯ãããã¯ãšãªã衚瀺ããããã®ããŸããŸãªã¯ãšãªå®è£ ããããã¯ãŒã¯äžã«ãããŸãã
ã¯ãšãªãpg_locks monitoringãã«å¯Ÿããæ€çŽ¢ãšã³ãžã³ã®æåã®çµæã¯ãã¯ãšãªãªãã·ã§ã³ãšã®ãªã³ã¯ãæäŸããŸãã

ãªã¯ãšã¹ã1ïŒ
SELECT blocked_locks.pid AS blocked_pid, blocked_activity.usename AS blocked_user, blocking_locks.pid AS blocking_pid, blocking_activity.usename AS blocking_user, blocked_activity.query AS blocked_statement, blocking_activity.query AS current_statement_in_blocking_process FROM pg_catalog.pg_locks blocked_locks JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid != blocked_locks.pid JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid WHERE NOT blocked_locks.GRANTED;
ãšãã£ã¿ãŒãéããã¯ãšãªãå ¥åããŠããã¯ã«é¢ããæ å ±ãååŸããŸãã

ããªãè€éã«èŠããŸãããçµæã¯ç®ã«åªãããã®ã§ãã äžè¬ã«ãPostgreSQLã³ãã¥ããã£ã¯ãéåžžã®DBAã®æ å ±ã®æ€çŽ¢ãæ¯æŽããã³ä¿é²ããéåžžã«å€ãã®ãªãœãŒã¹ãäœæããã³ãµããŒãããŠããŸãã ããšãã°ãåãwiki wiki.postgresql.org
ãããã£ãŠã誰ã誰ããããã¯ããŠããã®ããããããŸãã ãã®ãããªãªã¯ãšã¹ãã«ã¯ãªãã·ã§ã³ããããããã»ã¹ãåŸ æ©ããŠããæéã«é¢ããæ å ±ã衚瀺ã§ããŸãã
2çªç®ã®ãªã³ã¯ïŒã¡ãªã¿ã«ããªãã£ã·ã£ã«ããã®ããã¥ã¡ã³ãïŒã¯ãéåžžã«ç°¡åãªãªã¯ãšã¹ããæäŸããŸãã
ãªã¯ãšã¹ã2ïŒ
SELECT * FROM pg_locks pl LEFT JOIN pg_stat_activity psa ON pl.pid = psa.pid;
ããããã¹ãŠã®ããªãšãŒã·ã§ã³ã®æå³ã¯ãæ¬è³ªçã«åãã¯ãšãªã§ãïŒããã¯ã«é¢ããæ å ±ã衚瀺ããŸãã ç§ãã¡ã¯å¿ èŠãªæ å ±ãåãåããŸããããçãã¯è¡šé¢ã«çŽæ¥ã¯ãããŸããã ç¹ã«ãããŒã¿ããŒã¹ãžã®ã¯ãšãªãå€æ°ããå Žåã 座ã£ãŠã誰ã誰ãããªããããã¯ããŠããã®ããææ¡ããŸããã ãããã¯ããããªãœãŒã¹ã®ã°ã©ãã誰ããé ã®äžã§äœæã§ããããã§ã¯ãããŸããïŒ

ããã«ããããã¯ããã»ã¹ãç Žæ£ãŸãã¯åæ¢ããå¿ èŠããããŸãã ãããŠãã¯ããããã¯ããã»ã¹ã®pidã瀺ãå¥ã®èŠæ±ãä»ããŠãæåã§è¡ãå¿ èŠããããŸã-
select pg_backend_pid(16728);
ãŸãã¯
select pg_terminate_backend(16728);
çµæã確èªããã«ã¯ãã¯ãšãª1ãå床å®è¡ãããã
SELECT * FROM pg_catalog.pg_stat_activity WHERE pid=16728;
ã
pgSqlBlocksã®ãã¹ãŠãã·ã³ãã«ã§äŸ¿å©ã§ãïŒ
å¥ã®ããŒã«ãèŠããŠããªãããããããªã«äŸ¿å©ãªã®ããå ±æããã-pgSqlBlocksã pgSqlBlocksããŒã«ã¯ç§ãã¡èªèº«ãäœæãããã®ã§ããã1幎以äžäœ¿çšããŠããPostgreSQLã®ããã¯åé¡ã®è§£æ±ºãä¿é²ããããã«ç¹å¥ã«äœæãããŸããã
ããã¯ã2ããã»ã¹ã®äŸã®å Žåã®pgSqlBlocksãŠã£ã³ããŠã®å€èŠ³ã§ãïŒããã§ã¯ãpid 29981ïŒSELECTïŒãš28710ïŒDROP RULEïŒããããŸãïŒã

ãŠã£ã³ããŠã®å·ŠåŽã«ã¯ãããŒã¿ããŒã¹ãžã®æ¥ç¶ç¶æ ã«é¢ããæ å ±ã衚瀺ããããŒã¿ããŒã¹ã®ãªã¹ãããããŸãïŒæ¥ç¶ãåæãæŽæ°æ å ±ãæ¥ç¶ãšã©ãŒãããŒã¿ããŒã¹ã«ããã¯ããããŸãïŒã
ã¢ããªã±ãŒã·ã§ã³ã®äž»èŠéšåã¯ãéžæããããŒã¿ããŒã¹ã«çŸåšããããã»ã¹ã®ããªãŒã§å ããããŠããŸãã ãããã¯ãããããã»ã¹ã«ã¯ãéããç°è²ã®ããã¯ã®ã¢ã€ã³ã³ããããã¢ã€ã³ã³ãèµ€ãããã¯ã®ãããã¯ããã»ã¹ã®åå«ã§ãã éåžžã®ããã»ã¹ã®ã¢ã€ã³ã³ã¯ç·è²ã®ç¹ã§ãã
ããã»ã¹ããã®ããã«è¡šçŸããããšã§ãããã»ã¹å ãç°¡åã«ããã²ãŒããããããã¯ããã³åŸ æ©äžã®ããã»ã¹ãããã³ãããã®çžäºé¢ä¿ã«é¢ããæ å ±ãåä¿¡ã§ããŸãã æ確ã«ããããã«ãéåžžã®ïŒãããã¯ãããŠããªããããã³ãããã¯ãããŠããªãïŒããã»ã¹ãé衚瀺ã«ããããšãã§ããŸãã

SELECTã¯ãšãªãé·ãpid 29981ã®ããã»ã¹ã¯ãpid 28710ã®ããã»ã¹ããããã¯ããŠããããšãã¯ã£ãããšããããŸãã
å¿ èŠã«å¿ããŠãããã»ã¹ããã£ã³ã»ã«ãŸãã¯åŒ·å¶çµäºããããã®ã·ã°ãã«ãéä¿¡ã§ããŸãã ããšãã°ããããã¯ãããããã»ã¹28710ãç Žæ£ãããšãããã»ã¹ããªãŒã®æ å ±ãããã«æŽæ°ãããçµæã衚瀺ãããŸã-é·ãSELECTèŠæ±ãæã€ããã»ã¹29981ã¯ä»ã®ãŠãŒã¶ãŒããããã¯ããŸããã éããŠäŸ¿å©ã
ã¢ããªã±ãŒã·ã§ã³ã®å°ãããŠå¿«é©ãªæ©èœã®ãã1ã€ã«æ³šç®ã§ããŸãã
-ããã¯å±¥æŽããã¡ã€ã«ã«ä¿åããã¢ããªã±ãŒã·ã§ã³ã«ããŒããçŽããŸãã ä¿åæã®ãã¹ãŠã®ããã¯ã®ã¹ãããã·ã§ããã®äžçš®ãããã«ãããããŒã¿ããŒã¹å ã®ããã¯ããã€ã§ã衚瀺ããã³åæã§ããŸãã
-æ¥ç¶ãããããŒã¿ããŒã¹ã®å°ãªããšã1ã€ãããã¯ãããŠããå Žåããã¬ã€ã¢ã€ã³ã³ãå€ãããŸãã
-ããã¯ã衚瀺ããããšãã®ãã¬ã€å ã®éç¥ã
-ã«ã¹ã¿ãã€ãºå¯èœãªèªåæŽæ°ããã»ã¹ãªã¹ãã
pgSqlBlocksã®ã€ã³ã¹ããŒã«æ¹æ³ãšãäžèšã®ãªãã·ã§ã³ãšæ¯èŒããŠã©ã®ããã«äŸ¿å©ã§ããïŒ
ã€ã³ã¹ããŒã«ãšã»ããã¢ãã
ã·ã¹ãã ã«ã¯JRE 8ãäºåã«ã€ã³ã¹ããŒã«ãããŠããå¿ èŠããããŸãã
ã¢ãã¬ã¹pgcodekeeper.ru/pgsqlblocksã«ã¢ã¯ã»ã¹ããŠãããã°ã©ã ã®ææ°ã®ææ°ããŒãžã§ã³ãéžæããŸãã ãã©ã«ããŒã«ã¯4ã€ã®jarãã¡ã€ã«ãå«ãŸããŸãã OSãšã·ã¹ãã ã®ããã深床ã«é©ãããã®ãéžæããŠãã ããã ããŠã³ããŒããå®è¡ãåºæ¥äžããïŒ
ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã«å¿ èŠãªã®ã¯ããã ãã§ãã ãã¹ãŠãç®±ããåºããŠåäœããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®äœ¿çšãéå§ããã«ã¯ããªã¹ãã«ããŒã¿ããŒã¹ãå ¥åããå¿ èŠããããŸãã æ°ããããŒã¿ããŒã¹ãè¿œå ããã«ã¯ãããŒã¿ããŒã¹ãªã¹ãã®äžã«ããã+ãèšå·ã®ä»ããããŒã¿ããŒã¹ã¢ã€ã³ã³ãã¯ãªãã¯ãã衚瀺ããããã€ã¢ãã°ã§å¿ èŠãªããŒã¿ãå ¥åããŸãã ãã¹ã¯ãŒããpgpassãã¡ã€ã«ã«ä¿åããããšããå§ãããŸãã

ããŒãžã§ã³9.2-9.6 PostgreSQLã§ãã¹ãæžã¿ã
ããã«ãããŒã¿ããŒã¹ããæ å ±ãæŽæ°ããé »åºŠãã¢ã€ãã«ããã»ã¹ã衚瀺ããå¿ èŠæ§ã衚瀺ãããåã®ãªã¹ããæ§æã§ããŸãã
ãããã«
ããŒã¿ããŒã¹å ã®ã¯ãšãªããããã¯ããåé¡ã¯éåžžã«æ·±å»ã§ãããããŒã¿ããŒã¹ã®èããäœäžãšãã£ã¹ã¯é åã®æ¯æžã«ã€ãªããå¯èœæ§ããããŸãã ãããã£ãŠãããã¯ãæ€åºããïŒå Žåã«ãã£ãŠã¯ïŒæäœã¢ã¯ã·ã§ã³ãå®è¡ããããã®äŸ¿å©ã§è¿ éãªããŒã«ãçšæããããšãéèŠã§ãã
ãã®ãããªããŒã«ã¯pgSqlBlocksã§ããããã«ãããããã»ã¹éãç°¡åã«ç§»åãããªã¯ãšã¹ãã®ãããã¯ãšä¿çã«é¢ããæ å ±ãç°¡åã«åä¿¡ã§ããŸãã
ãã®å©ç¹ã«ã¯ãæäŸãããæ å ±ã®å¯èŠæ§ãããã³ããã»ã¹ã«é¢ããæ å ±ã®è¡šç€ºãããã»ã¹ã®ãªã¹ãå ã®åé¡ã®æ€åºãããã»ã¹ã®ãã£ã³ã»ã«ãŸãã¯çµäºãçµæã®è©äŸ¡ãªã©ã®äžè¬çãªã¿ã¹ã¯ã®å®è¡ã®å©äŸ¿æ§ãå«ãŸããŸãã ããã«ãç¶æ³ãããã«åæããããã«ããã¯å±¥æŽããã¡ã€ã«ã«ä¿åããããšãè¯ãæ©äŒã§ãã ããã«ãããPostgreSQLããŒã¿ããŒã¹ã®ããã¯ããã°ããç°¡åã«æäœã§ããŸãã
PSïŒãã®ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ã¯ã MSSQL BlocksãŠãŒãã£ãªãã£ã§ããã ãã ããMSSQLããŒã¿ããŒã¹ãæäœããããã«ç¹å¥ã«èšèšãããŠããŸãã PostgreSQLã®å Žåãé¡äŒŒç©ã¯ãããŸããã§ããã
âOSã®ææ°ããŒãžã§ã³ã¯ãã¡ãããããŠã³ããŒãããŠãã ããã