å ç¢ãªãã€ã¯ããµãŒãã¹éä¿¡ã®ããã®ã¿ã€ãã»ãŒããªãµãŒãã¹ã¡ãã·ã¥ã®å©ç¹ãæ¢ããŸãã忣ã·ã¹ãã ã«ãããä¿¡é Œæ§ãä¿å®æ§ãéçºè ãšã¯ã¹ããªãšã³ã¹ãåäžãããããã«ãåãã©ã®ããã«æŽ»çšããããåŠã³ãŸãããã
ã¿ã€ãã»ãŒããªãµãŒãã¹ã¡ãã·ã¥ïŒåãçšãããã€ã¯ããµãŒãã¹éä¿¡ã®å®è£
çŸä»£ã®ãœãããŠã§ã¢éçºã«ãããŠããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ã¯ã¹ã±ãŒã©ãã«ã§ã¬ãžãªãšã³ããªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®äž»èŠãªãã¿ãŒã³ãšãªã£ãŠããŸãããããããã€ã¯ããµãŒãã¹ã®åæ£æ§ã¯ãç¹ã«ãµãŒãã¹éã®éä¿¡ã«ãããŠãåºæã®è€éãããããããŸãããµãŒãã¹ã¡ãã·ã¥ã¯ããµãŒãã¹ééä¿¡ãåŠçããããã®å°çšã€ã³ãã©ã¹ãå±€ãæäŸããããšã§ããã®è€éãã管çããã®ã«åœ¹ç«ã¡ãŸããããããä¿¡é Œæ§ãšéçºè ãšã¯ã¹ããªãšã³ã¹ãåäžãããããã«ããµãŒãã¹ã¡ãã·ã¥ã¬ãã«ã§åå®å šæ§ã匷å¶ããããšã¯ã§ããªãã§ããããïŒ
ãã€ã¯ããµãŒãã¹éä¿¡ã®èª²é¡
ãã€ã¯ããµãŒãã¹ã¯ãRESTãgRPCãã¡ãã»ãŒãžãã¥ãŒãªã©ãããŸããŸãªãããã³ã«ã䜿çšããŠéä¿¡ããŸããé©åãªã¬ããã³ã¹ããªããã°ããããã®éä¿¡ãã£ãã«ã¯ãšã©ãŒãäžæŽåãããã³ããã©ãŒãã³ã¹ã®ããã«ããã¯ã®åå ãšãªãå¯èœæ§ããããŸããäž»ãªèª²é¡ã¯æ¬¡ã®ãšããã§ãã
- APIã®é²å: ãããµãŒãã¹ã®APIãžã®å€æŽããããã«äŸåããä»ã®ãµãŒãã¹ãå£ãå¯èœæ§ããããŸãã
- ããŒã¿ã®ã·ãªã¢ã©ã€ãº/ãã·ãªã¢ã©ã€ãº: ãµãŒãã¹éã§ããŒã¿åœ¢åŒã inconsistent ã§ãããšãããŒã¹ãšã©ãŒãããŒã¿ç Žæã«ã€ãªããå¯èœæ§ããããŸãã
- å¥çŽéå: ãµãŒãã¹ãåæãããå¥çŽãéµå®ãããäºæãã¬åäœãåŒãèµ·ããå¯èœæ§ããããŸãã
- å¯èŠ³æž¬æ§: è€æ°ã®ãµãŒãã¹ã«ãããéä¿¡ã®åé¡ã远跡ãããããã°ããããšã¯å°é£ã§ãã
ãããã®èª²é¡ã¯ãå¥çŽã匷å¶ããããŒã¿ã®æŽåæ§ãä¿èšŒã§ããå ç¢ã§ä¿¡é Œæ§ã®é«ãéä¿¡ã¡ã«ããºã ã®å¿ èŠæ§ãæµ®ã圫ãã«ããŠããŸããããã§åå®å šæ§ãéèŠã«ãªããŸãã
ãã€ã¯ããµãŒãã¹ã«ãããåå®å šæ§ã®éèŠæ§
åå®å šæ§ã¯ãã¢ããªã±ãŒã·ã§ã³å šäœã§ããŒã¿åãæ£ãã䜿çšãããããšãä¿èšŒããŸãããã€ã¯ããµãŒãã¹ã®ã³ã³ããã¹ãã§ã¯ããµãŒãã¹éã§äº€æãããããŒã¿ãäºåå®çŸ©ãããã¹ããŒããŸãã¯å¥çŽã«æºæ ããŠããããšãæ€èšŒããããšãæå³ããŸããåå®å šãªãã€ã¯ããµãŒãã¹éä¿¡ã®å©ç¹ã¯å€å€§ã§ãã
- ãšã©ãŒã®åæž: ã³ã³ãã€ã«æãŸãã¯å®è¡æã®åãã§ãã¯ã«ããããšã©ãŒãæ©æã«æ€åºããæ¬çªç°å¢ãžã®äŒæãé²ãããšãã§ããŸãã
- ä¿¡é Œæ§ã®åäž: ããŒã¿å¥çŽã匷å¶ããããšã§ããµãŒãã¹ãæåŸ ããã圢åŒã§ããŒã¿ãåä¿¡ããã³åŠçããé害ã®ãªã¹ã¯ãäœæžããŸãã
- ä¿å®æ§ã®åäž: æç¢ºã«å®çŸ©ãããåã¯ãããŒã¿ã®æå³ãšæ§é ãæç€ºçã§ãããããã³ãŒãããŒã¹ãçè§£ããä¿å®ããããšã容æã«ããŸãã
- éçºè ãšã¯ã¹ããªãšã³ã¹ã®åäž: åå®å šæ§ã¯ãéçºè ã«åªããã³ãŒãè£å®ããšã©ãŒã¡ãã»ãŒãžãããã³ãªãã¡ã¯ã¿ãªã³ã°æ©èœãæäŸããŸãã
ãµãŒãã¹ã¡ãã·ã¥ã«ãããåå®å šæ§ã®å®è£
ãµãŒãã¹ã¡ãã·ã¥ã§åå®å šæ§ãå®è£ ããã«ã¯ãããã€ãã®æ¹æ³ããããŸããæãäžè¬çã§å¹æçãªæ¹æ³ã¯ãã¹ããŒãå®çŸ©èšèªãšã³ãŒãçæããŒã«ã掻çšããããšã§ãã
1. ãããã³ã«ãããã¡ïŒProtobufïŒãšgRPC
gRPCã¯ãGoogleãéçºãã髿§èœãªãªãŒãã³ãœãŒã¹RPCãã¬ãŒã ã¯ãŒã¯ã§ããããã¯ãã€ã³ã¿ãŒãã§ãŒã¹å®çŸ©èšèªïŒIDLïŒãšããŠãããã³ã«ãããã¡ïŒProtobufïŒã䜿çšããŸããProtobufã䜿çšãããšã`.proto`ãã¡ã€ã«ã§ããŒã¿ã®æ§é ãå®çŸ©ã§ããŸãããã®åŸãgRPCãã¬ãŒã ã¯ãŒã¯ã¯ãå®çŸ©ãããã¹ããŒãã«åŸã£ãŠããŒã¿ãã·ãªã¢ã©ã€ãºããã³ãã·ãªã¢ã©ã€ãºããããã«ãããŸããŸãªèšèªïŒäŸïŒJavaãGoãPythonïŒã§ã³ãŒããçæããŸãã
äŸïŒProtobufã䜿çšããgRPCãµãŒãã¹ã®å®çŸ©
ä»®ã«ã`ProductService`ãš`RecommendationService`ãšãã2ã€ã®ãã€ã¯ããµãŒãã¹ããããšããŸãã`ProductService`ã¯è£œåæ å ±ãæäŸãã`RecommendationService`ã¯ãŠãŒã¶ãŒã®å¥œã¿ã«åºã¥ããŠè£œåãæšå¥šããŸããProtobufã䜿çšããŠè£œåã®è©³çްãååŸããããã®gRPCãµãŒãã¹ãå®çŸ©ã§ããŸãã
syntax = "proto3";
package product;
service ProductService {
rpc GetProduct(GetProductRequest) returns (Product) {}
}
message GetProductRequest {
string product_id = 1;
}
message Product {
string product_id = 1;
string name = 2;
string description = 3;
float price = 4;
}
ãã®`.proto`ãã¡ã€ã«ã¯ã`GetProductRequest`ãåãåã`Product`ãè¿ã`ProductService`ãå®çŸ©ããŠããŸããã¡ãã»ãŒãžã¯ããµãŒãã¹éã§äº€æãããããŒã¿ã®æ§é ãå®çŸ©ããŸãã`protoc`ã®ãããªããŒã«ã䜿çšãããšãããŸããŸãªèšèªã«å¿ èŠãªã¯ã©ã€ã¢ã³ãããã³ãµãŒããŒã³ãŒããçæã§ããŸããããšãã°ãJavaã§ã¯ããã®gRPCãµãŒãã¹ãšå¯Ÿè©±ããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãšã¯ã©ã¹ãçæã§ããŸãã
gRPCãšProtobufã®å©ç¹:
- 匷åãªåä»ã: Protobufã¯å³å¯ãªåãã§ãã¯ã匷å¶ããããŒã¿ãæ£ããã·ãªã¢ã©ã€ãºããã³ãã·ãªã¢ã©ã€ãºãããããšãä¿èšŒããŸãã
- ã³ãŒãçæ: gRPCã¯è€æ°ã®èšèªã§ã³ãŒããçæããéçºããã»ã¹ãç°¡çŽ åããŸãã
- ããã©ãŒãã³ã¹: gRPCã¯HTTP/2ãšãã€ããªã·ãªã¢ã©ã€ãºã䜿çšããé«ãããã©ãŒãã³ã¹ãå®çŸããŸãã
- ã¹ããŒãé²å: Protobufã¯ã¹ããŒãé²åããµããŒãããŠãããæ¢åã®ãµãŒãã¹ãç Žå£ããããšãªããã£ãŒã«ãã远å ãŸãã¯å€æŽã§ããŸãïŒæ éãªèšç»ãå¿ èŠã§ãïŒã
2. OpenAPIïŒSwaggerïŒãšã³ãŒãçæ
OpenAPIïŒæ§SwaggerïŒã¯ãRESTful APIãèšè¿°ããããã®ä»æ§ã§ããAPIãšã³ããã€ã³ãããªã¯ãšã¹ããã©ã¡ãŒã¿ãã¬ã¹ãã³ã¹åœ¢åŒãããã³ãã®ä»ã®ã¡ã¿ããŒã¿ãå®çŸ©ããããã®æšæºåãããæ¹æ³ãæäŸããŸããOpenAPI仿§ã¯YAMLãŸãã¯JSON圢åŒã§èšè¿°ã§ããŸãã
Swagger CodegenãOpenAPI Generatorã®ãããªããŒã«ã¯ãOpenAPI仿§ããã¯ã©ã€ã¢ã³ãããã³ãµãŒããŒã³ãŒããçæããããã«äœ¿çšã§ããŸãããã®ã¢ãããŒãã«ãããAPIå®çŸ©ã«åºã¥ããŠããŒã¿ã¢ãã«ãšæ€èšŒããžãã¯ãçæããããšã§ãåå®å šæ§ã匷å¶ã§ããŸãã
äŸïŒOpenAPIã䜿çšããREST APIã®å®çŸ©
åã`ProductService`ã®äŸã䜿çšããŠãOpenAPIã䜿çšããŠè£œå詳现ãååŸããããã®REST APIãå®çŸ©ã§ããŸãã
openapi: 3.0.0
info:
title: Product API
version: 1.0.0
paths:
/products/{product_id}:
get:
summary: Get product details
parameters:
- name: product_id
in: path
required: true
schema:
type: string
responses:
'200':
description: Successful operation
content:
application/json:
schema:
type: object
properties:
product_id:
type: string
name:
type: string
description:
type: string
price:
type: number
format: float
ãã®OpenAPI仿§ã¯ã`product_id`ã«ãã補å詳现ååŸã®ããã®`GET`ãšã³ããã€ã³ããå®çŸ©ããŠããŸãã`responses`ã»ã¯ã·ã§ã³ã¯ãåãã£ãŒã«ãã®ããŒã¿åãå«ãã¬ã¹ãã³ã¹ããŒã¿ã®æ§é ãå®çŸ©ããŸããOpenAPI Generatorã®ãããªããŒã«ã䜿çšãããšããã®ä»æ§ã«åºã¥ããŠããŒã¿ã¢ãã«ãšæ€èšŒããžãã¯ãå«ãã¯ã©ã€ã¢ã³ãã³ãŒãïŒäŸïŒJavaãPythonãJavaScriptïŒãçæã§ããŸããããã«ãããã¯ã©ã€ã¢ã³ãã¯åžžã«æåŸ ããã圢åŒã§ãªã¯ãšã¹ããéä¿¡ããã¬ã¹ãã³ã¹ãåä¿¡ããããšãä¿èšŒãããŸãã
OpenAPIãšã³ãŒãçæã®å©ç¹:
- APIããã¥ã¡ã³ã: OpenAPIã¯ã人éãèªãã圢åŒã𿩿¢°ãèªãã圢åŒã®APIèšè¿°ãæäŸããŸãã
- ã³ãŒãçæ: ããŒã«ã¯OpenAPI仿§ããã¯ã©ã€ã¢ã³ãããã³ãµãŒããŒã³ãŒããçæã§ããŸãã
- æ€èšŒ: OpenAPIã¯ããŒã¿æ€èšŒããµããŒãããŠããããªã¯ãšã¹ããšã¬ã¹ãã³ã¹ãAPIå®çŸ©ã«æºæ ããŠããããšãä¿èšŒããŸãã
- å¥çŽåªå éçº: OpenAPIã¯APIèšèšã«ãããŠå¥çŽåªå ã¢ãããŒããæšé²ããå®è£ ã®åã«API仿§ãå®çŸ©ãããŸãã
3. ãµãŒãã¹ã¡ãã·ã¥ããªã·ãŒãšã¹ããŒãæ€èšŒ
Istioã®ãããªäžéšã®ãµãŒãã¹ã¡ãã·ã¥å®è£ ã¯ãããªã·ãŒã®é©çšãšã¹ããŒãã®æ€èšŒã®ããã®çµã¿èŸŒã¿æ©èœãæäŸããŸãããããã®æ©èœã«ããããµãŒãã¹ãã©ã®ããã«éä¿¡ãããã管çããããŒã¿ãç¹å®ã®ã¹ããŒãã«æºæ ããŠããããšãä¿èšŒããã«ãŒã«ãå®çŸ©ã§ããŸãã
ããšãã°ãIstioã®`EnvoyFilter`ã䜿çšããŠãã©ãã£ãã¯ãååããHTTPãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®ã³ã³ãã³ããæ€èšŒã§ããŸãããŸããIstioã®`AuthorizationPolicy`ã䜿çšããŠãã©ã®ãµãŒãã¹ãä»ã®ãµãŒãã¹ã«ã¢ã¯ã»ã¹ã§ããããå¶åŸ¡ããããšãã§ããŸãããã€ããŒããæ€èšŒããã«ã¯ãããããProtobufå®çŸ©ã®ãããªãã®ã掻çšãããããEnvoyãã£ã«ã¿ãŒã䜿çšã§ããã³ãŒãã«ã³ã³ãã€ã«ããããšã«ãªãã§ãããã
äŸïŒIstioã䜿çšããã¹ããŒãæ€èšŒ
Istioã®å®å šãªæ§æã¯ãã®èšäºã®ç¯å²ãè¶ ããŠããŸãããæ žãšãªãã¢ã€ãã¢ã¯ãEnvoyãã£ã«ã¿ãŒïŒIstioã®APIãä»ããŠæ§æïŒã䜿çšããŠãã¡ãã·ã¥ãééããã¡ãã»ãŒãžãååããã³æ€èšŒããããšã§ããã¹ããŒãïŒäŸïŒProtobufãŸãã¯JSON SchemaïŒã䜿çšããŠéåä¿¡ããŒã¿ãæ€èšŒããã«ã¹ã¿ã ãã£ã«ã¿ãŒãäœæããŸããããŒã¿ãã¹ããŒãã«æºæ ããŠããªãå Žåããã£ã«ã¿ãŒã¯ãªã¯ãšã¹ããŸãã¯ã¬ã¹ãã³ã¹ãæåŠã§ããŸãã
ãµãŒãã¹ã¡ãã·ã¥ããªã·ãŒãšã¹ããŒãæ€èšŒã®å©ç¹:
- äžå çãªå¶åŸ¡: ããªã·ãŒã¯ãµãŒãã¹ã¡ãã·ã¥ã¬ãã«ã§å®çŸ©ããã³é©çšãããäžå çãªå¶åŸ¡ãã€ã³ããæäŸããŸãã
- ã©ã³ã¿ã€ã æ€èšŒ: ã¹ããŒãæ€èšŒã¯å®è¡æã«å®è¡ãããããŒã¿ãã¹ããŒãã«æºæ ããŠããããšãä¿èšŒããŸãã
- å¯èŠ³æž¬æ§: ãµãŒãã¹ã¡ãã·ã¥ã¯ãéä¿¡ãã¿ãŒã³ãšããªã·ãŒé©çšã«é¢ããå¯èŠæ§ãæäŸããŸãã
å®è·µçãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
åå®å šãªãã€ã¯ããµãŒãã¹éä¿¡ãå®è£ ããã«ã¯ãæ éãªèšç»ãšå®è¡ãå¿ èŠã§ãã以äžã«ãããã€ãã®å®è·µçãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹ã瀺ããŸãã
- é©åãªããŒã«ã®éžæ: ããŒãºãšæè¡çå°éç¥èã«æé©ãªããŒã«ãšãã¬ãŒã ã¯ãŒã¯ãéžæããŠãã ãããgRPCãšProtobufã¯é«æ§èœãªRPCéä¿¡ã«é©ããŠããŸãããOpenAPIãšSwaggerã¯RESTful APIã«ããé©ããŠããŸãã
- æç¢ºãªå¥çŽã®å®çŸ©: ProtobufãOpenAPIã®ãããªã¹ããŒãå®çŸ©èšèªã䜿çšããŠãæç¢ºã§ææ§ãã®ãªãAPIå¥çŽãå®çŸ©ããŸãã
- ã³ãŒãçæã®èªåå: äžè²«æ§ã確ä¿ããæäœæ¥ãæžããããã«ã³ãŒãçæããã»ã¹ãèªååããŸãã
- æ€èšŒããžãã¯ã®å®è£ : ãšã©ãŒãæ©æã«æ€åºããããã«ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã«æ€èšŒããžãã¯ãå®è£ ããŸãã
- å¥çŽãã¹ãã®äœ¿çš: ãµãŒãã¹ãåæãããå¥çŽãéµå®ããŠããããšãæ€èšŒããããã«å¥çŽãã¹ãã䜿çšããŸããPactãSpring Cloud Contractã®ãããªããŒã«ã圹ç«ã¡ãŸãã
- APIã®ããŒãžã§ã³ç®¡ç: APIã®å€æŽã管çããæ¢åã®ãµãŒãã¹ãå£ããªãããã«ããããã«APIããŒãžã§ã³ç®¡çã䜿çšããŸãã
- ç£èŠãšå¯èŠ³æž¬æ§: æœåšçãªåé¡ãç¹å®ããããã«ãéä¿¡ãã¿ãŒã³ãšãšã©ãŒçãç£èŠããã³èŠ³æž¬ããŸãã
- åŸæ¹äºææ§ã®èæ ®: APIãé²åãããéã¯ãæ¢åã®ãµãŒãã¹ãžã®åœ±é¿ãæå°éã«æããããã«åŸæ¹äºææ§ã远æ±ããŸãã
- ã¹ããŒãã¬ãžã¹ããª: ã€ãã³ãé§ååã¢ãŒããã¯ãã£ïŒã¡ãã»ãŒãžãã¥ãŒã䜿çšïŒã®å ŽåãApache Kafkaã®Schema RegistryãConfluent Schema Registryã®ãããªã¹ããŒãã¬ãžã¹ããªã®äœ¿çšãæ€èšããŠãã ããããããã«ãããã€ãã³ãã®ã¹ããŒããä¿åããã³ç®¡çãããããã¥ãŒãµãŒãšã³ã³ã·ã¥ãŒããŒãäºææ§ã®ããã¹ããŒãã䜿çšããŠããããšãä¿èšŒã§ããŸãã
ããŸããŸãªæ¥çããã®äŸ
åå®å šãªãã€ã¯ããµãŒãã¹éä¿¡ã¯ãããŸããŸãªæ¥çã§é©çšå¯èœã§ãã以äžã«ããã€ãã®äŸã瀺ããŸãã
- Eã³ããŒã¹: Eã³ããŒã¹ãã©ãããã©ãŒã ã¯ãè£œåæ å ±ãæ³šæè©³çްãããã³æ¯æãååŒãæ£ããåŠçãããããšãä¿èšŒããããã«åå®å šæ§ã䜿çšã§ããŸãã
- éèãµãŒãã¹: éèæ©é¢ã¯ãéèååŒãå£åº§æ®é«ãããã³é¡§å®¢ããŒã¿ã®äžè²«æ§ãšã»ãã¥ãªãã£ãä¿èšŒããããã«åå®å šæ§ã䜿çšã§ããŸãã
- ãã«ã¹ã±ã¢: ãã«ã¹ã±ã¢ãããã€ããŒã¯ãæ£è èšé²ãå»ç蚺æãããã³æ²»çèšç»ãæ£ç¢ºã§ä¿¡é Œã§ãããã®ã§ããããšãä¿èšŒããããã«åå®å šæ§ã䜿çšã§ããŸãã
- ããžã¹ãã£ã¯ã¹: ããžã¹ãã£ã¯ã¹äŒæ¥ã¯ãåºè·è¿œè·¡ãé éã¹ã±ãžã¥ãŒã«ãããã³åšåº«ç®¡çãå¹ççãã€æ£ç¢ºã§ããããšãä¿èšŒããããã«åå®å šæ§ã䜿çšã§ããŸãã
çµè«
ã¿ã€ãã»ãŒããªãµãŒãã¹ã¡ãã·ã¥ã¯ãå ç¢ã§ä¿¡é Œæ§ã®é«ããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ãæ§ç¯ããããã®åŒ·åãªã¢ãããŒããæäŸããŸããã¹ããŒãå®çŸ©èšèªãã³ãŒãçæããŒã«ãããã³ãµãŒãã¹ã¡ãã·ã¥ããªã·ãŒã掻çšããããšã§ãå¥çŽã匷å¶ããããŒã¿ãæ€èšŒãã忣ã·ã¹ãã å šäœã®å質ãåäžãããããšãã§ããŸããåå®å šæ§ã®å®è£ ã«ã¯åæã®æéãšåŽåã®æè³ãå¿ èŠã§ããããšã©ãŒã®åæžãä¿å®æ§ã®åäžãéçºè ãšã¯ã¹ããªãšã³ã¹ã®åŒ·åãšããé·æçãªã¡ãªããã¯ãããã䟡å€ããåãçµã¿ã«ããŸããåå®å šæ§ãåãå ¥ããããšã¯ãçŸä»£ã®ãœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ã®èŠæ±ãæºãããã¹ã±ãŒã©ãã«ã§ã¬ãžãªãšã³ãã§ä¿å®å¯èœãªãã€ã¯ããµãŒãã¹ãæ§ç¯ããããã®éèŠãªã¹ãããã§ãããã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£ãé²åãç¶ããã«ã€ããŠãåå®å šæ§ã¯ãããã®è€éãªã·ã¹ãã ã®æåã確å®ã«ããäžã§ãŸããŸãéèŠãªèŠçŽ ãšãªãã§ããããå°ççãªå Žæãæåçèæ¯ã«é¢ä¿ãªããã¢ããªã±ãŒã·ã§ã³ãå°æ¥ã«ããã£ãŠå¯Ÿå¿ããã倿§ãªéçºããŒã éã®ã³ã©ãã¬ãŒã·ã§ã³ãæ¹åããããã«ããããã®ææ³ã®æ¡çšãæ€èšããŠãã ããããã¹ãŠã®ããŒã ãæç¢ºã«å®çŸ©ãããæ€èšŒãããå¥çŽã«åºã¥ããŠäœæ¥ããŠããããšã確èªããããšã§ããã€ã¯ããµãŒãã¹ãšã³ã·ã¹ãã å šäœã®å®å®æ§ãšå¹çãå€§å¹ ã«åäžããŸãã