å®éã®ãããžã§ã¯ãã§Dagger 2ã䜿çšããçµéšãå®éã®ã±ãŒã¹ãšå ±æããããšæããŸãã ãã¬ãŒèªäœãšãµãã³ã³ããŒãã³ããªã©ã®åŽé¢ã®äž¡æ¹ã®åãšå©äŸ¿æ§ãèªè ã«æããã«ããã
ããªããã«ããã®äžã«è¡ãåã«ãããªãã¯äžèšã®èšäºã«æ £ããå¿ èŠããããŸãã
誰ã«èå³ããããŸããïŒ

ç§ã®å人ã¯ããã¹ãŠãæ£ã«çœ®ãçŽ æŽãããæ¹æ³ãæããŠãããŸããïŒã¢ãŒããã¯ãã£ïŒåäžã®ã¯ã©ã¹ããŸãã¯å°ããªã³ãŒãã®ããããïŒãæ瀺ãããããçŸå®ã®äžçã«è»¢éããŠã¿ãŠãã ããã æ¥åžžç掻ã§ã³ãŒãã®ããžãã¯ã«äŒŒããã®ãèŠã€ããŠãã ããã ãããŠãå®ç掻ã®äŸã«åºã¥ããŠã1ã€ãŸãã¯å¥ã®ãœãããŠã§ã¢ã³ã³ããŒãã³ãïŒãªããžã§ã¯ãïŒã®åäœæ¹æ³ãç解ããŸãã æçµçã«çµæãã©ãããã¹ãããç解ããŠãã ããã
ä»åã¯åãããšãããŸãã
ããã°ã©ãã³ã°ãäžæããŠãæè¡å®€ã«è¡ããŸãããã
人åœãæãããšã¯éåžžã«éèŠãªä»äºã§ãã å»åž«ããŒã ã®åã¡ã³ããŒã¯ãèªåã®ä»äºãæ£ç¢ºã«å®è¡ããä»ã®äººãèªåã®ä»äºãå®è¡ããã®ã劚ããªãããã«ããå¿ èŠããããŸãã
ãã¹ãŠã®ããŒã«ã¯æ£ã«ãã¡ããšé 眮ãããŠããŸãã 䞻治å»ã¯éäžçã«æè¡ãè¡ããå®æçã«å©æã«é Œã£ãŠã¡ã¹ãªã©ã®æ°ããéå ·ãæã«å ¥ããŸãã ããŸããŸãªæç¹ã§ããç°ãªãã¡ã¹ããå¿ èŠã«ãªãå ŽåããããŸãããã®ãããã¢ã·ã¹ã¿ã³ããããã»ã¹ã®éªéã«ãªãããçŸåšå¿ èŠãªããŒã«ãæ£ç¢ºã«æäŸããããšãéèŠã§ãã
å»åž«ã¯ãèªåãå¿ èŠãšããããŒã«ãã©ã®æ£ã«ãããã絶察ã«æ°ã«ããŸããã ãã¹ãé²ãããã«ã圌ã¯æ¥åã«å®å šã«éäžããããšãããéèŠã§ããããã¯åœŒã®è²¬ä»»ç¯å²ã§ãã
ã¢ã·ã¹ã¿ã³ãã¯ããã®æäœã§å¿ èŠãªãã¹ãŠã®ããŒã«ã®å¯çšæ§ãæž æœããå»åž«ãžã®ããŒã«ã®ã¿ã€ã ãªãŒãªæäŸã«è²¬ä»»ãè² ããŸãã æãèå³æ·±ãã®ã¯ãã¢ã·ã¹ã¿ã³ããç¶æ³ã«å¿ããŠãã©ã®ããŒã«ãéžæããããç¬èªã«æ±ºå®ããããšã§ãã ãã¡ãããå»åž«ãæ£ç¢ºãªæ瀺ãæã£ãŠããªãã£ãå Žåã
ç§ãã¡ã®å Žåãã¢ã·ã¹ã¿ã³ãã¯ãã¬ãŒã§ãã å»åž«ã¯ãããã°ã©ã ã§æ確ãªäœ¿åœãæã€åœç€Ÿã®ãœãããŠã§ã¢ã³ã³ããŒãã³ãã§ãã ãã¿ãŒã³-äŸåæ§æ³šå ¥ïŒäŸåæ§æ³šå ¥ïŒãååšããã®ã¯ãäŸåé¢ä¿ïŒããŒã«ïŒã®äœæãšããããžã§ãã³ã°ã®å§ä»»ïŒå»åž«ããã¢ã·ã¹ã¿ã³ãïŒã«ãããŸãã
ãã®äŸããåŠã¹ãããšïŒ
- ã³ã³ããŒãã³ãã«ã¯ãä»ã®ã³ã³ããŒãã³ããäœæããããžãã¯ãå«ããã¹ãã§ã¯ãããŸããã
- ã³ã³ããŒãã³ãã¯ããã®ããŒã«ã®å®è£ ã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã ãã®äŸã§ã¯ãå€ç§å»ããã¡ã¹ïŒããšå°ãããšãã·ãã¥ãšãŒã·ã§ã³ã¢ã·ã¹ã¿ã³ãã¯ã»ããããç®çã®ã¢ã·ã¹ã¿ã³ããè¿ããŸãã T.O. å»åž«ã¯ããŒã«ã®ç¹å®ã®å®è£ ã§ã¯ãªãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã§äœæ¥ããŠãããšèšããŸãã
ç·Žç¿ã ããã°ã©ãã³ã°ã«æ»ããŸãããã
倧éšåã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãäœããã®çš®é¡ã®ããŒã¿ãªã¹ããæ±ãäœæ¥ããããŸãã
ã¢ããã¿ãŒã¯ããŒã¿åŠçãè¡ããã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããŸãã
- ãªã¹ããŒ-ãªã¹ãé ç®ãšã®çžäºäœçšã®ã€ãã³ãã
- ãããããViewHodlersãäœæããããã®ã³ã³ããã¹ããŸãã¯LayoutInflaterã
- ãã¡ãããããŒã¿ãªã¹ãèªäœã¯ããã¡ããäºåã«åæåãããŠããªãéãïŒããã§ãªããã°ãã¢ããã¿ãŒã¯setListïŒïŒã¡ãœãããå®è£ ããŸãïŒã
ããããæçµçã«ã¯ã©ããªããŸããïŒ ãã©ã°ã¡ã³ãïŒãŸãã¯ã¢ã¯ãã£ããã£ïŒã§æ§é ãåãåã£ã
Adapter adapter = new Adapter(this, getContext(), list); recyclerView.setAdapter(adapter);
å¥ã®ã³ã³ããŒãã³ããåæåããããšã«ãããã³ã³ããŒãã³ããåŠçããŸããã å»åž«ã¯æè¡å°ããé¢ããŠé©åãªããŒã«ãèŠã€ããŸããã

