ã¿ãªããããã«ã¡ã¯ãã¬ãããããã§ã½ãªã¥ã¼ã·ã§ã³ã¢ã¼ããã¯ãããã¦ããæ®æã¨ããã¾ãã
CodeReady Workspacesã®ä¾¿å©ãªã«ã¹ã¿ãã¤ãºæ¹æ³ã®ç¬¬äºåç®ã®ãç´¹ä»ã§ãã
第ä¸åç®ã¯ãã¡ãã rheb.hatenablog.com
ä»åã®ãã¼ãã¯ã¯ã¼ã¯ã¹ãã¼ã¹ã®æ¨æºåã§ãã
- CodeReadyWork 2.8 å¤æ´ç¹
- CodeReadyWorkspacesã®ã¬ã¸ã¹ããªã«ã¤ãã¦ç解ãã
- åæ
- STEP1 ã¯ã¼ã¯ã¹ãã¼ã¹å ã§åããã¤ã¡ã¼ã¸ã®æºå
- STEP2 ã«ã¹ã¿ãã¤ãºããdevfileã®æºå
- STEP3 devfileã¬ã¸ã¹ããªã¼ã®ãã«ãã¨ããã·ã¥
- STEP4 ã«ã¹ã¿ã devfileã¬ã¸ã¹ããªã¼ã®èµ·å
- STEP5 CodeReadyWorkspacesã®ã¤ã³ã¹ã¿ã³ã¹ã®è¨å®å¤æ´
- ã¾ã¨ã
CodeReadyWork 2.8 å¤æ´ç¹
æ¨æºåã®ã話ã«å ¥ãåã«ãCodeReadyWorkspaces2.8ãGAãããã¤ãã¢ãããã¼ãããã£ãããå¤æ´ç¹ã«ã¤ãã¦ãç´¹ä»ãããã¨æãã¾ãã
ä¸è¨ã®ãªã³ã¯ãå¤æ´ç¹ã®ä¸è¦§ã§ãã(è¦ãã°ã¤ã³ï¼
注ç®ãã¹ãå¤æ´ç¹
- æ°ããCodeReady Workspacesã®ããã·ã¥ãã¼ã
- ããã·ã¥ãã¼ãã使ç¨ãããã©ã¤ãã¼ããªãã¸ããªã¼ããã®ãã¡ã¯ããªã®OpenShift OAuthããã¼ã®ãµãã¼ã
- ãã¡ã¯ããªã¼URLãç°¡ç¥å
- devfileã使ããã«ã¹ã¿ã¼ãããã¯ã¼ã¯ã¹ãã¼ã¹ã«å¯¾ãããã©ã°ã¤ã³ã®èªåãªã³ã¡ã³ãã¼ã·ã§ã³
- Lombokããã¸ã§ã¯ãã®ãµãã¼ã
- VS Code ã¨ã¯ã¹ãã³ã·ã§ã³ã®ãµã¤ãã«ã¼ãã¡ã¤ã«ã·ã¹ãã ã¸ã®ã¢ã¯ã»ã¹ã¸ã®ãµãã¼ã
- Devfileããã·ã³ã°ã«ã«ã¼ãã¢ã¼ãã¨ãã«ãã«ã¼ãã¢ã¼ããåãæ¿ãå¯è½ã«
- å¶éãããIBM Zç°å¢ã«ãããã¤ã³ã¹ãã¼ã«ã®ãµãã¼ã
å人çã«æ³¨ç®ãã¹ãç¹ã¯å¤ªåã§å¼·èª¿ãããã«ãã«ã¼ãã¢ã¼ãã®åãæ¿ãã追å ãããç¹ã§ãã ãã«ãã«ã¼ãã¢ã¼ãã¨ããã®ã¯ã¨ãã£ã¿ããè¤æ°ã®ãã©ã«ããéããç¶æ ã®ãã¨ããããã¾ãã
VSCodeã¨ã¯ã¹ãã³ã·ã§ã³ã®å¤ãã¯ãã«ãã«ã¼ãã¢ã¼ããå¿ è¦ã¨ãã¾ãããããã©ã«ãã§CodeReadyWorkspacesã¯ã·ã³ã°ã«ã«ã¼ãã¢ã¼ãã§èµ·åãã¾ãããããdevfileããåãæ¿ããããããã«ããã¨ãããã®ã§ããå©ç¨ã§ããVSCodeãã©ã°ã¤ã³ãå¢ãã¦ãã便å©ã«ãªãããã§ããã
CodeReadyWorkspacesã®ã¬ã¸ã¹ããªã«ã¤ãã¦ç解ãã
CodeReadyWorkspacesã«ã¯ï¼ã¤ã®ã¬ã¸ã¹ããªãããããããå½¹å²ãç°ãªãã¾ãã
devfileã¬ã¸ã¹ããªã¼
ã¯ã¼ã¯ã¹ãã¼ã¹ã®ãã³ãã¬ã¼ããä¿ç®¡ãã¦ããã¬ã¸ã¹ããªã¼ã§ãã 第ä¸åã§ã¯èªåç¨ã®devfileãä¿®æ£ãã¦ã³ã³ããã追å ãã¾ããããä¿®æ£æ¸ã¿ã®devfileãã¬ã¸ã¹ããªã¼ã«ç»é²ãã¦ãããã¨ã§ã»ãã®ã¦ã¼ã¶ã¼ãåãã¹ã¿ãã¯ï¼è¨å®ã®ãããªãã®ï¼ã§ã¯ã¼ã¯ã¹ãã¼ã¹ãèµ·åã§ããããã«ãªãã¾ããä¸è¨ã®ç»åã¯ããã©ã«ãã®ã¹ã¿ãã¯ä¸è¦§ã§ãããdevfileã¬ã¸ã¹ããªã¼ãå¤æ´ãããã¨ã§ããã®ä¸è¦§ãå¤æ´ã§ãã¾ãã
ãã©ã°ã¤ã³ã¬ã¸ã¹ããªã¼
ãã¹ã¯ãããçã®VSCodeã¯èªç±ã«ã¨ã¯ã¹ãã³ã·ã§ã³ããã¦ã³ãã¼ããã¦è¿½å ãããã¨ãã§ãã¾ãããCodeReadyWorkspacesã§ã¯å©ç¨ããããã©ã°ã¤ã³ããã©ã°ã¤ã³ã¬ã¸ã¹ããªã¼ã«ä¿ç®¡ãã¦ããã¦ããããdevfileçµç±ã§æå®ãããã¨ã§å©ç¨ãããã¨ãã§ããããã«ãªãã¾ãã2.8ã§ã¯UIãå¤æ´ããã¦ãä¸è¨ã®ããã«ã¯ã¼ã¯ã¹ãã¼ã¹å ã®UIãããã©ã°ã¤ã³ãæå®ã§ããããã«ãªãã¾ããããã©ã°ã¤ã³ã¬ã¸ã¹ããªã¼ãå¤æ´ãããã¨ã§ãä¸è¨ã®ç»åã®å·¦å´ã«ãããã©ã°ã¤ã³ä¸è¦§ã«è¡¨ç¤ºããããã©ã°ã¤ã³ãå¤æ´ãããã¨ãã§ãã¾ãã
ä»åã¯devfileã¬ã¸ã¹ããªã¼ã®ã«ã¹ã¿ãã¤ãºæ¹æ³ãå®éã«è©¦ãã¦ããã¾ãã ï¼ãã©ã°ã¤ã³ã¬ã¸ã¹ããªã¼ã®æ¹ãèå³ãããæ¹å¤ãããããã¾ãããã次åã«ãæå¾ ãã ããï¼ï¼
åæ
第ä¸åã®ãã°ãã®ã¾ã¾è¡ãããã¨ããã§ãããCodeReadyWorkspacesã®ã¤ã³ã¹ã¿ã³ã¹ã«å¯¾ããå¤æ´ã¨ã¬ã¸ã¹ããªã®ãã«ããå¿ è¦ãªãããä¸è¨ã®ãããªæ¡ä»¶ãå¿ è¦ã¨ãªãã¾ãã æ¨æºåæ å½ã¯ä¸è¬éçºè ã«æ¯ã¹ã¦å¼·ã権éãå¿ è¦ã§ãã
- openshiftããã¸ã§ã¯ãã¸ã®å¤æ´æ¨©é
- CodeReadyWorkspacesã®ã¤ã³ã¹ã¿ã³ã¹ã¸ã®å¤æ´æ¨©é
- OpenShift ImageRegistry Operatorã®å¤æ´æ¨©é
- podman(ã¾ãã¯dockerãbuildah)ãå®è¡å¯è½ãªã©ãããããï¼ã¾ãã¯ãµã¼ãã¼ãªã©ï¼
1ï½3ã¯å®è³ªcluster-adminãå¿ è¦ã¨ãããã¨ã§ãã ãã®ä¸ã§è¥å¹²å³ããã®ã¯podmanã®å®è¡ç°å¢ã ã¨æãã¾ããpodmanã¯ã¬ã¸ã¹ããªã¼ã¤ã¡ã¼ã¸ã®æ§ç¯ã«å©ç¨ãã¾ãã å®ã¯devfileã¬ã¸ã¹ããªã¼ã ãã§ããã°OpenShiftã®ãã«ãæ©è½ã使ããã¨ã§ãªãã¨ãéããããã®ã§ããããã©ã°ã¤ã³ã¬ã¸ã¹ããªã¼ã§ã¯ããã«npmã¨nodejsãå¿ è¦ã¨ããã®ã§OpenShiftã®ãã«ãæ©è½ã§ã¯ããªãè¦ãããªãã¾ãã
ãã©ã°ã¤ã³ã¬ã¸ã¹ããªã¼ã®ãã«ãã®ããã«ããã¬ã¸ã¹ããªã¼ãã«ãç¨ã®ä»®æ³ãã·ã³ã®ãããªããæºåãã¦ãããã¨ããå§ããã¾ãããã«ãã ããªã®ã§ä½¿ãæ¨ã¦ã§ãæ§ãã¾ããã
ã¬ã¸ã¹ããªã¼ã®ã«ã¹ã¿ãã¤ãºã®å ¬å¼ã®ããã¥ã¢ã«ã¯ä¸è¨ã®ãã¼ã¸ã«ããã¾ãã
STEP1 ã¯ã¼ã¯ã¹ãã¼ã¹å ã§åããã¤ã¡ã¼ã¸ã®æºå
ã¬ã¸ã¹ããªã®ã«ã¹ã¿ãã¤ãºã®åæã¨ãã¦ã¯ã第ä¸åã§ãç´¹ä»ããããã«ã¯ã¼ã¯ã¹ãã¼ã¹ã«ãããããã³ã³ããã追å ãããã¨ããã±ã¼ã¹ãæ³å®ãã¾ãã ãªããã¤æºåãããã®ä»¥å¤ã®é¸æè¢ãåé¤ãããã®ã¨ãã¾ããããããä½æããdevfileã ããé¸æå¯è½ã«ããã¨ãããã¨ã§ããæ¨æºåã®ç¬¬ä¸æ©ã§ãã
OpenShiftã®å é¨ã¬ã¸ã¹ããªã¯ã¢ã¯ã»ã¹å¶éãããã£ã¦ãã¾ããããopenshiftãã¨ããproject(namespace)ã«ç»é²ããã¦ããã¤ã¡ã¼ã¸ã¯ãã¯ã©ã¹ã¿ã¼å ãããªãèªç±ã«ä½¿ãã¾ãã ã¨ãããã¨ã§ãååã®æé ãopenshift projectã®ä¸ã§å®æ½ãã¦ã¤ã¡ã¼ã¸ãä½æãã¦ããã¦ãã ããã
STEP2 ã«ã¹ã¿ãã¤ãºããdevfileã®æºå
ãã®è¾ºãã¯å ¬å¼æé ã®ã¾ã¾ã§ãããcloneã®ãããã³ã«git(ssh)ã®ã¾ã¾ã ã¨å°ãæ¹ãå¤ãã¨æãã®ã§ãhttpã«å¤ããæé ãã®ãã¦ããã¾ãã
git clone https://github.com/redhat-developer/codeready-workspaces.git cd codeready-workspaces git checkout crw-2.8-rhel-8
ããã§ããã©ã«ãã®ä¸èº«ãå°ãã®ããã¦ã¿ã¾ãããã dependencies/che-devfile-registry/devfiles/ã®ä¸ãè¦ãã¦ã¿ãã¨ãã©ãããã¯ã¼ã¯ã¹ãã¼ã¹ãé¸æããã¨ãã®ä¸è¦§ã«å¯¾å¿ãã¦ããããªãã£ã¬ã¯ããªãã¿ãã¾ãã
ls -l dependencies/che-devfile-registry/devfiles/ total 0 drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 00_java11-maven-microprofile-bootable drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 00_java11-maven-microprofile-xp2 drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 00_java8-maven-eap drwxrwxr-x. 2 ec2-user ec2-user 97 May 10 04:54 02_java8-maven-fuse drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 03_camelk drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 03_java11-maven-gradle drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 03_java11-maven-lombok drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 03_java11-maven-quarkus drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 03_java11-maven-vertx drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 03_java11-maven-vertx-http-booster drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 03_java8-maven-spring-boot-http-booster drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 04_nodejs-configmap drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 04_nodejs-mongo drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 04_nodejs-simple drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 05_cpp drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 05_dotnet drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 05_go drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 05_php-cake drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 05_php-di drwxrwxr-x. 2 ec2-user ec2-user 43 May 10 04:54 05_python
ã«ã¹ã¿ãã¤ãºå 㯠03_java11-maven-quarkus ã«ãªãã¾ãããã以å¤ãã©ãã¦ãã¾ãã¾ãã
cd dependencies/che-devfile-registry/ mv devfiles devfiles_old mkdir devfiles_old/03_java11-maven-quarkus/ devfiles/
ãã¨ã¯devfile.yamlãã«ã¹ã¿ãã¤ãºãã¾ãã第ä¸åã§ç´¹ä»ããæ¹æ³ã¨åãã§ãããã³ã³ããã¤ã¡ã¼ã¸ãç½®ãã¦ããããã¸ã§ã¯ããopenshiftã«ããã£ã¦ãããã¨ã«æ³¨æãã¦ãã ããã
- mountSources: true command: - tail args: - '-f' - /dev/null memoryLimit: 512Mi type: dockerimage alias: toolbox image: 'image-registry.openshift-image-registry.svc:5000/openshift/my-toolbox'
STEP3 devfileã¬ã¸ã¹ããªã¼ã®ãã«ãã¨ããã·ã¥
ãããããã«ãã§ããããã«ãããã¤ã¡ã¼ã¸ãOpenShiftã®å é¨ã¬ã¸ã¹ããªã«ããã·ã¥ããããã«ãå é¨ã¬ã¸ã¹ããªãã¯ã©ã¹ã¿ã¼ã®å¤ã«å ¬éããªãã¨ããã¾ããã ï¼docker.ioãquai.ioãå¥ã®ãã©ã¤ãã¼ããªãã¸ããªã«å ¬éãã¦ããå é¨ã¬ã¸ã¹ããªã«importããæãããã¾ãï¼
æé ã¯ä¸è¨ã®ããã¥ã¢ã«ãã®ã¾ã¾ã§ãã
åæã«æ¸ããã¨ããã®cluster-adminã«è¿ã権éãæã£ãã¦ã¼ã¶ã¼ã§cliããOpenShiftã¯ã©ã¹ã¿ã¼ã«ãã°ã¤ã³ãã¦ããã¦ãã ããã ãã®ãã¨ã¯ãå ¬å¼ããã¥ã¢ã«ã®éãpodman loginã¾ã§å®è¡ãã¦ãã ãããOperatorã«oc patchãã¦ããrouteãä½æããã¦ã¾ã§å°ããããã®ã§æ³¨æãã¦ãã ããã
oc login ~~~~ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge HOST=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}') podman login -u $(oc whoami) -p $(oc whoami -t) --tls-verify=false $HOST
podmanãã«ããããã¹ã¯ãªãããå®è¡ãã¾ãã --organizationã«ãããã¨ãããã次ã®æé ã§ããã·ã¥ããæã®ããã¸ã§ã¯ãåã«ãããã®ã§ãCodeReadyWorkspacesæ¬ä½ãåãã¦ããããã¸ã§ã¯ãåãæå®ãã¦ããã¾ãã
./build.sh --organization openshift-workspaces \ --registry $HOST \ --tag 1.0 STEP 38: COMMIT default-route-openshift-image-registry.apps.xxxxxxxxxxx/openshift-workspaces/devfileregistry-rhel8:1.0 ~~~
ãã«ããæåãããã¤ã¡ã¼ã¸ãããã·ã¥ãã¾ãã ããã·ã¥ããã¤ã¡ã¼ã¸åã¯ãSTEP38ã§åºåããããã®ã使ãã¾ãã
podman push default-route-openshift-image-registry.apps.xxxxxxxxxxx/openshift-workspaces/devfileregistry-rhel8:1.0 Getting image source signatures Copying blob 54a71df94483 skipped: already exists Copying blob 27567a77cb0c skipped: already exists Copying blob 123257361dae skipped: already exists Copying blob dce1930497b5 skipped: already exists Copying blob 17b23f8c2a0f skipped: already exists Copying blob c9e02f9d3afe skipped: already exists Copying blob 5756f433aebc skipped: already exists Copying blob 373b8d0281c1 skipped: already exists Copying blob bdabcafc9438 skipped: already exists Copying blob 121b74199690 skipped: already exists Copying blob 780fcde908cf skipped: already exists Copying blob 9f39e0b6c7e2 skipped: already exists Copying blob 946d7c6db7ba [--------------------------------------] 0.0b / 0.0b Copying config 897558c499 done Writing manifest to image destination Storing signatures
STEP4 ã«ã¹ã¿ã devfileã¬ã¸ã¹ããªã¼ã®èµ·å
å ¬å¼æé ã§ã¯cliãã oc new-app ãã¦ãã¾ãããããã¦GUIãããã£ã¦ã¿ã¾ãããã DeveloperViewãã+追å ãé¸ãã§ã³ã³ããã¼ã¤ã¡ã¼ã¸ãé¸ã³ã¾ãã
ã¤ã¡ã¼ã¸ã®ã¨ããã§ãImage stream tag from internal registryããé¸æããã¨å ã»ã©ããã·ã¥ããã¤ã¡ã¼ã¸ãé¸æã§ããã¯ãã§ãã ãªã½ã¼ã¹ã¯Deploymentã®ã¾ã¾ã§ããã¾ãã¾ããããDeploymentConfigã®æ¹ãè¥å¹²ä¾¿å©ã§å人çã«ã¯å¥½ãã§ããï¼ãã¼ã«ã¢ã¦ãæä½ãããï¼
ã«ã¼ãã£ã³ã°ã®è¨å®ã¯ã»ãã¥ã¢ã«ãã¦ãããã»ããããã§ãããã
DeveloperViewã«ãã©ã£ããèµ·åããã¢ããªã±ã¼ã·ã§ã³ã®å³ä¸ã®ç¢å°ãæ¼ãã¦ãåä½ç¢ºèªã¨URLã®ã¡ã¢ãè¡ãã¾ãããã åä½ç¢ºèªã¨ãã¦ã¯ç½å°ã®ããã¹ããç»é¢ãåºåãããã°OKã§ãããã
STEP5 CodeReadyWorkspacesã®ã¤ã³ã¹ã¿ã³ã¹ã®è¨å®å¤æ´
ããã¾ã§æ¥ããããå°ãã§ãã Operatorãããã©ã£ã¦ãã£ã¦ãCodeReadyWorkspacesã®ã¤ã³ã¹ã¿ã³ã¹ã®è¨å®ãæ¸ãæãã¾ãã
serverã»ã¯ã·ã§ã³ã®å¾ãã«customChePropertiesã»ã¯ã·ã§ã³ãå ãã¾ãã ãã®ä¸ã«ãCHE_WORKSPACE_DEVFILEREGISTRYINTERNALURLãã¨ãCHE_WORKSPACE_DEVFILEREGISTRY__URLãã追å ãå ã»ã©ã¡ã¢ããURLãè¨å®ãã¾ãã
server: cheLogLevel: INFO customCheProperties: CHE_LIMITS_USER_WORKSPACES_RUN_COUNT: '5' CHE_LIMITS_WORKSPACE_IDLE_TIMEOUT: '-1' CHE_WORKSPACE_DEVFILE__REGISTRY__INTERNAL__URL: 'https://devfileregistry-rhel8-openshift-workspaces.xxxxxxxxxxxxxx' CHE_WORKSPACE_DEVFILE__REGISTRY__URL: 'https://devfileregistry-rhel8-openshift-workspaces.xxxxxxxxxxxxxx'
ã¡ãªã¿ã«ããã§è¨å®ãã¦ãããCHE_LIMITS_USER_WORKSPACES_RUN_COUNTãã¯ã¦ã¼ã¶ã¼å½ããèµ·åã§ããã¯ã¼ã¯ã¹ãã¼ã¹æ°ã§ããCHE_LIMITS_WORKSPACE_IDLE_TIMEOUTãã¯ã¢ã¤ãã«ã¿ã¤ã ã¢ã¦ãã§ã¯ã¼ã¯ã¹ãã¼ã¹ãçµäºãããã¾ã§ã®ãªãããæéã§ããå²ã¨æåã«ã¦ã¼ã¶ã¼ããæå¥ãåºãç®æã ã¨æãã¾ãããæ°è»½ã«å¢ããã¨ã¯ã©ã¹ã¿ã¼ã®ãªã½ã¼ã¹ããããªããªã£ã¦ãã¾ãã®ã§ãããèããæ¹ããããã¨æãã¾ãã
ãã®è¨å®ãçµããã°ãã¨ã¯Operatorãåæã«ConfigMapã®æ¸ãæãã¨ãCodeReadyWorkspacesã®åèµ·åããã¦ããã¾ãã å ¬å¼ã®æé ã§ã¯ç´æ¥ConfigMapãæ´æ°ãã¦ãã¾ããããããããã¯Upstreamã®Eclipse cheã®æé ããã®ã¾ã¾ã«ãªã£ã¦ããããã«æãã¾ãã試ãã«ãã£ã¦ã¿ãã¨ããç§ã§Operatorããã«ãã¨ã«æ»ããã¾ããâ¦ã
å度CodeReadyWorkspacesã®URLãéããªããã¨ããã®ããã«ãã£ãããã¦ããã¨æãã¾ãã
ã¾ã¨ã
ããã¾ã§ãããã ã£ãã§ããããããªããªãããã¼ãªæé ã§ãã ãããä¸åº¦ãã£ã¦ãã¦ãã¾ãã°äºåº¦ç®ããã¯ãã»ã©é£ããã¯ããã¾ããã
ãããªã£ã¦ããã¢ã¤ã³ã³ããã£ã¹ã¯ãªãã·ã§ã³ãæ¸ãæããããªãã¾ãããã devfileããã£ã¨ã«ã¹ã¿ãã¤ãºãã¦ããªã³ãã¼ãã£ã³ã°è³ææ ¼ç´ããGitãªãã¸ããªãæå®ãã¦ããã°ãCodeReadyWorkspacesã¸ã®ååãã°ã¤ã³ããã¡ã³ãã¼ã®æ¬æ ¼åç»ã¾ã§ãã¹ã ã¼ãºã«ãªãããã§ããã
æ¨æºåã¨ããã®ã¯äººãç¸ãï¼ä½ãæ¹ã«åãããï¼ããã«è¡ãã®ã§ã¯ãªããã¿ãªãé«ãçç£æ§ãåºããã¨ãã§ãããããªæ¹åæ§ã§èãããã¨ããçµç¹ãä¼æ¥ããããããã¦ããããã®ã³ãã ã¨æãã¾ãã
次åã¯ãã©ã°ã¤ã³ã¬ã¸ã¹ããªã¼ã®ã«ã¹ã¿ãã¤ãºãè¡ãã¾ããå®ã¯ç¾æç¹ã§ããã©ã¤æ¸ã¿ãªã®ã§ãããå ¬å¼æé éãã§ã¯ã«ã¹ã¿ãã¤ãºã§ãã¦ããªãæ°é ãæããããï¼è©³ç´°æªç¢ºèªï¼ãåéå¤é£ããããã¾ããã