ã¿ãªããããã«ã¡ã¯ãã¢ã¬ã¯ã»ã€ã»ã¢ã¬ãããã§ãã仿¥ã¯
RxJavaã®ãããªã©ã€ãã©ãªã䜿çšãããšãå€ãã®ããšãç°¡åã«åŠçã§ããŸã
Androidã¢ããªã±ãŒã·ã§ã³ã®éåæããã»ã¹ã
ç¬èªã®ã³ãŒã«ãã·ãŒã±ã³ã¹ãšãããã·ãŒã±ã³ã¹ãäœæããæ¹æ³ãåæããŸãã
RxJavaã䜿çšããéã®ããã€ãã®ãã¥ã¢ã³ã¹ãžã®æ³šæ
ãã®ã©ã€ãã©ãªãæäŸãã匷åãªããŒã«ã¯ã©ããããã
æŒç®åã
Yandex.Real Estateã¢ããªã±ãŒã·ã§ã³ãšãã®äŸã䜿çšããŠããã¹ãŠã«ã€ããŠèª¬æããŸã
å°å³ä»ãã®ããŒã ç»é¢ã
ãŸããç»é¢ãèŠãŠãç»é¢äžã§äœãèµ·ãããããããŠäœãããããèŠãŠã¿ãŸããã
å®è£
ãããŸãã
ãŸã第äžã«ãã«ãŒããšã®çžäºäœçšããããŸãïŒäººã¯ã«ãŒããåããããšãã§ããŸã
ãã£ã«ã¿ã«äžèŽããåºåã®ãããããã衚瀺ãããŸãã
ãã€ã³ãã¯ãåäžã®ã¢ããŠã³ã¹ã¡ã³ããæ°ãã建ç©ãäœå®
ãã¯ã©ã¹ã¿ãŒã
ããããã®åºåããŸãšããã åäžã®åºåã
衚瀺æžã¿ãšããŠããŒã¯ãããŸãïŒãã®ãã©ã°ã¯ããã€ã¹ã«ããŒã«ã«ã«ä¿åãããŸãïŒã
ãã£ã«ã¿èªäœã¯å¥ã®ç»é¢ã§å€æŽãããŸãããããã³ããã衚瀺ãããã䜿çšããå¿
èŠããããŸãã
å°å³äžã®èå³ã®ãããã€ã³ãã
ãªã¯ãšã¹ãã®å¥ã®ã³ã³ããŒãã³ãã¯ãæ¢ããŠããå°ççãªããžã§ã¯ãã§ã
çºè¡šã