Daggerã䜿çšãããšãæ瀺ãããã³ãŒãã®æåã®è¡ãåãé€ãã ãã§ãªããå¥ã®ã³ã³ããŒãã³ããäœæããããžãã¯ããäžèŠãªããžãã¯ããã³ã³ããŒãã³ãã解æŸããŸãã
ã¡ãã£ãšåŸ ã£ãŠã質åãããã«è¡šç€ºãããããšããããŸãã
ã¢ããã¿ãŒã®åæåãDaggerã«å§ä»»ãããŠããå Žåã圌ã¯ã©ãã§ãªã¹ããŒïŒãªã¹ããŒãå®è£ ããã³ã³ããŒãã³ãã®ãªããžã§ã¯ãïŒãååŸããŸããïŒ ã·ã³ã°ã«ãã³ã®ãã©ã°ã¡ã³ããŸãã¯ã¢ã¯ãã£ããã£ãä¿æããããšã¯ãæªãèã以äžã§ãïŒ
ãã®ãããªè³ªåã¯ã次ã®å Žåã«çºçããå¯èœæ§ããããŸãã
- ã¢ããªã±ãŒã·ã§ã³å šäœã«å¯ŸããŠ1ã€ãŸãã¯2ã€ã®ã³ã³ããŒãã³ãã䜿çšããŸãã
- ãã¹ãŠã®äŸåé¢ä¿ãã·ã³ã°ã«ãã³ã«ä¿ã¡ãŸãã
- ãããŠããµãã³ã³ããŒãã³ããšã³ã³ããŒãã³ãã®äŸåé¢ä¿ã«ã€ããŠç¥ããããããŸããã
ãã¬ãŒã®ç 究ã®æåã«æ¬ ããŠãããå°ãæœè±¡åããŠã¿ãŸãããã
Daggerã®ã€ã³ã¿ãŒãããã§ã®äœ¿çšäŸã®ã»ãšãã©ã«ã¯ãã³ã³ããã¹ãã«ãŒãäŸåé¢ä¿ïŒãŸãã¯æ¬è³ªçã«ã¯ã³ã³ããã¹ãã§ãããã¢ããªã±ãŒã·ã§ã³ãæ¡åŒµããã¯ã©ã¹ïŒãåããAppModuleã䜿çšããããããAppComponentã®äœæãå¿ ãå«ãŸããŸãã
çç±ãç解ããŸãããã
ãæåã¯èšèã§ãã...ã
ã³ã³ããã¹ãããããšãä»ã®äŸåé¢ä¿ãååŸã§ããŸããããšãã°ãSharedPreferencesãLayoutInflaterãäœããã®ã·ã¹ãã ãµãŒãã¹ãªã©ã§ãã ãããã£ãŠãSharedPreferencesãæã€ããšã§ãPreferenceHelperãååŸã§ããŸããããã¯ãèšå®ãæäœããããã®ãŠãŒãã£ãªãã£ã¯ã©ã¹ã§ãã LayoutInflaterã䜿çšãããšãViewFactoryãååŸã§ããŸãã ãããã®ãé«ã¬ãã«ãäŸåé¢ä¿ãããããã«è€éã§è€éãªäŸåé¢ä¿ãååŸããããšãã§ããŸãã ãããŠããã®å€æ§æ§ã¯ãã¹ãŠã1ã€ã®ãªããžã§ã¯ããã€ãŸãã³ã³ããã¹ãã«ç±æ¥ããŠããŸããã ãã®å ŽåãAppComponentã®ã³ã¢ãšåŒã¶ããšãã§ããŸãã

