ã¿ãªããããã«ã¡ã¯ïŒ ããã¯ãã¹ãŠãé»è©±ãã©ãããã©ãŒã ãäŒæ¥ã®Webãµã€ãã«çµ±åããããšããå§ãŸããŸããã
ããŸããŸãªã¢ãããŒããšå®è£
æ¹æ³ã«æéãåããWEBéçºã æè¡ã¹ã¿ãã¯ã¯å€æ§æ§ã«å¯ãã§ãããããŒã«ã®éžæã«ããããããžã§ã¯ãã®éçºã¹ã¿ã€ã«ãã¢ãžã¥ãŒã«æ§ããŸãã¯éªšåãæ±ºãŸããŸãã
次åã¯é»è©±ãã©ãããã©ãŒã ã«ã€ããŠæžããŸãã VoIPåºæã®åŒ·ãåãã¯ãäž»èŠãªãã®ãã€ãŸãææ°ã®
SPAã¢ããªã±ãŒã·ã§ã³ã®éçºæ¹æ³ããæ³šæããããã§ãããã
ãã®èšäºã§ã¯ããµãŒãããŒãã£ã®ãµãŒãã¹ãæ¢åã®äœæ¥ç°å¢ã«å°å
¥ããããã»ã¹ã«ã€ããŠèª¬æããŸãã
仿¥ã¯ã
Zabbix-APIã§éãã§ã¿ãŸãããã
ã©ã€ããã¢
誰ãèå³ãæã¡ãŸã
10幎åã«ãµãŒããŒåŽã§CGIã¹ã¯ãªããã䜿çšããŠWEBã€ã³ã¿ã©ã¯ãã£ããå®è£
ããææ°ã®ã¢ãããŒããçè§£ããã人ã ç¬èªã®APIãçºæããªããã°ãªããªãå Žåãäœãèµ·ãã£ãã®ããææžåããããã«ã解決çã以äžã«ç€ºããŸãã
ã¿ã¹ã¯ãèšå®ããŸã
Zabbixã®åæèšå®ã¯ãçµ±åãããWEBã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠè¡ãããŸãã éåžžãã«ãŒãã³ã¯åã«ãã¹ããã°ã«ãŒãã«è¿œå ããã ãã§ãã
èªç€Ÿã®ã·ã¹ãã ã®æ©åšã®èšé²ïŒãã¹ãã®è¿œå ïŒãäŒæ¥ã®Webãµã€ãã«ä¿ç®¡ããŠããŸãã
- Zabbixã®æ¥åžžçãªã¿ã¹ã¯ãæ¢åã®äŒèšç°å¢ã«çµ±åããããšã¯çŽ æŽãããããšã§ãã ãã©ã¡ãŒã¿ãŒã®æ°ãæå°éã«æãããçæ³çã«ã¯1ã€ã®ã远å ããã¿ã³
éåžžãäŒæ¥ã·ã¹ãã ã®éçºã¯å¥ã®ããŒã ã«ãã£ãŠè¡ãããŸãã
- æ¢è£œã®ã¢ãžã¥ãŒã«ã®åœ¢ã§æ©èœãæäŸããããšã¯çŽ æŽãããããšã§ãã çæ³çã«ã¯ãæ°è¡ã®ã³ãŒããimport ...ããšãrender ...ã
- ææ°ã®æè¡ã¹ã¿ãã¯ãã§ããã°æšæºã®å¯Ÿè©±ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠã¿ãŠãã ãã
æè¡ã¹ã¿ãã¯
ReactJS
ãŠãŒã¶ãŒãšã®å¯Ÿè©±ã¯ã
MVCäœæ¥ã¹ããŒã ãšãã®ããªãšãŒã·ã§ã³ã«ãã£ãŠå€å
žçã«èª¬æãããŠããŸãã ææã®ç ç©¶ã«ã¯ã
Vue ã
Ember ã
Meteor ã
Angular ã
ReactJSã®åè£è
ãã
ãŸãã ã
ã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯/ã©ã€ãã©ãªã¯ã
ããã³ããšã³ãããã³ããã¯ãšã³ãã®å®è£
ãåããå®å
šãªMVCãšã³ã·ã¹ãã ãå®è£
ããããšããŠããããšãçè§£ãããããã«ãªãããããããã«ã¹ã¿ãã¯ããšåŒã³ãŸãã
Reactã¯ãMVCãã®ãVãã§ãã ç§ã¯ä»ã®äººã®çæ
ç³»ã«é£ã³èŸŒã¿ãããããŸããã§ããããã·ã³ãã«ãªåŒãåºãããšãŠãæ°ã«å
¥ããŸããã WebãIOSãAndroidçšã®1ã€ã®ã³ãŒãã§ãã
React Nativeã«é£ã³èŸŒãããšãã§ããã®ã§ãèŠèŸŒã¿é¡§å®¢ã¯åãã§ããŸããã ãããŠ
Reduxãæ¥ç¶ããããšã«ãããå®å
šãªã¹ã¿ãã¯ãååŸããå¿
èŠããããŸãã å¥ã«JSXããã©ãŒæ©èœIMHOã«æºè¶³ããŠããŸãã
Jsx
React
JSXéçºè
ãã¬ã€ã³ã¯ããã©ãŠã¶ãŒã®
DOMèŠçŽ ã®æäœãèŠèŠçã«ç°¡çŽ åããJavaScriptã®æ§æã¢ããªã³ã§ãã
ç±å¿ãªWebéçºè
ã¯ãHTMLããŒã¯ã¢ãããšJavaScriptã³ãŒããæ··åããããšã§åœŒãscããŸããã ç§ã¯ããã©ã³ã®éçºè
ã§ã¯ãªããJSXã¯çŽ æŽããããœãªã¥ãŒã·ã§ã³ã ãšèããŠããŸãã
NodeJS
æåã¯ãããã©ãŠã¶ãJavaScriptã§èšè¿°ããã®ã䟿å©ã«æããŸããã 確ãã«ããããžã§ã¯ããã¢ãžã¥ãŒã«ã«åå²ããŠå¿
èŠãªã¢ãžã¥ãŒã«ãããŒãããã®ã¯äžäŸ¿ã§ãã ãã®åé¡ã¯
Bowerããã±ãŒãžãããŒãžã£ãŒã«ãã£ãŠè§£æ±ºãããŸããã Bowerã«ã¯ç¬èªã®å²åŠããããã¢ãžã¥ãŒã«ã®ããŒãžã§ã³ãäºãã«ç«¶åããªãããã«æ³šæããŠããŸãã
å®éã«ã¯ãå¿
èŠãªãã¹ãŠã®ããŒã«ã
npmããã±ãŒãžãšããŠå©çšå¯èœã§ããããšã倿ããŸããã ç®çã®ã¢ãžã¥ãŒã«ãnpmããã±ãŒãžãšããŠå©çšã§ããªãå Žåã¯ãBowerã远å ããããšããå§ãããŸãã
çµæã Nodeã«æžã蟌ã¿ãnpmããã±ãŒãžãããŒãžã£ãŒã䜿çšããŸãã
Browserify
NodeJSã¯ããã©ãŠã¶ããŒã¹ã§ã¯ãªãããµãŒããŒåŽã®JavaScriptã§ãã åè¯ãªäººã
ã¯ã
Nodeifyã³ãŒãããã©ãŠã¶ãŒããŒãžã§ã³ã«ãªã¡ã€ã¯ãã
Browserify ãã©ã³ã¹ããŒã¿ãŒã æãä»ããŸããã
ããã«
ãã©ãŠã¶ã«ã¯ãçµã¿èŸŒã¿JavaScriptãšã³ãžã³ã®æŽæ°é床ãé«ããããŸããã ç§ã¯ãææ°ã®JavasScriptã®ãã¹ãŠã®ãç ç³ããã€ãŸãå¥ã®ããŒã«-Babelã䜿çšããããšæããŸãã
ECMAScriptã®ææ°ããŒãžã§ã³ã§åäœãããã©ã³ã¹ããŒã¿ãŒã ããã§ããJSXæ§æãèªèããã®ã¯åœŒã§ãã
ã¬ã«ã
JavaScriptã§ã®äœæ¥ã«å ããŠãææ°ã®WEBããŒãžã¯
CSSã
å€çšããŠããŸãããããã¯æ°ããã¬ãã«ã®
SASSæœè±¡åã«ç§»è¡ããŸããã ç¬èªã®ãã©ã³ããšç»åãããŒããããŸãã HTMLããã¹ãã¯ããŸããŸãªãã¡ã€ã«ã«æ£åšããå¯èœæ§ããããŸãã ãã®çµæãæçµãããžã§ã¯ãã®æ§ç¯ã¯ãããŸããŸãªæ¹æ³ã§ãã¡ã€ã«ã·ã¹ãã ã«æ£åšããããŸããŸãªãã¡ã€ã«ã«å¯Ÿãã10ã®ã¢ã¯ã·ã§ã³ã«ãªããŸãã
Gulpã¯ã³ã¬ã¯ã¿ãŒã§ãã å®éãããã¯éåžžã®Nodeã¹ã¯ãªããã§ããããããžã§ã¯ãã®ãœãŒã¹ãã¡ã€ã«ãåŠçããã¢ã¯ã·ã§ã³ãèªååãããŠããŸãã
ç§ã¯GulpãéžæããŸããããã€ãŠããã®åŠçã®ååãæ°ã«å
¥ã£ãŠããŸãããã¹ããªãŒã åŠçãé«éã§ãã 圌
㯠Gruntã
ç Žã ã
Insaytã®èšäºãå
¥æããŸãããããã«åºã¥ããŠ
gulpfile.jsãäœæã
ãŸãã ã
ãããã¯ã
webpackãæ€èšããããšã¯çã«ããªã£ãŠã
ãŸã ãç§ã¯è©ŠããŸããã§ããã
ããã§æ³šç®ã«å€ãã-ããã³ããšã³ããéçºããããã®äž»èŠãªããŒã«ããªã¹ãããŸããã ä»åºŠã¯ããã¯ãšã³ãã®çªã§ãã
ããããæåã«ãå°æ¥ã®Reactã³ã³ããŒãã³ããšZabbix-APIã®åäœåçãå®åŒåããŸãã
ç®ç
- ããã³ãããã¯ã®ããåããåçŽãªRESTãªã¯ãšã¹ãã«æžãã
- ZabbixãµãŒããŒãšã®ããåãã®ãã¹ãŠã®ããžãã¯ãããã¯ãšã³ãã«éäžããããã
- åªå
æšæºã€ã³ã¿ãŒãã§ãŒã¹+ããã¥ã¡ã³ã
ããã³ããšã³ãã§ãã¹ãŠã®ããžãã¯ãç©ã¿éããããšã¯å¯èœã§ãããããã¯æªãããšã§ãïŒ
- Zabbix-APIã¯ããã¹ãŠã®ã¯ã©ã€ã¢ã³ããã©ãŠã¶ã«å¯ŸããŠéãããŠããå¿
èŠããããŸãã ã¢ã¯ã·ã§ã³ã®ã»ãããå¶éãããŠããå¥ã®ãªãœãŒã¹ãéãæ¹ãå®å
šã§ã
- SNMPã»ã³ãµãŒãtelnetã»ãã·ã§ã³ããµãŒããŒOSãªãœãŒã¹ãªã©ãæ ¹æ¬çã«ç°ãªãã·ã¹ãã ã§æ©èœããäžè¬çãªãœãªã¥ãŒã·ã§ã³ãäœæããŸãã ïŒZabbixã¯å®è£
ã®1ã€ã«ãããŸããïŒã ãã©ãŠã¶ã«ã¯ãã®æ©èœããããŸãã
çµæã ç¬èªã®APIãåãããã¹ããŒããããã¯ãšã³ããå¿
èŠã§ãã
ããå°ãã®æè¡
Openapi
é»è©±ãã©ãããã©ãŒã ã«çµ±åãããšãæåã®ãã¬ãŒããã宿ããŸããã ç§èªèº«ã®APIãµãŒããŒãäœæãããŸããã 圌ã¯åããã ãœããã¹ã€ããã®ãã¹ãã¢ãªã³ã°ãã«æåããæ¬è³ªçã«RESTã§ã¯ãªãRESTèŠæ±ãåãå
¥ããŸããã ãªã¯ãšã¹ãã®åœ¢åŒãæ¹æ³ããã©ã¡ãŒã¿ã«é¢ããããã¥ã¡ã³ãã¯ãããŸããã§ããã
ãã®ç¶æ³ã«é¢å¿ãå¯ããããŸããããããã¥ã¡ã³ããèªåçã«çæãããããã«ãäœããã®åœ¢ã§APIã圢åŒåããããšã¯å¯èœã§ããïŒ
OpenAPIã®ã¢ãããŒããæ°ã«å
¥ããŸããã
äžçªäžã®è¡ã¯ãæåã«ãã¹ãŠã®ã¡ãœããããã£ãŒã«ããå¿ç圢åŒãªã©ãèšè¿°ããã仿§ãã¡ã€ã«ãæžãå¿
èŠããããšããããšã§ãã æ¬¡ã«ããã®ãã¡ã€ã«ã«åºã¥ããŠãæ¢è£œã®APIãµãŒããŒãçæã§ããŸãã èšèªã®ãªã¹ãã¯å°è±¡çã§ããNodeJSã§è¡ããŸãã
仿§ãã¡ã€ã«ã¯æšæºã§ããããã
Swagger ã
ReDoc ã
OA Viewerãªã©ã®ããŒã«ãæ¢ã«èæ¡ãããŠã
ãŸã ã ããã¥ã¡ã³ãã®åé¡ã¯èªåçã«è§£æ±ºãããŸã-ããã¯ä»æ§ãã¡ã€ã«ã§ãã
Docker
ããã«å®è¡å¯èœãªã³ãŒããæžãå§ããŸãã ã¹ã¯ãªããã¯NodeJSã«ãããŸãã ã©ã®èšèªãé²åããããŒãžã§ã³ãå€åããŸããç°ãªãããŒãžã§ã³ã®èšèªã§çµæã詊ããŠã¿ããšããã§ãããã åèšèªã«ã¯ãããžã£ã°ãªã³ã°ãããŒãžã§ã³çšã®ç¹å¥ãªããŒã«ããããŸãã
ç§ã¯ããæ ¹æ¬çã«è¡åããŸãã Linuxã«ãŒãã«ã¬ãã«ã§éåžžã«ç°¡åãªä»®æ³åãæäŸããåªãã
LXCãã¯ãããžãŒããããŸãã ããã䜿ããªãã®ã¯çœªã§ãã ä»ã®OSã®å Žåãç¹æ®æ§ããããéçºè
ã¯ãã¥ã¢ã³ã¹ãèæ
®ããŠ
Docker補åãäœæããŸããã
å¿
èŠãªDockerã³ã³ããã«å¿
èŠãªéçºç°å¢ãæ§ç¯ããŸãã
ããå§ããŸããã
ãã®ãããžã§ã¯ãã¯
Githubã§å
¥æã§ããŸã
ãgit clone https://github.com/ars-anosov/zabbix-react.git
zabbix-reactor-node
ããã¯ãšã³ããµãŒããŒããzabbix-reactor-nodeããšåŒã³ãŸãã 仿§ãã¡ã€ã«ã調ã¹ãŸãã ãã¹ããã£ãŒã«ãã確èªããŠãã ããã
less zabbix-react/node-back/api/zabbix-api.yaml
ãµãŒããŒããã·ã³ã«ãããã€ããå Žå
host: 'localhost:8002'
ãµãŒããŒã¯ããzabbix-api.yamlãã«åºã¥ããswagger
ãšãã£ã¿ãŒã䜿çšããŠæ§ç¯ãããŸãã æ§é ã¯æ¬¡ã®ãšããã§ãã
index.js-èµ·åã¹ã¯ãªãã
var app = require('connect')() var swaggerTools = require('swagger-tools') var http = require('http')
- http -WEBãµãŒããŒ
- ããã«ãŠã§ã¢swagger-toolsãšæ¥ç¶ -èŠæ±åŠç
æ¹æ³
- middleware.swaggerRouter-zabbix-react / node-back / controllersãã£ã¬ã¯ããªå
ã®é©åãªã³ã³ãããŒã©ãŒã«ãªã¯ãšã¹ãã転éããã«ãŒã¿ãŒ
- middleware.swaggerUiã¯SwaggerUIããŒã«ã§ãã ããã¯APIããã¥ã¡ã³ãã§ããããã¹ãRESTãªã¯ãšã¹ããå®è¡ã§ããŸãã
ã³ã³ãããŒã©ãŒ/ -APIèŠæ±ã®åŠçãæ
åœããã¹ã¯ãªãã
Configuration.js Data.js config_host_del.js config_host_get.js config_host_post.js config_host_put.js config_hostgroup_get.js data_hostlink_get.js
ããã¯ãZabbix-APIãšã®ããåããããžãã¯ã§æºããããŠããå Žæã§ãã
ãããŒãããã¯ããã£ã¬ã¯ããªã¯ãDockerã³ã³ããã«ã¹ã¯ããŒã«ãããŸãïŒããã«ç§»åããŸãã
cd zabbix-react/node-back/
ãzabbix-reactor-nodeããèµ·åããŸãã ç°å¢å€æ°ZX_URLãZX_USERãZX_PASSãã³ã³ãããŒã«æž¡ããŸã-ç¬èªã®Zabbixãããå Žåã¯ãç¬èªã«é§åããŸãã äŸãšããŠãç§ã®ãã¹ãZabbixã䜿çšã§ããŸãã
docker run \ --name zabbix-reactor-node \ -v $PWD:/zabbix-reactor-node \ -w /zabbix-reactor-node \ --publish=8002:8002 \ --env="ZX_URL=http://zabbix-server.react.com.ru/api_jsonrpc.php" \ --env="ZX_USER=guest" \ --env="ZX_PASS=" \ -it \ node:8 bash
zabbixã®å€ãããŒãžã§ã³ã¯ãç°ãªãURLã§ãªã¯ãšã¹ããåãå
¥ããããšãã§ããŸãã
Zabbixã®ããã¥ã¡ã³ãã
ã芧ãã ãã
ãæ¬¡ã«ãã³ã³ããå
ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã
npm install node index.js $ZX_URL $ZX_USER $ZX_PASS
ã³ã³ããããé£ã³åºãïŒCtrl + P + Q
å¯çšæ§ã®ç¢ºèªSwaggerUI-
httpïŒ// localhostïŒ8002 / spec-ui /ãããŒã¯ã³ããã£ãŒã«ãã«ããã¹ãããšå
¥åããŸãã èªèšŒããŒã¯ã³ããããnode-back / sub_modules / aaa_handle.jsã¹ã¯ãªãããæ€èšŒã«é¢äžããŸãã
Zabbixèšå®
Zabbixã®ç¹å®ã®ãã¹ãã°ã«ãŒãã®ã¿ã«ã¢ã¯ã»ã¹ãèš±å¯ããŸãã ãããè¡ãã«ã¯ãå¥ã®ãŠãŒã¶ãŒreact_userãäœæããŸãã
- 管ç/ãŠãŒã¶ãŒã°ã«ãŒã-ãŠãŒã¶ãŒã°ã«ãŒããreact_user_groupãã远å ããŸã
- 管ç/ãŠãŒã¶ãŒã°ã«ãŒã/æš©é-react_userã®äœ¿çšãèš±å¯ãããã¹ãã°ã«ãŒãã远å ããŸãã èªã¿æžããå
¬éããŸãã
- 管ç/ãŠãŒã¶ãŒ-ãŠãŒã¶ãŒã远å ããæ®µèœ1ã§äœæãããŠãŒã¶ãŒã°ã«ãŒãã«å«ããŸã
- 管ç/ãŠãŒã¶ãŒ/ã¢ã¯ã»ã¹èš±å¯-ãŠãŒã¶ãŒã¿ã€ãã»ãããZabbix Adminã
zabbix-react-front
éçºç°å¢ãæ§ç¯ããŠããzabbix-react-frontããšåŒã³ãŸãããã
ãweb-frontããã£ã¬ã¯ããªã¯Dockerã³ã³ããã«ã¹ã¯ããŒã«ãããŸãïŒããã«è¡ããŸãã
cd zabbix-react/web-front/
zabbix-react-frontãå®è¡ããŸãã
docker run \ --name zabbix-react-front \ -v $PWD:/web-front \ -w /web-front \ --publish=8003:8003 \ -it \ node:8 bash
次ã«ãã³ã³ããå
ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã
ã³ã³ããŒãã³ãã¯web-front / src / js / componentsãã£ã¬ã¯ããªã«ãããç¬èªã®äŸåé¢ä¿ããããŸãã
ã€ã³ã¹ããŒã«ïŒ
npm run install-components
ãããžã§ã¯ããweb-front / buildãã£ã¬ã¯ããªã«åéããŸã
gulp
ã³ã³ããããé£ã³åºãïŒCtrl + P + Q
ã³ã³ããŒãã³ãã®åäœã確èªããŸã
-httpïŒ// localhostïŒ8003 /zabbix-react-component
ãã®ãããã³ã³ããŒãã³ãã䜿çšããå¿
èŠããããŸããã ä»äœãå®è¡ãããŠããã®ãèŠãŠã¿ãŸãããã
次ã®ãã¡ã€ã«æ§é ã䜿çšããŸãã
web-front / src /
index.jsx-ã³ã³ããŒãã³ããå«ãJSXã¹ã¯ãªãã
import React from 'react'; import ReactDOM from 'react-dom' import { OpenApiSwagger, HostConfig, HostGraph } from './components/zabbix-react-component' window.localStorage.setItem('token', 'test') const specUrl = 'http://localhost:8002/spec/swagger.json' const swg = new OpenApiSwagger(specUrl) swg.connect((client, err) => { if (err) { ReactDOM.render( <div className='std-win'>no spec - <a href={specUrl}>{specUrl}</a> !</div>, document.getElementById('root') ) } else { ReactDOM.render( <div> <HostConfig swgClient={client} /> <HostGraph swgClient={client} /> </div>, document.getElementById('root') ) } })
- specUrl-zabbix-reactor-nodeã®ä»æ§ãã¡ã€ã«ãžã®ãã¹
web-front / src /
components / -ã³ã³ããŒãã³ãã®ãããã£ã¬ã¯ããª
web-front / src / components /
zabbix-react-component.js-ãšã¯ã¹ããŒããããã¯ã©ã¹ã npm
zabbix-react-componentããã±ãŒãžãšããŠå©çšå¯èœã
export { OpenApiSwagger } from './OpenApiSwagger.js' export { HostConfig } from './HostConfig.jsx' export { HostGraph } from './HostGraph.jsx'
ãã®å Žæãããã³ã³ããŒãã³ããå®å
šã«ã¹ã«ã«ããããæ©èœãåäžãããããšãã§ããŸãã
äŸãšããŠã
Nagiosã«ãããZabbixã«ã¯ãªãããŒã«ãæ·»ä»ããŸããã ãããã¯ãŒã¯èŠçŽ ã®èšè¿°å
ã®ãœãŒã¹-ã¿ãŒã²ããã¡ã¿æ
å ±ã«åºã¥ãããããã¯ãŒã¯ãããã®èªåæ§ç¯ã
ã³ã³ããŒãã³ãHostGraphãèŠãŠãã ããã Zabbixãã¹ãã¿ãã®ããã¹ãã€ã³ãã³ããªããã£ãŒã«ããã¡ã¢ãã§äœ¿çšããæ
å ±ãä¿åããŸãã ããã§ãJSON圢åŒã§ããsource-targetãèŠçŽ ã®ãã³ãã«ãå
¥åããŸãã èŠèŠåã«ã¯ã
d3ãããžã§ã¯ã
-Force -Directed Graphã䜿çšããŸããã
ãããã«
ããã§ãéçºç°å¢ãããã³ããšã³ãããã³ããã¯ãšã³ããæã«å
¥ããŸããã JavaScriptã®ç¥èãšNodeJSã®ä»æ§ã§ååã§ãã
APIã¯ææžåãããŠããããµãŒãããŒãã£ã®ããã³ããšã³ãéçºè
ã«ãããã¹ãã«å©çšã§ããŸãã APIãµãŒããŒã¯ãZabbixã«ç¹ã«é¢é£ä»ããããŠããŸãããããã¯äžè¬çãªãœãªã¥ãŒã·ã§ã³ã§ãã ä»»æã®ã·ã¹ãã ãžã®çµ±åãå¯èœã§ãã
æšæºã®
CRUDæ©èœãå®è¡ããæ¢è£œã®Reactã³ã³ããŒãã³ãã
ã³ã³ãã€ã«ãããŸãã ã³ã³ããŒãã³ãã¯ãçµ±åã·ã¹ãã ãšã®å¯Ÿè©±ã®è€éãããè§£æŸããããããã³ã°ã®ã¿ãè¡ãããŸãã