
ããããã€habrazhitelïŒ
Windows Phoneã§ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœãã¹ãäžã«ã³ãŒãã«ãã¬ããžã®å¶åŸ¡ã確ç«ããããšã§ãç§ã®ææãå
±æããããšæããŸãã ãã®åé¡ã解決ããéã«ããæ£ãããã¢ããªã±ãŒã·ã§ã³èšèšã®ããã€ãã®åŽé¢ã«å¯ŸåŠããªããã°ãªããªãã£ãããšã¯æ³šç®ã«å€ããŸãã ãããã£ãŠããã®æçš¿ã¯å°ããªæç§æžãšèŠãªãããšãã§ããŸãã
åé¡ã®å£°æ
äžããããïŒWindows Phoneçšã®å°ããªã¢ããªã±ãŒã·ã§ã³ã®éçºãå§ãŸããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯å
žåçãªãã®ã§ã-ãµãŒããŒããããŒã¿ãååŸããäœããã®åœ¢ã§ãŠãŒã¶ãŒã«è¡šç€ºããŸãã
å¿
é ã§ãïŒã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãèšèšããŠãç¶ç¶çãªçµ±åã«ãããäœæ¥ã®ããžãã¯ãæ
åœããã¢ããªã±ãŒã·ã§ã³ã®æ倧ã³ãŒããããã®ã«ãã¬ããžãå¶åŸ¡ããæ©èœãåãããã¹ãã«ãã£ãŠéããããããã«ããŸãã
äžè¬çãªã¢ãããŒã
ãã§ã«æžããããã«ãWindows Phoneã©ã³ã¿ã€ã ã«ã¯ã³ãŒãã«ãã¬ããžãå¶åŸ¡ããæ段ããããŸããã§ããã
Naggãš
halkarã®ã¢ããã€ã¹ã§ãPortable Class Libraryã®ã¢ããªã±ãŒã·ã§ã³ã®æ©èœïŒããžãã¯ïŒã§ã³ãŒããã¬ã³ããªã³ã°ããŸããã ããã«ãããã«ãã¬ããžå¶åŸ¡ãåããæšæºã®.NET Frameworkç°å¢ã§ãã¹ããå®è¡ã§ããŸããã ããã«ããã®ã¢ãããŒãã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®ã·ã¹ãã ã§ã·ã£ãŒãããºã ãæé€ãããã¹ãã®å®è¡æéãççž®ããŸãã
ãããã£ãŠãç°¡åãªæ¹æ³ã§ãã¢ããªã±ãŒã·ã§ã³ã¯3ã€ã®ã³ã³ããŒãã³ãã®åœ¢åŒã§è¡šãããšãã§ããŸãã
ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã¯ãWindows Phoneã©ã³ã¿ã€ã ãŸãã¯ãã¹ãç°å¢ã«äŸåããªãPCLã«ãããŸãã
Windows Phoneã¢ããªã±ãŒã·ã§ã³ã¯ãã®ã©ã€ãã©ãªã䜿çšããXAMLããŒã¯ã¢ãããšæå°éã®ã³ãŒããå«ã¿ãŸãã
ãã¹ãDLLã¯PCLãåç
§ããå®éã®ãã¹ãã³ãŒããå«ãŸããŠããŸãã MSTestããã¹ããã¬ãŒã ã¯ãŒã¯ãšããŠäœ¿çšããŸããããåé¡ã§ã¯ãããŸããã
ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã¯ç空ã§åäœããããšã¯ã§ããŸãããWebãµãŒããŒãWindows Phoneã«çŽæ¥æ¥ç¶ãããŠããä»ã®ãŠãŒã¶ãŒãšãŠãŒã¶ãŒãšå¯Ÿè©±ããå¿
èŠããããŸãã åæã«ããã¹ããå®è¡ããå Žåããã®çžäºäœçšã¯éåžžã®.NET Frameworkã®ç°å¢ã§æ¢ã«äœããã®æ¹æ³ã§ãšãã¥ã¬ãŒããããå¿
èŠããããŸãã
ãã®çµæãPCLãã以äžãçºè¡ãããŸããã
- WebãµãŒããŒã§ã®äœæ¥ïŒèŠæ±ã®éä¿¡ãšå¿çã®åä¿¡ïŒ
- ãã¡ã€ã«ã®æäœïŒä¿åãèªã¿åãããªã¹ãã®ååŸïŒ
- æååãªãœãŒã¹ã®ããŒã«ã©ã€ãº
- ã€ã³ã¿ãŒãããæ¥ç¶ã®å¯çšæ§ã確èªãã
- ä»ã®äœã
ããã«ã€ããŠããå°ãæ€èšããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ã®äžè¬åãããã¹ããŒã ã¯æ¬¡ã®ããã«ãªããŸãã
- HTTPèŠæ±ããµãŒããŒã«éä¿¡ãããŸã
- åçãåãå
¥ããããŸãã
- åçã®è§£æ/åŠç
- å解çµæã衚瀺ãããŸãã
ãã¹ãããããžãã¯ã¯ã¹ããŒãž3ã®ã¿ã§ãããã®å Žåãä»ã®ãã¹ãŠã®ã¹ããŒãžãæ
åœããã³ãŒããPCLããåé€ããããšã¯è«ççã§ãã
Windows Phoneã®ç»é¢ã«è¡šç€ºããå Žåããã®ãããªåé€ã¯éåžžã«ééçã§ããViewModelsã¯PCLã«ãããViewModelsãžã®ã³ã³ãããŒã«ã®ãã€ã³ãããããã£ã¯XAMLã§èª¬æãããŠããŸãã ãã¹ãäžã«ãViewModelã®å¿
èŠãªããããã£ãšã¡ãœããããã«ãããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ãã·ãã¥ã¬ãŒããããããã«å¯Ÿããåå¿ããã§ãã¯ããã ãã§ãã
次ã«ããµãŒããŒã®æäœãæ€èšããŸãã PCLã«ã¯HTTPã¯ã©ã€ã¢ã³ãå®è£
ïŒ
HttpWebRequest
ïŒããããPCLã§WebãµãŒããŒã³ãŒããçŽæ¥èšè¿°ããããšã¯è«ççã«æããŸãã
ãã ããã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ããã¹ãããããšãç®æšã§ããããšãå¿ããŠã¯ãªããŸããã WebãµãŒããŒãžã®èŠæ±ãPCLã«éä¿¡ããããã®ã³ãŒãããã£ãããšçž«ãå Žåããã¹ãã®ããã«ããµãŒããŒãã·ãã¥ã¬ãŒãããŠå¥ã®WebãµãŒããŒãäžããããäœããã®æ¹æ³ã§èŠæ±ãã€ã³ã¿ãŒã»ããããå¿
èŠããããŸãã
ç¶ããŸãããã åŠçäžã«ãããŒã¿ããã£ãã·ã¥ããããšãã§ããŸã-ããã€ã¹äžã®ãã¡ã€ã«ãšããŠä¿åãããŸãã ãã ããPCLã«ã¯å®å
šãªãã¡ã€ã«ç®¡çããŒã«ããããŸããã ããã¯ãç°ãªãã©ã³ã¿ã€ã ãç°ãªãã¹ãã¬ãŒãžç·šæã¡ã«ããºã ã䜿çšãããšããäºå®ã«ãããã®ã§ãã ãããã£ãŠã䜿ãæ
£ãã.NETã§ã¯ãéåžžã®ããã¡ã€ã«ïŒããšãã°ã
File
ïŒã§ãããWindows Phoneã§ã¯
IsolatedStorageFile
ã§ãã ãŸãããã¹ãäžã«ãã®ãããªãªããžããªãã·ãã¥ã¬ãŒãããå¿
èŠãããããšãå¿ããªãã§ãã ããã
å®éã®åé¢ã¯ç°¡åãªæ¹æ³ã§è¡ãããŸãããPCLã§ã¯ãWebãªã¯ãšã¹ãããã¡ã€ã«ãããŒã«ã©ã€ãºãªã©ãæäœããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã宣èšããç¬èªã®ä»æ§ã§Windows Phoneã¢ããªã±ãŒã·ã§ã³ã«æ¢ã«å®è£
ããŠããŸãã ãããã£ãŠããã¹ãç®çã§ã¯ããã©ã€ããç°å¢ã®äœæ¥ãå€å°ãªããšã確å®ã«ã·ãã¥ã¬ãŒããããããªæ¹æ³ã§ãããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããå¿
èŠããããŸãã
å¶åŸ¡ã®å転
ããçšåºŠã®è¿äŒŒã§ã¯ããã®åŠå®ã¯
å¶åŸ¡ã®ç§åŠç
é転ãšåŒã°ããŸãã ç§
èªèº«ã¯ãããã¯ãŒã¯å
ã®ãã®ãããã¯ã«é¢ãã
ååãªè³æã
ç¥ããªãããããžã£ã³ã°ã«ã«
ã¯å
¥ããŸãã ãäž»ãªãã€ã³ãã®ã¿ã説æããŸãã æå³ã®ããã¿ã®å¯èœæ§ãããããšãã°ã«ã«äºåã«è¬çœªããŸã-çªç¶ã®å Žåã¯ãã³ã¡ã³ããåŸ
ã£ãŠããŸãã
ããšãã°ããã¡ã€ã«ã€ã³ã¿ãŒãã§ã€ã¹ãèŠãŠã¿ãŸãããã
public interface IFileStorage { Stream GetWriteFileStream(string fileName); Stream GetReadFileStream(string fileName); bool IsFileExists(string fileName); List<string> GetAllFileNames(string path); }
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã¹ãã¬ãŒãžã®è©³çŽ°ã«å
¥ããã«ãã¡ã€ã«ãæäœããã®ã«ååã§ãã ãããã£ãŠããã以äžäœãç¥ããªãã®ã¯ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãšPCLã«ã€ããŠã§ãã Windows Phoneã¢ããªã±ãŒã·ã§ã³ã«å®è£
ãããå®è£
ã¯
IsolatedStorageFile
䜿çšããŸãã
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã¹ãDLLã«ãå®è£
ãããŠãããéåžžã«ããªããã£ãã§ãããã¹ãŠã®ãã¡ã€ã«ã¯ã
Dictionary<string, MemoryStream>
圢åŒã§ã¡ã¢ãªã«ä¿åãããŸãã ãããã£ãŠãããã°ã©ã ã®ããžãã¯ã¯ãå®éã®ãã¡ã€ã«ã§æ©èœãããšèããŠæºè¶³ããŠããŸãããŸãããã¹ãã®ç¬ç«æ§ã®åé¡ã解決ããŠããã®ã§æºè¶³ããŠããŸãã æ°ãããã¹ã-ã¯ã©ã¹ã®æ°ããã€ã³ã¹ã¿ã³ã¹-ã¯ãªãŒã³ãªããã¡ã€ã«ã·ã¹ãã ãã
ãã ãããã¡ã€ã«ã«å ããŠãWebãããŒã«ãªãŒãŒã·ã§ã³ãªã©ãšäœæ¥ãåãé¢ãå¿
èŠããããŸãã 䟿å®äžãããããã¹ãŠãå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ã§çµã¿åãããŸãã
public interface IContainer { IFileStorage FileStorage { get; } IDataRequest DataRequest { get; } ILocalizer Localizer { get; } IUiExtenter Extender { get; } DateTime Now { get; } }
ç§ã¯ããããã³ã³ããããšåŒã³ãŸãããããå¶åŸ¡ã®å転ããã³ãã¬ãŒãã®çšèªã§ã¯ãããã¯å®å
šã«æ£ãããšã¯éããŸããã
ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããã¡ã€ã«ïŒ
FileStorage
ïŒããµãŒããŒãªã¯ãšã¹ãïŒ
DataRequest
ïŒãããŒã«ãªãŒãŒã·ã§ã³ïŒ
Localizer
ïŒããã³ãã®ä»ïŒ
Extender
ïŒãæäœããããã®PCLããžãã¯ããŒã«ãæäŸããç°¡æœã«ããããã«1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«çµ±åãããŠããŸãã
ãããšã¯å¥ã«ãNowããããã£ã«æ³šç®ããŸãã ãã¹ãå°çšã§ãã å®éã®ãšãããå€ãã®å Žæã§ããžãã¯ã¯çŸåšã®æå»ã«é¢é£ä»ããããŠããããã¹ãç°å¢ãæ£ãããšãã¥ã¬ãŒã·ã§ã³ããã«ã¯ããã®æå»ãå€æŽããå¿
èŠããããŸãã ã·ã¹ãã æå»ãå€æŽããã®ã¯æªãèãã§ãããã®ããããã®ããããã£ã衚瀺ãããŸãã äž»ãªããšã¯ã
DateTime.Now
代ããã«ãã®ããããã£ã䜿çšããå¿
èŠãããããšãæãåºãããšã§ããã
ã³ã³ããã«ã¯ãWindows Phoneã¢ããªã±ãŒã·ã§ã³ãšãã¹ãDLLã®2ã€ã®å®è£
ããããŸãã åã³ã³ããã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹å®è£
ããã¹ãªãããããŸããã ãã®ããããã¹ãDLLã®ã³ã³ããã¯
IDataRequest
ãã¹ã¿ãã®åœ¢åŒã§å®è£
ãããã¹ãã§ãµãŒããŒã®å¿çãšéä¿¡ã®åé¡ãã·ãã¥ã¬ãŒãã§ããããã«ããŸããã
IContainer
ãå®è£
ãããªããžã§ã¯ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®æåã«äœæãããŸãã ãã¹ãäžã«ããã¹ãããšã«ãã®ãããªæ°ãããªããžã§ã¯ããäœæãããŸãã ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã管çããã¯ã©ã¹ã«ã¯ããã®ãªããžã§ã¯ããžã®åç
§ãå¿
èŠã§ãã ãããè¡ãç°¡åãªæ¹æ³ã¯ããã¹ãŠã®ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ãªã³ã¯ãèŠæ±ããããšã§ãã
ãã¡ããã
Unity Application Blockãªã©ãå¶åŸ¡ã¹ããŒã ã®å転
ãå®è£
ãã
ããã®æ¢è£œã®
ãã€ã¯ãå€æ°ãããŸãããäž»ã«æè²ç®çã§ãã®ãªãã·ã§ã³ãéžæããŸããã ãã¡ããããã¢ãã«ãããããžã§ã¯ãã§ã¯ãæ¢æã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããããšããå§ãããŸãã
åé¡
çè«çã«ã¯ãã¹ãŠãçŸããçŸããèãããŸãããå®éã«ã¯ããã€ãã®åé¡ã«çŽé¢ããªããã°ãªããŸããã§ããã å³å¯ã«èšãã°ãPCLã§ãã¹ãŠã®ããžãã¯ãäœæããããšã¯ã§ããŸããã§ããã ãã®ãããããŒãžéã®ããã²ãŒã·ã§ã³ãDependencyããããã£ãäœæããããã®ã³ãŒããããã³ãã®ä»ã®ããã€ãã¯ãWindows Phoneã¢ããªã±ãŒã·ã§ã³ãããžã§ã¯ãã«æ®ã£ãŠãããããã¯ããŒãºããã¹ãã§ã¯ãããŸããã§ããã çè«çã«ã¯ããã®ã³ãŒãã®å€§éšåãPCLã«è»¢éã§ããŸãããããã«ãããæœè±¡åã®äžåœãªïŒãã¡ããIMHOïŒè¥å€§åãèµ·ãããçµæãšããŠå°æ¥ã®ã³ãŒãã®ãµããŒããè€éã«ãªããŸãã
å¥ã®åé¡ã¯ãXAMLã®ããããã£ãå¶åŸ¡ããããã®ViewModelsããããã£ã®ãã€ã³ãã§ãã åŸè
ã®å€ãã«ã¯ãPCLã§ã¯äœ¿çšã§ããªãç¹å®ã®ã¿ã€ãïŒ
Brush
ã
Visibility
ïŒããããŸãã ãã®åé¡ã¯
å€æã¡ã«ããºã ã«ãã£ãŠçŸãã解決ãããŸãããå€æ°ã®ã³ã³ãããŒã«ã䜿çšãããšããã®ãããªå€æã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ã®é床ã倧å¹
ã«äœäžããå¯èœæ§ãããããšãèŠããŠããå¿
èŠããããŸãã
ããäžã€
ç§ã«ã¯ãããæ£ç¢ºã«å®è£
ã§ããããã«æããããã®ãããã€ããããŸããããã®æ¹æ³ã¯ããããŸããã æ£ããéãèšå®ããŠãã ãã£ãæ¹ã
ã«æè¬ããŸãã
æåã®ããšã ã·ã¹ãã ã®ããžãã¯ã«åŸã£ãŠãã¢ã«ãŽãªãºã ã®ç¹å®ã®å Žæã§ããŠãŒã¶ãŒã«éžæè¢ã®ãããã€ã¢ãã°ã衚瀺ãããŠãŒã¶ãŒã®éžæã«å¿ããŠã¢ã«ãŽãªãºã ãç¶è¡ããå¿
èŠããããŸãã ã³ã³ããã€ã³ã¿ãŒãã§ã€ã¹ã®1ã€ã«ShowDialogã¡ãœãããå®è£
ããPCLã®ã³ãŒãããçŽæ¥åŒã³åºãããšã»ã©è¯ããã®ã¯æãã€ããŸããã§ããã ãããã£ãŠããã®ã¡ãœããã®ãæŠéãå®è£
ã§ã¯å®éã®ãã€ã¢ãã°ã衚瀺ããããŠãŒã¶ãŒã®éžæãåŸ
ã£ãŠããŸãããããã¹ãã§ã¯äºåã«èšå®ãããå€ãè¿ãããŸããã
第äºã«ã ãã®ããžãã¯ã¯ãã¿ã€ããŒã³ã³ãããŒã«ã®ç¶æ
ãæŽæ°ããŸãã ãã ããPCLã§äœ¿çšå¯èœãª
Timer
ã¯ã©ã¹ã¯ãå¥ã®ã¹ã¬ããã§ééçµäºãã³ãã©ãŒãåŒã³åºããŸãã ãã®å ŽåãèŠçŽ ã®ç¶æ
ãæŽæ°ããããšãããšå€±æããŸãã ç§ã®é ã®äžã®è§£æ±ºçã¯ãåŒæ°ãšããŠããªã²ãŒããæã€ã¡ãœãããã€ã³ã¿ãŒãã§ã€ã¹ã«èšè¿°ããããšã§ãã ãæŠéãå®è£
ã§ã¯ããã®ã¡ãœããã¯
BeginInvoke
ãåŒã³åºããŠã¡ã€ã³ã¹ã¬ãããšãã¹ãã§åæããŸã-åã«ããªã²ãŒããåŒã³åºããŸãã
æãå±ããªããŸã§
æ ããŠãããã1ã€ã®ããšã¯ããã¹ãç°å¢ã§åãã¿ã€ããŒããšãã¥ã¬ãŒãããããšã§ãã çŸåšãããã€ãã®ãã¹ãã§åŒ·å¶çãªé
延ãçºçããŠããŸãããããã¯èŠèŠãããã®ã§ãã
ãŸãšã
æ®ãã®ãã¹ãã§ã¯ãã»ãšãã©ã®æ©èœãéããããŸããã ViewModelsãã¹ãã³ãŒãã¯ãå®éã®ãã¹ãã±ãŒã¹ã®èª¬æã«äŒŒãŠããŸãïŒããããã¯ãªãã¯ã-ãããã«ãã®ãããªçªå·ãå
¥åã-ãå€ãæåŸ
å€ãšæ¯èŒãïŒã
ãã®ãããªãã¹ããæžãããšã¯ãéçºè
ãå¿ããã¹ã¿ãŒãããæ°ã«ãããè¯ãæ¹æ³ã§ãã ãããŠã圌ãã¯ã¯ãªãã¯ãã代ããã«ã³ãŒããæžããŠåãã§ããŠããã¹ããé²è¡äžã§ã:)
ã¹ã¯ãªãããšãã°ãå«ãã¢ã€ãã¢ããªããªã£ããšããTeamCityã®ç·è²ã®ç®ã§ãæŠéäž
ã«ç«æã«ã¢ããªã±ãŒã·ã§ã³ãçŽæ¥èµ·åã§ãããšããèªä¿¡ã ãããããŸããã ãããŠãããã€ãã®ãããããåºå®ãããå¿
èŠããããšãã«ãã¹ããåé¡ããã£ããããåæ°-çµ±èšã®æ§ç¯ã®ã¿ãç¥ã£ãŠãã...
æãéèŠãªçµæã¯ãã³ãŒãã®å®è¡åŸããã¹ãããåæ Œãããè¡ãšå€æŽãããŠããªãè¡ã確èªã§ããããšã§ãã ãã®ããŒã¿ã¯ãçµ±èšã®åœ¢åŒïŒã圱é¿ãåãããã¯ã©ã¹ãã¡ãœãããããã³è©³çŽ°ã¬ãã«ã®ç°ãªãã³ãŒãè¡ïŒã®äž¡æ¹ãããã³èµ€ãšç·ã®è²ä»ãã®ãœãŒã¹ã³ãŒãã®åœ¢åŒã§è¡šç€ºãããŸãã
ãã¹ãŠã®ã³ãŒããã¹ããéããããšãã§ããŸããã§ããã ãããã£ãŠãã³ã³ããã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ãšåæ§ã«ãåé¢ã³ãŒãã¯å®çŸ©ã«ããéããããã«æ®ããŸãã ãã ããPCLå
ã«ãã£ããã®ïŒããã³ããã¯ããã®æ©èœã«çŽæ¥é¢äžããããã°ã©ã ã³ãŒãã®ã»ãšãã©ã§ãïŒã¯ãéåžžã«ããã«ããŒãããå¶åŸ¡ãããŠããŸãã
ç§ã¯ããã¢ãªã®ã§ãã¡ãœããã®ã«ãã¬ããžã100ïŒ
æªæºã®å ŽåïŒãã¹ããå
¥åãããªãã£ãã©ã ãåŒãªã©ãå¶åŸ¡ãããã³ãŒãã«å°ãªããšã1ã€ã®ã¡ãœããããã£ãå ŽåïŒããã«ããããã©ãŒã«ãã«èšå®ããŸãã æ®éã®äººã«ãšã£ãŠã¯ããã®ãããªå¶åŸ¡ã¯ããããå€ãããã§ãããã
ãããã«ãããã³ãŒãã«ãã¬ããžã¯ãã¹ãã«ããæ©èœçã«ãã¬ããžãšçžé¢ããŠãããèµ€ãç·ã®ç 究ã¯ãã°ãã°ããšã³ã³ãŒããã¹ããã¹ãã·ããªãªã«ã€ããŠã®èããä¿ããŸããã

äž»ãªçµè«ã¯ãWindows Phoneã®å Žåãã³ãŒãã«ãã¬ããžå¶åŸ¡ã䜿çšããŠåäœãã¹ããæŽçã§ãããšããããšã§ãã
ã«ãã¬ããžã¡ããªãã¯ãæ£åŒã«äœ¿çšããããšã¯ããã¡ããç¡æå³ã§ãã ãã ããããã¯ä»ã®ã¡ããªãã¯ã®æ£åŒãªäœ¿çšã«é©çšãããŸãã ããããã³ãŒãã£ã³ã°ãæéã®ãããKPIãšããŠã§ã¯ãªããå質ãæ¹åããããã®ããŒã«ãšããŠèããå Žåãããã¯éåžžã«åŒ·åãªããšã§ãã