ãããŠãäžèšã®ãã¹ãŠã¯ãã¢ããªã±ãŒã·ã§ã³å šäœãã€ãŸã ã·ã³ã°ã«ãã³ã ãã®ãããç§ãã¡ãæã£ãŠããã³ã¢ã¯ãåžžã«ååšãããªããžã§ã¯ã-ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ããªããžã§ã¯ãã§ãã
ãã®èããç¶ããŠãã¢ããã¿ãŒãã©ããããã®æéååšããããèããŠã¿ãŸãããã æããã«ããã®ã¢ããã¿ãæ©èœããç»é¢ããããŸãã
ViewHolderFactoryãã¢ããã¿ã«æäŸããŸããã¢ããã¿ã¯ãã¢ããã¿ãååšããéãååšããå¿ èŠããããŸãã ã¢ããã¿ã«å ããŠããã©ã°ã¡ã³ãã«ViewControllerãæäŸããŸãããã©ã°ã¡ã³ããååšããå Žåã«ã®ã¿ååšããå¿ èŠããããŸãã
èŠããšããã®ç»é¢ããçããŠãããéã«æä»çã«äœ¿çšããããã¹ãŠã®äŸåé¢ä¿ã¯ããã®ç»é¢ã«äŸåããŠããŸãã T.O. ç§ãã¡ã®ãã©ã°ã¡ã³ãïŒãŸãã¯ã¢ã¯ãã£ããã£ïŒã¯ãç»é¢ãååšããéãååšããããŒã«ã«ã³ã³ããŒãã³ã-ã³ã³ããŒãã³ãã®ã³ã¢ã«ãªããšèšããŸãã