ãã®èŠçŽ ã¯ããã®ãªããžã§ã¯ããŸãã¯ãããäžã§çŸåšéããŠãããšãªã¢ã§æ€çŽ¢ããã°ãããªã³/ãªãããããã«å¿
èŠã§ãã
ãããã£ãŠããããäžã®ãã€ã³ãã¯ããªã¹ããããããããã«å¯ŸããŠæŽæ°ããå¿
èŠããããŸã
ã¢ã¯ã·ã§ã³ïŒãããããã£ã«ã¿ãŒããŸãã¯ãžãªãªããžã§ã¯ãã®å€æŽïŒã ç°¡æœã«ããããã«ã
å°å³äžã«ãªããžã§ã¯ããæç»ããããšãæ€èšããŠãã ããã
ãžãªãªããžã§ã¯ãã®ç¹æ®ãªã±ãŒã¹ã§ãã
ããã«å ããŠãä»ã®ã¹ã¬ããã§çºçãã2ã€ã®ããã»ã¹ããããŸããWebAPIãããã€ã³ããåä¿¡ãããããã®ãã€ã³ãã®ãããããã®ããã€ã¹ã§æ¢ã«è¡šç€ºãããŠãããã確èªããŸãïŒãã®ãããããŒã¿ããŒã¹ãåç
§ããŸãïŒã
ãããããã£ã«ã¿ãŒãããã³ãžãªãªããžã§ã¯ãã¯ããµãŒããŒããã®ãã€ã³ãã®è¿ä¿¡ãããéãé »ç¹ã«å€æŽãããããšãèæ
®ãããšãææ°ã®çµæã®ã¿ã䜿çšãã以åã®çµæãç Žæ£ããå¿
èŠããããŸãã
ãããã£ãŠãããªãã®éãå«ãç»é¢ãå®è£
ããå¿
èŠããããŸã
äºãã«äŸåããéåæããã»ã¹ã
RxJavaãšåŸæ¥ã®Androidã¢ãããŒãã®æ¯èŒ
åŸæ¥ã®Androidã®ã¢ãããŒãã§ã¯ãèæ
®ããããããããç£èŠããããã«ã
ã³ãŒã«ããã¯ã䜿çšããããã»ã¹ã 倿Žã€ãã³ããçºçãããšã
ãããäžã®æ§æèŠçŽ ïŒããšãã°ãããããç§»åãããïŒãæ®ããèªã
ã³ã³ããŒãã³ãã1ã€ã®ãªã¯ãšã¹ãã«çµåããŠå®è¡ããŸãã
ãã®ã¢ãããŒããå®è£
ãããšãããã€ãã®å°é£ãçããŸãã
- ã³ãŒã«ããã¯ã¯äºãã«äžååã«çµåããŸãã
- ã³ãŒããèªã¿ã«ãã-ã³ãŒã«ããã¯ã®çžäºæ¥ç¶ãçè§£ããã®ãé£ããã倿ãã
誰ã誰ã«äŸåããŠããããã³ãŒã«ããã¯ã¯ã³ãŒãã«ãã£ãŠåæ£ãããŠããããã®äžã§ããã²ãŒãããããšã¯ããå°é£ã§ãã - ã³ãŒãã®æè»æ§ã倱ãããŸã-ãªãã·ã§ã³ãå°ãªããªããŸã
åå©çšããå Žåãæ¢åã®ãœãªã¥ãŒã·ã§ã³ã«å€æŽãå ããããšã¯ããå°é£ã§ãã
- ã«é¢é£ä»ãããã远å ã®ç¶æ
ãæç€ºçã«ä¿åããå¿
èŠããããŸã
éåææäœãšãã®ã³ãŒã«ããã¯ã ãã®ãããªç¶æ
倿°ãå€ãã»ã©ã
ééããç¯ãå¯èœæ§ãé«ããªããŸãïŒããšãã°ãè€æ°ã®ã¹ã¬ããã§äœæ¥ããå ŽåïŒã
次ã®çç±ã«ãããRxJavaã©ã€ãã©ãªãéžæããŸããã
- ããããæ§è³ªã®éåæããã»ã¹ã«å¯Ÿããæ®éçãªæœè±¡åã®ååš
ïŒã€ãã³ãã¢ãã«ããã«ãã¹ã¬ããåŠçïŒObservableãšåŒã°ãã-
芳枬ãããã·ãŒã±ã³ã¹ã - æŒç®åã䜿çšããŠã·ãŒã±ã³ã¹ã倿Žããæ©èœãš
倿°ã®äŸ¿å©ãªæŒç®åã - ã·ãŒã±ã³ã¹ãçžäºã«çµåããæ©èœã
- ã䜿çšããŠç¶æ
倿°ã®æ°ãæžãã
ã·ãŒã±ã³ã¹ãšæŒç®åã - ã©ã€ãã©ãªå®è£
ã®å®å®æ§ãšå質ã
ãã®ã©ã€ãã©ãªãã¢ããªã±ãŒã·ã§ã³ã§ããŸããŸãªç®çã«äœ¿çšããŸã-ã§å§ãŸã
ããã¯ã°ã©ãŠã³ãã§ã®èªã¿èŸŒã¿ãšããŒã¿åŠçããããŠå€ãã®åŠçã§çµãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§çºçããã€ãã³ãã
å®è£
ã©ã€ãã©ãªãã¢ããªã±ãŒã·ã§ã³ã§ã©ã®ããã«äœ¿çšããããã®äŸãèŠãŠã¿ãŸãããã
å°å³ã®å€åãèŠã
æåã«ããããã®ç¶æ
ãèŠãŠã¿ãŸãããã ãããè¡ãã«ã¯ã次ã®ã·ãŒã±ã³ã¹ã䜿çšããŸããããã¯ããããã®åº§æšå¢çã倿Žãããããšãå ±åããŸãã
public static Observable<BoundingBox> observeMapBoundingBox(final MapController mapController) { return Observable.create(new Observable.OnSubscribe<BoundingBox>() { @Override public void call(final Subscriber<? super BoundingBox> subscriber) { final OnMapListener listener = new OnMapListener() { @Override public void onMapActionEvent(MapEvent mapEvent) { switch (mapEvent.getMsg()) { case MapEvent.MSG_SCALE_END: case MapEvent.MSG_SCROLL_END: case MapEvent.MSG_ZOOM_END: if (!subscriber.isUnsubscribed()) { subscriber.onNext(getViewportBoundingBox(mapController)); } break; } } }; mapController.addMapListener(listener);
ãã®å®è£
ã§ã¯ã2ã€ã®äž»èŠãªéšåïŒ
- ã«ãŒãã€ãã³ããªã¹ããŒã®äœæãšè¿œå
- ã·ãŒã±ã³ã¹ããµãã¹ã¯ã©ã€ããããŠããªããšãã®ãã®ãªã¹ããŒã®åé€ã
OnSubscribeå
ãã€ãŸãã·ãŒã±ã³ã¹ãã¢ã¯ãã£ãã«ãªã£ãïŒèª°ãããµãã¹ã¯ã©ã€ãããïŒãšãã«ãªã¹ããŒãäœæããŠç»é²ããããšã«æ³šæããŠãã ããã
ããã§ã¯ãã³ãŒã«ãã·ãŒã±ã³ã¹ã®å
žåçãªäŸ-ãµãã¹ã¯ã©ã€ãäžã«æ°ããèŠçŽ ããªãªãŒã¹ãããã®ãæ±ã£ãŠããŸãã ãã®ãããªã·ãŒã±ã³ã¹ã®å®è£
ã®åªããäŸã¯ã RxBindingã©ã€ãã©ãªã§ããããã«ãããæšæºAPIã«ååšãããŠã£ãžã§ããå
ã®ã€ãã³ããšãµããŒãã©ã€ãã©ãªãç£èŠã§ããŸãã
ãã£ã«ã¿ãŒã®å€åã芳å¯ããŸã
次ã«ããã€ã³ããªã¯ãšã¹ãã®2çªç®ã®ã³ã³ããŒãã³ãã§ãããã£ã«ã¿ãŒã«ã€ããŠæ€èšããŸãã çŸåšã®ãã£ã«ã¿ãŒãä¿åããããããæŽæ°ããã¡ãœãããæäŸããã¯ã©ã¹ããããšããŸãã ãããŠããã®ãã£ãŒã«ãã®å€ã®å€åã芳å¯ããããšæããŸãã ãããã®å Žåãšåãæ¹æ³ã§ããã®ãã£ãŒã«ãã®å€æŽã®ãªãã¶ãŒããŒã«ãã£ãŒã«ãã远å ãããã£ãŒã«ãã倿Žããããšãã«ãªãã¶ãŒããŒã«éç¥ããããšãã§ããŸãã ãã ãããã£ãŒã«ãã«ã¯å€ãã®ãªãã¶ãŒããŒãååšããå¯èœæ§ããããŸããã€ãŸããé
åãä¿åããããã·ãŒã±ã³ã¹ãäœæãããšãã«æŒç®åshare ã publish + autoConnectã䜿çšããå¿
èŠããããŸã
äžåºŠã«è€æ°ã®ã·ãŒã±ã³ã¹ãªãã¶ãŒããŒã«ã€ãã³ããéä¿¡ããããã ãã ããããã¯æ¶è²»è
ã«å¯ŸããŠééçã«è¡ãããã®ã§ãããã§ã¯ãäžèšã®ãã¹ãŠã転éããSubjectãšããŠã®RxJavaã©ã€ãã©ãªã®ãã®ãããªã¯ã©ã¹ã®å©ããåããŸãã
矩åã
ãµããžã§ã¯ãã¯ããã¹ãŠã®ããŒã¿ãšãã®å®äºãŸãã¯ãšã©ãŒã®éç¥ãåä¿¡ããå€ãã®ãµãã¹ã¯ã©ã€ããŒãåæã«æã€ããšãã§ããã·ãŒã±ã³ã¹ã§ãã åæã«ãSubjectã®æäœã¯ããµãã¹ã¯ã©ã€ããŒãæã€åãã¡ãœããonNext
ã onCompleted
ã onError
ãŸãã ã€ãŸãããµããžã§ã¯ãèªäœã¯ãµãã¹ã¯ã©ã€ããŒã§ããã€ãŸããå¿
èŠã«å¿ããŠã圌ã¯å¥ã®ã·ãŒã±ã³ã¹ã«ãµãã¹ã¯ã©ã€ãããããããã¹ãŠã®ãµãã¹ã¯ã©ã€ããŒã«äžç¶ã§ããŸãã
ãããç§ãã¡ã«äžãããã®ã®äŸãèŠãŠã¿ãŸãããïŒ
public class FilterHolder { private final PublishSubject<Filter> subject = PublishSubject.create(); private Filter current; public Observable<Filter> observeChanges(boolean emitCurrentValue) { return emitCurrentValue ? subject.startWith(current) : subject; } public void set(Filter filter) { this.current = filter; subject.onNext(filter); } }
ã芧ã®ãšãããæ°ããå€ãèšå®ãããšããã¹ãŠã®ãµãã¹ã¯ã©ã€ããŒã«éä¿¡ãããŸãã ãã®å Žåã PublishSubjectã䜿çšããŠãæ°ããåä¿¡ããããŒã¿ããã¹ãŠã®ãµãã¹ã¯ã©ã€ããŒã«éä¿¡ããŸãã ååãšããŠã ReplaySubjectã䜿çšããŠãæåŸã«åä¿¡ããããŒã¿ãä¿åãããã®ããŒã¿ãåä¿¡ããåŸã«ãµã€ã³ã¢ãããããµãã¹ã¯ã©ã€ããŒã«å¯ŸããŠãããç¹°ãè¿ãããšãã§ããŸãã ãã ãããã®å Žåã observeChanges
ã¡ãœããã®å®è£
ã倿Žããå¿
èŠããããŸããçŸåšã®å€ãéä¿¡ãã代ããã«ãã¹ãããããŸãã
åæ§ã«ãæ¢åã®ã¯ã©ã¹ãæ¡åŒµããŠè¿œå ã§ããŸã
ãªã¢ã¯ãã£ãæ©èœã
ãµããžã§ã¯ãã¯ãããã·ãŒã±ã³ã¹ã®äŸã§ããã€ãŸããã¢ã¯ãã£ããªãŸãŸã§ã誰ããµãã¹ã¯ã©ã€ãããŠããªãå Žåã§ãèŠçŽ ãéåä¿¡ããŸãã äž»ãªããšã¯ãSubjectãonNext
æ°ããã·ãŒã±ã³ã¹èŠçŽ ãonNext
ã onCompleted
ãŸãã¯onError
ãåŒã³åºããããŸã§ããããããµãã¹ã¯ã©ã€ããŒã«é
ä¿¡ã§ããããšãæãåºãonError
ã§ãã
ããã¯ãããŒã¿/ã€ãã³ããœãŒã¹ãç¡éã§ããã onCompleted
ããã³onError
åŒã³åºããonError
ãªãç¶æ³ã§éèŠã§ãããã®ããããã®ããŒã¿ããµãã¹ã¯ã©ã€ãã«éä¿¡ããSubjectã§ãããã®ã¡ãœãããåŒã³åºããšãäºæããªãçµæãçããå¯èœæ§ããããŸãã
ãã€ã³ãã®APIãªã¯ãšã¹ãã®3çªç®ã®ã³ã³ããŒãã³ãã®ç£èŠ-ãžãªãªããžã§ã¯ããåæ§ã§ã
ä»¶åã䜿çšããŠãã£ã«ã¿ãªã³ã°ããã³å®è£
ãããŸãã
æåŸã«ãããã3ã€ã®èŠçŽ ããŸãšããŠããããã¯ãŒã¯èŠæ±ã§éä¿¡ããå¿
èŠããããŸãã
APIåŒã³åºã
APIã«ã¢ã¯ã»ã¹ããã«ã¯ãããç¥ãããŠããRetrofitã©ã€ãã©ãªã䜿çšãããããã¯ãŒã¯åŒã³åºãã®çµæã¯ãã¹ãŠObservableãšããŠè¡šç€ºãããŸãã
ãã®çµæããããã¯ãŒã¯å±€ã®ã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
public Observable<ClustersData> getClusters(MapBoundingBox box, Filter filter, GeoObject geo) {
ãã¹ãŠããŸãšãã
ãããã£ãŠããªã¹ããããŠãããã¹ãŠã®éåæããã»ã¹ãçµåããŸãã
Observable.combineLatest( observeMapBoundingBox(mapController).debounce(300L, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()), filterHolder.observeChanges(true), observeGeoObject(true), SearchRequest::clusters
composeLatestãªãã¬ãŒã¿ãŒã䜿çšããŠã3ã€ã®å€ã®ããããã®å€åãã¢ãã¿ãŒãããã®ãã¡ã®1ã€ãå€åãããšã以äžãèšè¿°ãããªããžã§ã¯ããäœæããŸã
ãããã¯ãŒã¯èŠæ±ã
ãã®æŒç®åã¯æ¬¡ã®ããã«æ©èœããŸããæž¡ãããåã·ãŒã±ã³ã¹ã1ã€ã®èŠçŽ ãæäŸãããŸã§åŸ
æ©ããããããã¹ãŠã®èŠçŽ ãä»ã®ãªããžã§ã¯ãã«å€æãã颿°ãåŒã³åºããŸãã æ¬¡ã«ãã·ãŒã±ã³ã¹ã®ããããã«æ°ããèŠçŽ ãçŸãããã³ã«ããªãã¬ãŒã¿ãŒã¯ãã®é¢æ°ãå床åŒã³åºãããã®æ°ããå€ãšæ®ãã®æåŸã®å€ãæž¡ããŸãã

ãããã£ãŠãããã¯zipãšéåžžã«ãã䌌ãŠããŸãããå¯äžã®éãã¯ãã·ãŒã±ã³ã¹ãæ°ããå€ãæäŸããªãã£ãå ŽåãæåŸã®æ¢ç¥ã®èŠçŽ å€ã䜿çšããããšã§ãã ããã¯ãç°ãªãåšæ³¢æ°ã®èŠçŽ ãè§£æŸããã·ãŒã±ã³ã¹ãçµã¿åããããšãã«äŸ¿å©ã§ããããšãã°ããã£ã«ã¿ãŒãããé »ç¹ã«çºçããã«ãŒãã®ç¶æ
ã®å€åãªã©ã§ãã
ãããã¯ãŒã¯èŠæ±ãªããžã§ã¯ããæ§ç¯ãããåŸãèŠæ±ã«çŽæ¥ç§»åããŸãã ãããè¡ãã«ã¯ãAPIãšã®ããåããè¡ããªããžã§ã¯ãã«ç®ãåããåéãããã©ã¡ãŒã¿ãŒãæž¡ããŸãã ããã«ã¯2ã€ã®è峿·±ãç¹ããããŸãã
ããããæåã«ãå
ã®ã·ãŒã±ã³ã¹ã®åèŠçŽ ã«å¯ŸããŠæ°ããã·ãŒã±ã³ã¹ãè¿ãããããããã¹ãŠ1ã€ã®çµæã·ãŒã±ã³ã¹ã«çµåããflatMapæŒç®åã«ã€ããŠèããŸãã

switchMapãªãã¬ãŒã¿ãŒãåãããã«æ©èœããŸãããå¯äžã®éãã¯ãåã®ãšã¬ã¡ã³ãããåãåã£ãã·ãŒã±ã³ã¹ãããµãã¹ã¯ã©ã€ããè§£é€ããæ°ãããšã¬ã¡ã³ãã«åãæ¿ããŠããã®çµæãåŸ
ã€ããšã§ãã

ããã¯ããããã¯ãŒã¯ãªã¯ãšã¹ãã®å®è¡ãé
ãããã«å¿
èŠã§ããããšãã°ããã人ãããããç§»åããå Žåã以åã®ãªã¯ãšã¹ãã¯é¢ä¿ããªããªããæ°ãããã€ã³ãããªã¯ãšã¹ãããå¿
èŠããããŸãã
2çªç®ã®ãã€ã³ãã¯ã doOnError
ããã³onErrorResumeNext
ïŒç©ºã®ã·ãŒã±ã³ã¹ãè¿ãïŒã䜿çšããŠãããã¯ãŒã¯ãšã©ãŒãæå¶ããããšã§ãã
ããã¯ãã·ãŒã±ã³ã¹ããã/ãã£ã«ã¿ãŒ/ãžãªãªããžã§ã¯ã->ãããã¯ãŒã¯ãªã¯ãšã¹ã->ãããäžã®ãã€ã³ãã ïŒãããã¯ãŒã¯ïŒãšã©ãŒã§çµäºããå Žåã«å£ããªãããã«ããããã§ã-ãã®å Žåãããããžã®æ°ãã倿Žã¯çµæããããããããããã¯ãŒã¯ãšã©ãŒçºçããå¯èœæ§ããããããããåŠçããå¿
èŠããããŸãã
ãããäžã®ãã€ã³ããåãåã£ãåŸã®æ¬¡ã®ã¹ãããã¯ããŠãŒã¶ãŒãæ¢ã«è¡šç€ºãããã€ã³ããèå¥ããããšã§ãã ãããè¡ãã«ã¯ãããŒã¿ããŒã¹ã«å¯ŸããŠèŠæ±ãè¡ããããã®åŸã察å¿ãããã©ã°ããã¹ãŠã®è¡šç€ºãã€ã³ãã«ä»å ãããŸãã ããã¯é·æéã®æäœã§ããããããããã¯ãŒã¯ã¹ã±ãžã¥ãŒã©ãè§£æŸããèšç®ãobserveOn(Schedulers.computation())
åãæ¿ããŸãã ããŒã¿ããŒã¹ãç
§äŒããã«ã¯ã Cupboardãšãã®äžã®Rxã©ãããŒã䜿çšããŸããããã®å Žåã¯Observable
ãè¿ãã¡ãœããã䜿çšã§ããŸãããéåžžã®åæã¡ãœããã§ç®¡çããŸããã
ãããããã«ãŒãã®äœçœ®ã®å€åãç£èŠããã·ãŒã±ã³ã¹ã«ãããŠã³ã¹ã¹ããŒãã¡ã³ãã衚瀺ãããŠããããšã«ãæ°ã¥ãã§ããããããã«ãããäžèŠãªèŠçŽ ããã¹ãŠæå®ãããæéééå
ã«æ¥ãå ŽåãäžèŠãªèŠçŽ ãç Žæ£ã§ããŸãã ããã¯ããŠãŒã¶ãŒããããã衚瀺ããŠãããšãã«ãµãŒããŒã«ãªã¯ãšã¹ããé »ç¹ã«éä¿¡ããªãããã«ããããã«å¿
èŠã§ãã ããã©ã«ãã§ã¯ããã®æŒç®åã¯èšç®ã¹ã±ãžã¥ãŒã©ã䜿çšããŸãããã€ãã³ããã¡ã€ã³ã¹ã¬ããã§çºçããŠããããšãããã£ãŠãããããã¡ã€ã³ã¹ã¬ããã®ã¹ã±ãžã¥ãŒã©ã§ã€ãã³ããåå®çŸ©ã§ããŸãã ããã«ãããç¹å®ã®å Žæã§ã®äžå¿
èŠãªã¹ã¬ããã®åãæ¿ããåé¿ã§ããäžå¿
èŠãªã¿ã¹ã¯ããèšç®ã¹ã±ãžã¥ãŒã©ãç¯çŽã§ããŸãïŒããã©ã«ãã§ã¯ãã¹ã¬ããã®æ°ã¯ã³ã¢ã®æ°ã«ãã£ãŠå¶éãããããïŒã
ãããŠä»ãŸãšããŸãã
å°éã®ã³ãŒãã
ãã¹ãŠã®ããžãã¯ã1ã€ã®ã·ãŒã±ã³ã¹ã«åãŸããããŒã¿ã®åããšãã®åŠçã®ããžãã¯ãçè§£ã§ããããã«ãªããŸãã
䞻芳çã«ããã®ãããªã³ãŒãã¯ãã³ãŒã«ããã¯ã䜿çšããå Žåãããç°¡åã«èŠããŸãã ãã ããããã§ã¯ãå°ãªããšãRxJavaã®åºæ¬ã«é¢ããç¥èãå¿
èŠã§ããããšãäºçŽããå¿
èŠããããŸãã
ããç°¡åãªå®è£
éåææäœã®äžéç¶æ
ãåæããã³ä¿åãããã¹ãŠã®äœæ¥ã¯ãã©ã€ãã©ãªã®è©ã«è»¢éãããŸããã ãã®çµæãæå°éã®äžéç¶æ
ãç¶æããŸãã ããã«ãããè€æ°ã®ã¹ã¬ããããã³éåæããã»ã¹ã§äœæ¥ããéã®ãšã©ãŒã®å¯èœæ§ãæžå°ããŸãã
ããã«ãå€ãã®éåæããã»ã¹ã®åŠçãå®è£
ãã代ããã«ãããŒã¿ã¹ããªãŒã ãæäœããããžãã¹ã¿ã¹ã¯ãçŽæ¥å®è£
ããŸãã ããã«ãæ°ããåŠçã¹ããããã·ãŒã±ã³ã¹ã«è¿œå ããæ¢åã®ã¹ãããã倿Žããã®ã¯ç°¡åã§ãã
ãŸããã·ãŒã±ã³ã¹ã䜿çšããã³ãŒãã¯ãã¹ããç°¡åã§ãã
ã·ãŒã±ã³ã¹ã¯ããã¹ãã«å¿
èŠãªãã®ã«çœ®ãæããããšãã§ããŸãïŒã³ãŒã«ããã¯ã®å Žåãããå°é£ã«ãªããŸãïŒã
ããšãã°ãã€ã³ã¿ãŒãã§ã€ã¹ã«é¢é£ä»ããããŠãããã¹ãŠã®ã·ãŒã±ã³ã¹ã次ã®ããã«çœ®ãæããããšãã§ããŸãã
justæŒç®åã䜿çšããŠå€ãäºåèšå®ããŸãã