äŸåé¢ä¿ã®ãã®ãã¹ãŠã®ããŒã«ã«ãã³ãïŒåïŒã«å¯ŸããŠæ確ã«å®çŸ©ãããã©ã€ãã¿ã€ã ãå®è£ ããã«ã¯ããµãã³ã³ããŒãã³ãã䜿çšããŸãã
ãã©ããã£ãŠïŒããšèããŠ
ãšããããããµããã¬ãã£ãã¯ã¹ãå¿ããŠãã³ã³ããŒãã³ãã ããå®è£ ããŠãããšæ³åããŠã¿ãŸãããã ç°¡åãªå Žåã¯ãç»é¢ãã¢ããªã±ãŒã·ã§ã³å šäœã§ããããšãæ³åããŠãã ããã
ãŸããåºæ¬çãªã¢ãžã¥ãŒã«ãå¿ èŠã§ãã ãªããªã ãªã¹ãç»é¢ããããListModuleãšåŒã³ãŸãã
@Module public class ListModule { }
ä»ãç§ãã¡ã¯ãŸãã«ã³ã¢ãã€ãŸãä»ã®èª°ããè¡ãåºæ¬çãªäŸåé¢ä¿ãå¿ èŠãšããŠããŸãã åè¿°ã®ããã«ãListFragmentãªã©ã®ãç»é¢ãªããžã§ã¯ããèªäœã¯ãç»é¢ã®åºæ¬çãªäŸåé¢ä¿ã§ãã ãããã¢ãžã¥ãŒã«ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ããŸãããã
@Module public class ListModule { private final ListFragment fragment; public ListModule(ListFragment fragment) { this.fragment = fragment; } }
åºç€ããããŠåµé æ§ããããŸãã
ã¢ããã¿ãŒãæäŸããŸãã
@Provides public Adapter provideAdapter(Context context) { return new Adapter(fragment, context, fragment.initList()); }
泚ïŒã³ã³ããã¹ãã¯ãããŸãããæããã«ããã®ã¢ãžã¥ãŒã«ãŸãã¯ã³ã³ããŒãã³ãã®ä»ã®ã¢ãžã¥ãŒã«ã®ãããã«ãæäŸããŠããŸããã ããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
ããŒã¿èªäœã®ãªã¹ããåå¥ã«æäŸããããšãã§ããŸãïŒããã¯åé·ã§ãããäŸã§ã¯æ©èœããŸãïŒã
@Provides public List<Model> provideListOfModels() { return fragment.initList(); } @Provides public Adapter provideAdapter(Context context, List<Model> list) { return new Adapter(fragment, context, list); }
ããŠããããæ£åžžã«æ©èœãããããã«ãããã€ãã®èšå®ãè¡ããŸãã
ãã¬ãŒã«äŒããããã«ïŒ
- ã³ã³ããŒãã³ãã®ãã¹ãŠã®äŸåé¢ä¿ã¯ãã¡ã€ã³ã®ã°ã©ããšã¯å¥ã®åäžã®ã°ã©ãã§ãã
- æ¯åæ°ããäŸåé¢ä¿ãäœæããã®ã§ã¯ãªããå¯äžã®äŸåé¢ä¿ããã£ãã·ã¥ããå¿ èŠããããŸãã
ããããã¹ã³ãŒã泚éããããŸãã åã¹ã³ãŒã泚éã¯æ¬¡ã®ããã«ãªããŸãã
@Scope @Retention(RetentionPolicy.Runtime) public @interface Singleton {}
ã·ã³ã°ã«ãã³ã¯ãDaggerãæäŸããåºæ¬çãªæ³šéã§ãã ããã¯ããªããäœããå§ããããã ãã«æäŸãããŠããŸãã ãã·ã³ã°ã«ãã³ãèªäœã¯ãAppComponentïŒAppãæ¡åŒµããã¯ã©ã¹ïŒã«AppComponentãä¿åããªãéããéæ³ã®ããã«ã¯çºçããŸããã ããªãã¡ Daggerã¯ãComponentã®ãã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠäŸåé¢ä¿ã®åäžã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããããšãä¿èšŒããŸãã ãã ããã³ã³ããŒãã³ãã€ã³ã¹ã¿ã³ã¹ã®äžææ§ã¯ãŠãŒã¶ãŒã®è²¬ä»»ã§ãã
åæ§ã«ãã¹ã³ãŒãã¢ãããŒã·ã§ã³ãäœæããŸãã
@Scope @Retention(RetentionPolicy.Runtime) public @interface ListScope {}
ç§ãã¡ã®æ³šéã¯ãSingleton泚éããã決ããŠå£ã£ãŠããŸãããå šäœã®ãã€ã³ãã¯ããããã®äœ¿çšæ¹æ³ã§ãã
ã¹ã³ãŒã泚éã䜿çšããŠãæäŸã¡ãœãããšã¢ãžã¥ãŒã«ãå«ãã³ã³ããŒãã³ããããŒã¯ããŸãã
éèŠïŒç¹å®ã®ã¹ã³ãŒãã«ãã£ãŠçœ²åããã1ã€ã®ã³ã³ããŒãã³ãã«ã¯ãåãã¹ã³ãŒãã«ãã£ãŠæäŸã¡ãœããã眲åãããã¢ãžã¥ãŒã«ã®ã¿ãååšã§ããŸãã T.O. 2ã€ã®ç°ãªãäŸåé¢ä¿ã°ã©ãã¯äº€å·®ããŸããã
ListModuleã®æçµãã¥ãŒïŒ
@Module public class ListModule { private final ListFragment fragment; public ListModule(ListFragment fragment) { this.fragment = fragment; } @ListScope @Provides public List<Model> provideListOfModels() { return fragment.initList(); } @ListScope @Provides public Adapter provideAdapter(Context contex, List<Model> list) { return new Adapter(fragment, context, list); } }
ã³ã³ããŒãã³ãïŒ
@ListScope @Subcomponent(modules = ListModule.class) public interface ListComponent { void inject(ListFragment fragment); }
ããã§éèŠãªã®ã¯@Subcomponentã¢ãããŒã·ã§ã³ã§ãã ãããã£ãŠã芪ã³ã³ããŒãã³ãã®ãã¹ãŠã®äŸåé¢ä¿ã«ã¢ã¯ã»ã¹ããããšèšããŸãããããã§ã¯èŠªãæå®ããªãããšã«æ³šæããŠãã ããã ãã®äŸã§ã¯ã芪ã¯AppComponentã§ãã
* ContextãååŸããŠã¢ããã¿ãŒãåæåããã®ã¯AppComponentããã§ãã
ãµãã³ã³ããŒãã³ããååŸããã«ã¯ããµãã³ã³ããŒãã³ãã®ãã¹ãŠã®ã¢ãžã¥ãŒã«ãåŒæ°ãšããŠæž¡ãããšã§ã芪ã³ã³ããŒãã³ãã§ã®åä¿¡æ¹æ³ãèšè¿°ããå¿ èŠããããŸãïŒãã®å Žåã1ã€ã®ã¢ãžã¥ãŒã«ã®ã¿ïŒã
ããã¯ã©ã®ããã«èŠããŸããïŒ
@Singleton @Component(modules = AppModule.class) public interface AppComponent { ListComponent listComponent(ListModule listModule); }
Daggerã¯ãã®ã¡ãœããã®å®è£ ãåŠçããŸãã
人çã®æéãæŽçããŸã
æ¢ã«è¿°ã¹ãããã«ãAppComponentã«ã¯ãã®å¯äžã®ã€ã³ã¹ã¿ã³ã¹ãæ ŒçŽãããŠãããããAppComponentã¯ã·ã³ã°ã«ãã³ã§ãã 芪ã®å©ããåããŠã®ã¿ãµãã³ã³ããŒãã³ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãããããã£ãŠãAppã¯ã©ã¹ã§ãµãã³ã³ããŒãã³ããåä¿¡ããã³ä¿åãããã¹ãŠã®ããžãã¯ãåé€ããŸããã1ã€ã®éèŠãªéãããããŸãïŒãã€ã§ããµãã³ã³ããŒãã³ããäœæãããã€ã§ãç Žæ£ããæ©èœãè¿œå ããŸãã
Appã¯ã©ã¹ã§ã¯ã次ã®ããžãã¯ãèšè¿°ããŸãã
public class App extends Application { private ListComponent listComponent; public ListComponent initListComponent(ListFragment fragment) { listComponent = appComponent.listComponent(new ListModule(fragment)); return listComponent } public ListComponent getListComponent() { return listComponent; } public void destroyListComponent() { listComponent = null; } }
泚ïŒå€§èŠæš¡ãªãããžã§ã¯ãã§ã¯ãæ§æã䜿çšããŠDaggerãæäœããããžãã¯ãAppã¯ã©ã¹ãããã«ããŒã¯ã©ã¹ã«ç§»åããããšã¯çã«ããªã£ãŠããŸãã
ããŠããã©ã°ã¡ã³ãå ã§ããããã¹ãŠã䜿çšããããšã説æããããšã¯æ®ã£ãŠããŸãã
public class ListFragment extends Fragment { @Inject Adapter adapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); App.getInstance().initListComponent(this).inject(this); init(); } private void init() { recyclerView.setAdapter(adapter); } @Override public void onDestroy() { super.onDestroy(); App.getInstance.destroyListComponent(); } }
ãããã£ãŠãã°ã©ãã®ã©ã€ãã¿ã€ã ããã©ã°ã¡ã³ãã®ã©ã€ããµã€ã¯ã«ã«ãªã³ã¯ããŸããã
ããã¯ã1ã€ã®äŸåé¢ä¿ã®å Žåã«ã¯åé·ã«èŠãããããããŸããïŒ1ã€ã®äŸåé¢ä¿ããã£ããšããŠãããã®ãããªããžãã¯ãåãé€ããšã³ãŒãããããããã«ãªãã ããã¯ãå°ãªããªããŸã ïŒã ã»ãšãã©ã®äœæ¥ã¯ãã¢ãŒããã¯ãã£ãäœæããããšã§ãã ãããã£ãŠãæ°ããäŸåé¢ä¿ãæäŸããå¿ èŠãããå Žåã1ã€ã®æäŸã¡ãœããã®å®è£ ã«ãªããŸãã

ããŒãã¹
ãã¹ãŠã®äŸåé¢ä¿ãæäŸã¡ãœããã§åŒ·èª¿è¡šç€ºãããŠããå ŽåãäŸåé¢ä¿ãã¹ããŒããã®ãããããªã©ã®çŽ æŽãããããšããããŸãã ã¢ããã¿ãŒã䜿çšããäŸãå床æ€èšããŠãã ããã
ListFragmentã¯ããªã¹ããªããžã§ã¯ãã®ViewHoldersã«é¢é£ããã€ãã³ãã®ãªã¹ããŒãå®è£ ããŸãã ãããã£ãŠãåViewHolderã«ãªã¹ããŒãé ä¿¡ããã«ã¯ãã¢ããã¿ãŒãžã®ãªã¹ããŒãžã®ãªã³ã¯ãä¿åããå¿ èŠããããŸãã
仲ä»è ãåãé€ããŸãã

ViewHolderFactoryã§ViewHoldersã®äœæãåé€ããããšããå§ãããŸãã ã ããç§ãã¡ã¯ããïŒ
public class ListItemViewHolderFactory { private final Listener listener; private final LayoutInflater layoutInflater; public ListItemViewHolderFactory(LayoutInflater layoutInflater, Listener listener) { this.layoutInflater = layoutInflater; this.listener = listener; } public ListItemViewHolder createViewHolder(ViewGroup parent) { View view = layoutInflater.inflate(R.layout.item, parent, false); return new ListItemViewHolder(view, listener); } }
ã¢ãžã¥ãŒã«ã¯æ¬¡ã®åœ¢åŒã«å€æãããŸãã
@Module public class ListModule { private final ListFragment fragment; public ListModule(ListFragment fragment) { this.fragment = fragment; } @ListScope @Provides public List<Model> provideListOfModels() { return fragment.initList(); } @ListScope @Provides public Adapter provideAdapter(ListItemViewHolderFactory factory, Context context, List<Model> list) { return new Adapter(factory, context, list); } @ListScope @Provides public ListItemViewHolderFactory provideVhFactory(LayoutInflater layoutInflater) { return new ListItemViewHolderFactory (layoutInflater, fragment); } }
泚ïŒAppModuleã§LayoutInflaterãæäŸããããšãå¿ããªãã§ãã ããã
ãã®äŸã¯ãäŸåé¢ä¿ã®æè»ãªäœæ¥ãããã«ããŸããããã瀺ããŠããããã«æããŸãã
次ã«ãç¹å®ã®ã³ã³ããŒãã³ãïŒã¯ã©ã¹ïŒã®ã³ãŒãã¬ãã¥ãŒãè¡ãããã®ããžãã¯ã®ã¿ã衚瀺ããäžçãæ³åããŠãã ããã ã€ãã³ãã®ã¹ã¬ããã远跡ããããã«ããœãããŠã§ã¢ã³ã³ããŒãã³ãéã§ããžã£ã³ããããå¿ èŠã¯ãããŸããã å€éšããŒã«ã¯èªåã§è¡šç€ºãããã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠä»ã®ã³ã³ããŒãã³ããšããåãããŸãïŒãŸãã¯ãŸã£ããããåãããŸããïŒã

ãã®èšäºãããªãã«æèãšåµé æ§ã®åå°ãäžããŠãããŠããã¬ãŒã®äžçãå°ãã§ãè¿ã¥ããããšãé¡ã£ãŠããŸãã
次åã¯ãã¢ã·ã¹ã¿ã³ãã®æ©èœã®2çªç®ã®éšåãåæããŸããç¶æ³ã«å¿ããŠããã¡ã¹ãã®ç¹å®ã®å®è£ ãè¿ããŸãã èªå¯ããããŸãŒã³ãšãœãŒã·ã£ã«ãããã¯ãŒã¯ã§ã®äœæ¥ã«ã€ããŠè©±ããŸãããã
ãæž èŽããããšãããããŸããã
githubã®èšäºã«èšèŒãããŠããäŸã
UPDïŒ ããŒã2