
ç§ã¯RustãåŠã³ç¶ããŠããŸãã ç§ã¯ãŸã ããŸãç¥ããªãã®ã§ãå€ãã®ééããç¯ããŸãã ååãç§ã¯
ã¹ããŒã¯ã²ãŒã ãäœãããšããŸããã ãµã€ã¯ã«ãã³ã¬ã¯ã·ã§ã³ã3D
Three.rsã§ã®äœæ¥ã
詊ããŸãã ã
ggezãš
Amethystã«ã€ããŠåŠã³ãŸããã ä»åã¯ããã£ããçšã®ã¯ã©ã€ã¢ã³ããšãµãŒããŒãäœæããããšããŸããã GUIã«ã¯
Azulã䜿çšããŸããã
Conrod ã
Yew ã
OrbtkãèŠ
ãŸãã ã ãã«ãã¹ã¬ããããã£ãã«ããããã¯ãŒã¯ã詊ããŸããã åã®èšäºã®ééããèæ
®ã«å
¥ããŠãããããã詳现ã«ããããšããŸããã 詳现ã«ã€ããŠã¯ãç«ãžããããã
â
ãœãŒã¹ãWindows 10 x64ã§åäœãããã¯ãŒãã³ã°ã§ã¯ããã®ãããã³ã«ã䜿çšããŠæ¬¡ã®ãããžã§ã¯ããäœæããããã§ãã¬ãŒãã³ã°ãããã£ãã®ã§ãUDPã䜿çšããŸããã GUIã«ã€ããŠã¯ãRustã®ãããžã§ã¯ããããã«èŠãŠããããã®åºæ¬çãªäŸãèŠãŠãAzulã¯Document Object ModelãšCSSã®ãããªã¹ã¿ã€ã«ãšã³ãžã³ã䜿çšããŠããã®ã§ãç§ã¯é·ãéWebéçºã«åŸäºããŠããŸããã äžè¬çã«ããã¬ãŒã ã¯ãŒã¯ã¯äž»èгçã«éžæããŸããã ãããŸã§ã®ãšããããã£ãŒãã¢ã«ãã¡ã§ã¯ãã¹ã¯ããŒã«ã¯æ©èœãããå
¥åãã©ãŒã«ã¹ã¯æ©èœãããã«ãŒãœã«ã¯ãããŸããã ããã¹ããã£ãŒã«ãã«ããŒã¿ãå
¥åããã«ã¯ãå
¥åäžã«ãã®äžã«ã«ãŒãœã«ã眮ãããã®äžã«çŽæ¥ä¿æããå¿
èŠããããŸãã
詳现å®éãèšäºã®ã»ãšãã©ã¯ã³ãŒãã³ã¡ã³ãã§ãã
ã¢ãºãŒã«
æ©èœã¹ã¿ã€ã«ãDOMãCSSã䜿çšããGUIãã¬ãŒã ã¯ãŒã¯ã ã€ã³ã¿ãŒãã§ã€ã¹ã¯ã«ãŒãèŠçŽ ã§æ§æãããŸããã«ãŒãèŠçŽ ã«ã¯å€ãã®åå«ããããHTMLãXMLãªã©ã§ç¬èªã®åå«ãæã€ããšãã§ããŸãã ã€ã³ã¿ãŒãã§ãŒã¹å
šäœã¯ãåäžã®DataModelã®ããŒã¿ã«åºã¥ããŠäœæãããŸãã ãã®äžã§ããã¹ãŠã®ããŒã¿ã¯äžè¬ã«ãã¬ãŒã³ããŒã·ã§ã³ã«è»¢éãããŸãã ASP.NETã«æ
£ããŠãã人ã¯ãAzulãšãã®DataModelã¯Razorãšãã®ViewModelã«äŒŒãŠããŸãã HTMLãšåæ§ã«ã颿°ãDOMèŠçŽ ã®ã€ãã³ãã«ãã€ã³ãã§ããŸãã CSSãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠèŠçŽ ãã¹ã¿ã€ã«ã§ããŸãã ããã¯HTMLãšåãCSSã§ã¯ãããŸããããéåžžã«äŒŒãŠããŸãã ãŸããWangãUWPã®AngularãŸãã¯MVVMã®ãããªåæ¹åãã€ã³ãã£ã³ã°ããããŸãã
ãµã€ãã®è©³çްã
æ®ãã®ãã¬ãŒã ã¯ãŒã¯ã®ç°¡åãªæŠèŠ
- Orbtk -Azulãšã»ãŒåãã§ããã£ãŒãã¢ã«ãã¡ã§ã
- Conrod- ãããªã¯ãã¹ãã©ãããã©ãŒã ã®ãã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
- Yewã¯WebAssemblyã§ãããReactã«äŒŒãŠããŸãã Webéçºçšã
ã客æ§
ãœã±ããã®èªã¿åãããã³æžã蟌ã¿çšã®è£å©æ©èœãã°ã«ãŒãåãããŠããæ§é
struct ChatService {} impl ChatService {
- ãœã±ããããããŒã¿ãèªã¿åã
- ãœã±ããããèªã¿åãããããŒã¿ã®ãããã¡ãŒã
- ããããã³ã°ã³ãŒã«ã ããã§ãå®è¡ã¹ã¬ããã¯ãããŒã¿ãèªã¿åãããããã¿ã€ã ã¢ãŠããçºçãããŸã§åæ¢ããŸãã
- UTF8ãšã³ã³ãŒãã£ã³ã°ã®ãã€ãé
åããæååãååŸããŸãã
- æ¥ç¶ãã¿ã€ã ã¢ãŠãã«ãã£ãŠäžæãããããå¥ã®ãšã©ãŒãçºçããå Žåãããã«å°éããŸãã
- æååããœã±ããã«éä¿¡ããŸãã
- æååãUTF8ãšã³ã³ãŒãã£ã³ã°ã®ãã€ãã«å€æããããŒã¿ããœã±ããã«éä¿¡ããŸãã ãœã±ãããžã®ããŒã¿ã®æžã蟌ã¿ã¯ãããã¯ãããŸãããã€ãŸãã å®è¡ã®ã¹ã¬ããã¯äœæ¥ãç¶ç¶ããŸãã ããŒã¿ãéä¿¡ã§ããªãã£ãå Žåããéä¿¡ã§ããŸããããšããã¡ãã»ãŒãžã§ããã°ã©ã ãäžæããŸãã
ãŠãŒã¶ãŒããã®ã€ãã³ããåŠçããDataModelã倿Žããããã®é¢æ°ãã°ã«ãŒãåããæ§é
struct Controller {}
- ãœã±ããããã®èªã¿åãã®ãããã¯æäœãäžæããããŸã§ã®ã¿ã€ã ã¢ãŠãïŒããªç§åäœïŒã
- ãã®æ©èœã¯ããŠãŒã¶ãŒããµãŒããŒã«æ°ããã¡ãã»ãŒãžãéä¿¡ãããšãã«æ©èœããŸãã
- ããŒã¿ã¢ãã«ã§ãã¥ãŒããã¯ã¹ãååŸããŸãã ããã«ããããã¥ãŒããã¯ã¹ãè§£æŸããããŸã§ãã€ã³ã¿ãŒãã§ã€ã¹ã®åæç»ã¹ã¬ããããããã¯ãããŸãã
- ãŠãŒã¶ãŒãå
¥åããããã¹ãã®ã³ããŒãäœæããŠããã«è»¢éããããã¹ãå
¥åãã£ãŒã«ããã¯ãªã¢ããŸãã
- ã¡ãã»ãŒãžãéä¿¡ããŠããŸãã
- ãã®ã€ãã³ããåŠçããåŸãã€ã³ã¿ãŒãã§ã€ã¹ãåæç»ããå¿
èŠãããããšããã¬ãŒã ã¯ãŒã¯ã«éç¥ããŸãã
- ãã®æ©èœã¯ããŠãŒã¶ãŒããµãŒããŒã«æ¥ç¶ãããšãã«æ©èœããŸãã
- æšæºã©ã€ãã©ãªããã®æéã®é·ãã衚ãããã«æ§é ãæ¥ç¶ããŸãã
- ãã§ã«ãµãŒããŒã«æ¥ç¶ããŠããå Žåã¯ã颿°ã®å®è¡ãäžæããã€ã³ã¿ãŒãã§ã€ã¹ãåæç»ããå¿
èŠããªãããšããã¬ãŒã ã¯ãŒã¯ã«éç¥ããŸãã
- Azulãã¬ãŒã ã¯ãŒã¯ã®ã¹ã¬ããããŒã«ããã¹ã¬ããã§éåæã«å®è¡ãããã¿ã¹ã¯ã远å ããŸãã ããŒã¿ã¢ãã«ã䜿çšããmutexã®åŒã³åºãã¯ãmutexãè§£æŸããããŸã§UIã®æŽæ°ããããã¯ããŸãã
- ã¡ã€ã³ã¹ã¬ããã§å®è¡ããã宿çãªã¿ã¹ã¯ã远å ããŸãã ãã®ããŒã¢ã³ã§ã®é·æéã®èšç®ã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã®æŽæ°ã«ãã£ãŠãããã¯ãããŸãã
- ãã¥ãŒããã¯ã¹ãååŸããŸãã
- ãŠãŒã¶ãŒãå
¥åããããŒããèªã¿åããããã«åºã¥ããŠããŒã«ã«ã¢ãã¬ã¹ãäœæãããªãã¹ã³ããŸãã
- ããŒã«ã«ã¢ãã¬ã¹ã«å°çãããã±ãããèªã¿åãUDPãœã±ãããäœæããŸãã
- ãŠãŒã¶ãŒãå
¥åãããµãŒããŒã¢ãã¬ã¹ãèªã¿åããŸãã
- ãã®ãµãŒããŒããã®ã¿ãã±ãããèªã¿åãããã«UDPãœã±ããã«æç€ºããŸãã
- ãœã±ããããã®èªã¿åãæäœã®ã¿ã€ã ã¢ãŠããèšå®ããŸãã ãœã±ãããžã®æžã蟌ã¿ã¯åŸ
æ©ããã«è¡ãããŸããã€ãŸããããŒã¿ãæžã蟌ãã ãã§äœãåŸ
ããããœã±ããããã®èªã¿åãæäœã¯ã¹ããªãŒã ããããã¯ããèªã¿åãå¯èœãªããŒã¿ãå°çãããŸã§åŸ
æ©ããŸãã ã¿ã€ã ã¢ãŠããèšå®ããªãå Žåããœã±ããããã®èªã¿åãæäœã¯ç¡æéã«åŸ
æ©ããŸãã
- ãŠãŒã¶ãŒããµãŒããŒã«æ¢ã«æ¥ç¶ããŠããããšã瀺ããã©ã°ãèšå®ããŸãã
- äœæãããœã±ãããããŒã¿ã¢ãã«ã«æž¡ããŸãã
- ãã®ã€ãã³ããåŠçããåŸãã€ã³ã¿ãŒãã§ã€ã¹ãåæç»ããå¿
èŠãããããšããã¬ãŒã ã¯ãŒã¯ã«éç¥ããŸãã
- Azulãã¬ãŒã ã¯ãŒã¯ã®ã¹ã¬ããããŒã«ã§å®è¡ãããéåææäœã
- ããŒã¿ã¢ãã«ãããœã±ããã®ã³ããŒãååŸããŸãã
- ãœã±ããããããŒã¿ãèªã¿åãããšããŠããŸãã ãœã±ããã®ã³ããŒãäœæãããããŒã¿ã¢ãã«ã®ãã¥ãŒããã¯ã¹ã«ãããœã±ããããã¡ãã»ãŒãžãå°çãããŸã§ããã§çŽæ¥åŸ
æ©ããå Žåããã¥ãŒããã¯ã¹ãè§£æŸãããŸã§ã€ã³ã¿ãŒãã§ã€ã¹å
šäœã®æŽæ°ã忢ããŸãã
- äœããã®ã¡ãã»ãŒãžã衚瀺ãããå ŽåãããŒã¿ã¢ãã«ã倿Žãããšãmodifyã¯lockïŒïŒãšåãããšãè¡ããŸããçµæãã©ã ãã«æž¡ããã©ã ãã³ãŒãã®çµäºåŸã«ãã¥ãŒããã¯ã¹ãè§£æŸããŠãã©ãããè§£é€ããŸãã
- æ°ããã¡ãã»ãŒãžãããããšã瀺ããã©ã°ãèšå®ããŸãã
- ãã¹ãŠã®ãã£ããã¡ãã»ãŒãžã®é
åã«ã¡ãã»ãŒãžã远å ããŸãã
- ã¡ã€ã³ã¹ã¬ããã§å®è¡ãããç¹°ãè¿ãåææäœã
- æ°ããã¡ãã»ãŒãžãããå Žåã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãæåããåæç»ããŠãã®ããŒã¢ã³ã§äœæ¥ãç¶ããå¿
èŠãããããšããã¬ãŒã ã¯ãŒã¯ã«éç¥ããŸããããã§ãªãå Žåã¯ãæåããã€ã³ã¿ãŒãã§ã€ã¹ãæç»ããã«ã次ã®ãµã€ã¯ã«ã§ãã®é¢æ°ãåŒã³åºããŸãã
- ãã¥ãŒããã¯ã¹ãããŒã¿ã¢ãã«ã§ããã¯ãããªãããã«ããœã±ããã®ã³ããŒãäœæããŸãã
- ãã¥ãŒããã¯ã¹ãååŸãããœã±ãããžã®ãªã³ã¯ãååŸããŸãã
- ãœã±ããã®ã³ããŒãäœæããŸãã 颿°ãçµäºãããšããã¥ãŒããã¯ã¹ã¯èªåçã«è§£æŸãããŸãã
Azulã®éåæããŒã¿åŠçãšããŒã¢ã³
ããŒã¢ã³ã¯åžžã«ã¡ã€ã³ã¹ã¬ããã§å®è¡ãããããããããã¯ã¯é¿ããããŸããã éåæã¿ã¹ã¯ã®å Žåãããšãã°ãã®ããã«ãããšã10ç§éããã¯ãããªããªããŸãã
fn start_async_task(app_data: Arc<Mutex<MyDataModel>>, _: Arc<()>) {
modify颿°ã¯lockïŒïŒãåŒã³åºããããŒã¿ã¢ãã«ã§mutexãå®è¡ãããéãã€ã³ã¿ãŒãã§ã€ã¹ã®æŽæ°ããããã¯ããŸãã
ç§ãã¡ã®ã¹ã¿ã€ã«
const CUSTOM_CSS: &str = " .row { height: 50px; } .orange { background: linear-gradient(to bottom, #f69135, #f37335); font-color: white; border-bottom: 1px solid #8d8d8d; }";
å®éããŠãŒã¶ãŒã«è¡šç€ºããDOMãäœæããããã®é¢æ°
impl azul::prelude::Layout for ChatDataModel {
- æçµçãªDOMãäœæããã€ã³ã¿ãŒãã§ã€ã¹ãåæç»ããå¿
èŠããããã³ã«åŒã³åºããã颿°ã
- ãã§ã«ãµãŒããŒã«æ¥ç¶ããŠããå Žåã¯ãã¡ãã»ãŒãžãéä¿¡ããã³èªã¿åãããã®ãã©ãŒã ã衚瀺ããŸãããã以å€ã®å Žåã¯ããµãŒããŒã«æ¥ç¶ããããã®ãã©ãŒã ã衚瀺ããŸãã
- ãµãŒããŒãžã®æ¥ç¶ã«å¿
èŠãªããŒã¿ãå
¥åããããã®ãã©ãŒã ãäœæããŸãã
- ãã°ã€ã³ã®ããã¹ãç¢æã§ãã¿ã³ãäœæããŸãã
- ãããDOMãªããžã§ã¯ãã«å€æããŸãã
- è¡ã¯ã©ã¹ã远å ããŸãã
- CSSã¯ã©ã¹ãªã¬ã³ãžã远å ããŸãã
- ãã¿ã³ãã¯ãªãã¯ããã€ãã³ããã³ãã©ãŒã远å ããŸãã
- ãŠãŒã¶ãŒãšcssã¯ã©ã¹ã®è¡ã«è¡šç€ºããããã¹ããå«ãããã¹ãã©ãã«ãäœæããŸãã
- ã¢ãã«ã®ããããã£ãšcssã¯ã©ã¹ã®è¡ã®ããã¹ãã䜿çšããŠããã¹ããå
¥åããããã®ããã¹ãããã¯ã¹ãäœæããŸãã
- ããã¹ããã£ãŒã«ããDataModelã®ããããã£ã«ãã€ã³ãããŸãã ããã¯åæ¹åãã€ã³ãã£ã³ã°ã§ãã TextInputãç·šéãããšãã¢ãã«ã®ããããã£å
ã®ããã¹ããèªåçã«å€æŽãããŸããéãåæ§ã§ãã ã¢ãã«ã®ããã¹ãã倿ŽãããšãTextInputã®ããã¹ãã倿ŽãããŸãã
- UIèŠçŽ ãé
眮ããã«ãŒãDOMèŠçŽ ãäœæããŸãã
- ã¡ãã»ãŒãžãéåä¿¡ããããã®ãã©ãŒã ãäœæããŸãã
- ã¯ãªãã¯ãããšãããã¹ããéä¿¡ããšã¯ã©ã¹ãè¡ããããªã¬ã³ãžããCSSãå«ããã¿ã³ãäœæããŸãã
- ã¢ãã«ããããã£self.messaging_model.text_input_stateã®åæ¹åãã€ã³ãã£ã³ã°ãšã¯ã©ã¹ãrowãã®cssã§ããã¹ãå
¥åãã£ãŒã«ããäœæããŸãã
- ãã£ããã§äœæãããã¡ãã»ãŒãžã衚瀺ããããã¹ãã©ãã«ã远å ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ã®ç¶æ
ãä¿åããã¢ãã«
Azulã®ããã¥ã¡ã³ãã«ã¯ãããŒã¿ããŒã¹ãžã®æ¥ç¶ãå«ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ããŒã¿ãæ ŒçŽããå¿
èŠããããšæžãããŠãããããUDPãœã±ãããããã«é
眮ããŸãã
- ããã«ããã{:?}ã®åœ¢åŒã®ãã³ãã¬ãŒãã«æååãšããŠæ§é ã衚瀺ã§ããŸãã
- ããŒã¿ã¢ãã«ã Azulã§äœ¿çšã§ããããã«ã 圌女ã¯ã¬ã€ã¢ãŠãç¹æ§ãå®è£
ããå¿
èŠããããŸãã
- ãŠãŒã¶ãŒããµãŒããŒã«æ¥ç¶ãããŠãããã©ããã確èªãããã©ã°ã
- ãµãŒããŒã«ã¡ãã»ãŒãžãéä¿¡ãããµãŒããŒããåä¿¡ããã¡ãã»ãŒãžãä¿åããããã®ãã©ãŒã ã衚瀺ããããã®ã¢ãã«ã
- ãµãŒããŒã«æ¥ç¶ããããã®ãã©ãŒã ã衚瀺ããããã®ã¢ãã«ã
- ãŠãŒã¶ãŒãå
¥åããããŒãã ãœã±ããã§ããããªãã¹ã³ããŸãã
- ãŠãŒã¶ãŒãå
¥åãããµãŒããŒã®ã¢ãã¬ã¹ã æ¥ç¶ããŸãã
- ãŠãŒã¶ãŒã¡ãã»ãŒãžã ãµãŒããŒã«éä¿¡ããŸãã
- ãµãŒããŒããéä¿¡ãããã¡ãã»ãŒãžã®é
åã
- ãµãŒããŒãšéä¿¡ããããã®ãœã±ããã
- ãµãŒããŒããæ°ããã¡ãã»ãŒãžãå°çãããã©ããã確èªãããã©ã°ã
æåŸã«ãã¢ããªã±ãŒã·ã§ã³ãžã®ã¡ã€ã³ãšã³ããªãã€ã³ãã GUIæç»ãšãŠãŒã¶ãŒå
¥ååŠçãããµã€ã¯ã«ãéå§ããŸã
pub fn run() {
- éå§ããŒã¿ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
- ããã©ã«ãã§ã¢ããªã±ãŒã·ã§ã³ã䜿çšããã¹ã¿ã€ã«ã
- ç¬èªã®ã¹ã¿ã€ã«ã远å ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã衚瀺ãããŠã£ã³ããŠãäœæããŸãã
- ãã®ãŠã£ã³ããŠã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãã
ãµãŒããŒ
ã¢ããªã±ãŒã·ã§ã³ãžã®ã¡ã€ã³ãšã³ããªãã€ã³ã
éåžžãããã«ã¯ã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ããããŸãã
pub fn run() {
- ãœã±ãããäœæããŸãã
- 1ã€ã®sxã¡ãã»ãŒãžéä¿¡è
ãšå€ãã®rxåä¿¡è
ã§äžæ¹åã®ãã£ãã«ãäœæããŸãã
- å¥ã®ã¹ããªãŒã ã§ãã¹ãŠã®åä¿¡è
ã«ã¡ãã»ãŒãžãéä¿¡ãå§ããŸãã
- ãœã±ããããããŒã¿ãèªã¿åã£ãŠã¹ããªãŒã ã«éä¿¡ãããµãŒããŒã«æ¥ç¶ãããŠããã¯ã©ã€ã¢ã³ãã«ã¡ãã»ãŒãžãé
ä¿¡ããŸãã
ã¯ã©ã€ã¢ã³ãã«ã¡ãã»ãŒãžãéä¿¡ããããã®ã¹ããªãŒã ãäœæããæ©èœ
fn start_sender_thread(rx: mpsc::Receiver<(Vec<u8>, SocketAddr)>, socket: UdpSocket) {
- æ°ããã¹ã¬ãããéå§ããŸãã moveã¯ã倿°ãããããã©ã ããšãããŒãåŒãç¶ãããšãæå³ããŸãã ããå
·äœçã«ã¯ãæ°ããã¹ã¬ããã¯rxããã³ãœã±ãã倿°ããåžåãããŸãã
- 顧客ã«ãã£ãŠç§ãã¡ã«æ¥ç¶ãããã¢ãã¬ã¹ã®ã³ã¬ã¯ã·ã§ã³ã ããããã¹ãŠã«ã¡ãã»ãŒãžãéä¿¡ããŸãã äžè¬çã«ãå®éã®ãããžã§ã¯ãã§ã¯ãã¯ã©ã€ã¢ã³ããç§ãã¡ããåæãããã®é
åããã¢ãã¬ã¹ãåé€ããããšãåŠçããå¿
èŠããããŸãã
- ç¡éã«ãŒããéå§ããŸãã
- ãã£ãã«ããããŒã¿ãèªã¿åããŸãã ããã§ã¯ãæ°ããããŒã¿ãå°çãããŸã§ã¹ããªãŒã ããããã¯ãããŸãã
- é
åã«ãã®ãããªã¢ãã¬ã¹ããªãå Žåã¯ãããã«è¿œå ããŸãã
- ãã€ãé
åããUTF8æååããã³ãŒãããŸãã
- ãã¹ãŠã®é¡§å®¢ã«éä¿¡ãããã€ãã®é
åãäœæããŸãã
- ã¢ãã¬ã¹ã®ã³ã¬ã¯ã·ã§ã³ã調ã¹ãŠãå
šå¡ã«ããŒã¿ãéä¿¡ããŸãã
- UDPãœã±ãããžã®æžãèŸŒã¿æäœã¯ãããã¯ãããªããããããã§ã¯ã颿°ã¯åä¿¡è
ã«ã¡ãã»ãŒãžãå°çããŠã»ãŒå³åº§ã«å®è¡ããããŸã§åŸ
æ©ããŸããã
- ãšã©ãŒãçºçããå Žåã¯ãæå®ãããã¡ãã»ãŒãžã䜿çšããŠããã°ã©ã ãç·æ¥çµäºããŸãã
ãã®é¢æ°ã¯ããŠãŒã¶ãŒå
¥åã«åºã¥ããŠãœã±ãããäœæããŸã
const TIMEOUT_IN_MILLIS: u64 = 2000; fn create_socket() -> UdpSocket { println!("Enter port to listen");
- ãµãŒããŒããªãã¹ã³ããããŒããèªã¿åããããã«åºã¥ããŠããŒã«ã«ãµãŒããŒã¢ãã¬ã¹ãäœæããŸãã
- ãã®ã¢ãã¬ã¹ã§ãªãã¹ã³ããUDPãœã±ãããäœæããŸãã
- èªã¿åãæäœã®ã¿ã€ã ã¢ãŠããèšå®ããŸãã èªã¿åãæäœã¯ãããã¯ãããŠãããæ°ããããŒã¿ãå°çããããã¿ã€ã ã¢ãŠããçºçãããŸã§ãããŒããããã¯ããŸãã
- Functionããäœæããããœã±ãããè¿ããŸãã
- ãã®é¢æ°ã¯ããœã±ããããããŒã¿ãèªã¿åããéä¿¡è
ã¢ãã¬ã¹ãšãšãã«ãããè¿ããŸãã
ãœã±ããããããŒã¿ãèªã¿åã颿°
fn read_data(socket: &UdpSocket) -> (Vec<u8>, SocketAddr) {
- ãããã¡ãŒã¯ãããŒã¿ãèªã¿åãå Žæã§ãã
- æå¹ãªããŒã¿ãèªã¿åããããŸã§å®è¡ãããã«ãŒããéå§ããŸãã
- èªã¿åããããã€ãæ°ãšéä¿¡è
ã¢ãã¬ã¹ãååŸããŸãã
- é
åã®å
é ããèªã¿åã£ããã€ãæ°ãŸã§ã®é
åã®ã¹ã©ã€ã¹ãäœæããããããã€ããã¯ãã«ã«å€æããŸãã
- ã¿ã€ã ã¢ãŠããŸãã¯ãã®ä»ã®ãšã©ãŒãçºçããå Žåã¯ãã«ãŒãã®æ¬¡ã®å埩ã«é²ã¿ãŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ã¬ã€ã€ãŒã«ã€ããŠ
ãªããããã¯ïŒ6æ2æ¥ã®è·å Žã§ã®å°ããªæè²ããã°ã©ã ã ããã«çœ®ãããšã«ããŸããã誰ãã圹ã«ç«ã€ãããããŸããã 6æã®ã·ã£ãŒããªè©©äººã¯CïŒã®äŸã§ãããASP.NETã«ã€ããŠè©±ããŠããããã§ãäœããããŸããã§ãããããã¯å€æ¹ã§ããããããŠãç§ã¯ã¢ã«ãã ãšãã¯ã¿ãŒã®ããã«å»ºç¯ã«é¢ããå°ããªæè²ããã°ã©ã ãæžãããšã«æ±ºããŸããã ãããè¡ããŸãããã
å®éãããã«è¿œå ããã®ã¯ãã¢ãŒãã®å埩ãš1é±éã«1åããèšäºãæžãããšãã§ãããè³æãæ¢ã«ããã«ãããæ¥é±ã¯Habrã«äœãä»ã®ãã®ãã¢ããããŒããããã£ãããã§ãã
éåžžãã¢ããªã±ãŒã·ã§ã³ã¯éå±€åãããŸãã åã¬ã€ã€ãŒã«ã¯ãããããé
眮ãããŠããã¬ã€ã€ãŒã®åäœç¹æ§ãå®è£
ãããªããžã§ã¯ããå«ãŸããŠããŸãã ãªã©ã ãããã¯ã¬ã€ã€ãŒã§ãã
- ãã¬ãŒã³ããŒã·ã§ã³å±€ã
- ããžãã¹ããžãã¯ã®ã¬ã€ã€ãŒã
- ããŒã¿ã¢ã¯ã»ã¹å±€ã
- ãšã³ãã£ãã£ïŒãŠãŒã¶ãŒãåç©ãªã©ïŒ
åã¬ã€ã€ãŒã«ã¯ãç¬èªã®DTOãšãä»»æã®ã¡ãœãããæã€å®å
šã«ä»»æã®ã¯ã©ã¹ãå«ããããšãã§ããŸãã äž»ãªããšã¯ãããããé
眮ãããŠããã¬ã€ã€ãŒã«é¢é£ããæ©èœãå®è¡ããããšã§ãã åçŽãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãäžéšã®ã¬ã€ã€ãŒãæ¬ èœããŠããå ŽåããããŸãã ããšãã°ãã¬ã€ã€ãŒãã¥ãŒã¯ãMVCãMVPãMVVMãã¿ãŒã³ãä»ããŠå®è£
ã§ããŸãã ããã¯å®å
šã«ãªãã·ã§ã³ã§ãã äž»ãªããšã¯ããã®ã¬ã€ã€ãŒã«ããã¯ã©ã¹ãã¬ã€ã€ãŒã«å²ãåœãŠãããæ©èœãå®è£
ããããšã§ãã ãã¿ãŒã³ãšã¢ãŒããã¯ãã£ã¯åãªãæšå¥šäºé
ã§ãããæç€ºã§ã¯ãªãããšã«æ³šæããŠãã ããã ãã¿ãŒã³ãšã¢ãŒããã¯ãã£ã¯æ³åŸã§ã¯ãããŸãããããã¯ã¢ããã€ã¹ã§ãã
ãããã£ãŠãæšæºã®Entity Frameworkã䜿çšããæšæºã®ASP.NETã¢ããªã±ãŒã·ã§ã³ã®äŸã䜿çšããŠãåã¬ã€ã€ãŒãèŠãŠã¿ãŸãããã
ãã¬ãŒã³ããŒã·ã§ã³å±€
ããã«MVCããããŸãã ããã¯ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãæäŸããã¬ã€ã€ãŒã§ãã ã³ãã³ãã¯ããã«ããããŠãŒã¶ãŒã¯ããããããŒã¿ãååŸããŸãã å¿
ããã人ã
ã§ã¯ãããŸãããAPIãããã°ããŠãŒã¶ãŒã¯å¥ã®ããã°ã©ã ã§ãã è»ã¯è»ãšéä¿¡ããŸãã
ããžãã¹ããžãã¯å±€
ããã§ã¯ãéåžžãã¯ã©ã¹ã¯UserServiceãªã©ã®ServiceãšåŒã°ããŸãããããã¯äœã§ãããŸããŸããã ã¡ãœãããæã€ã¯ã©ã¹ã®ã»ããã äž»ãªããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®èšç®ãšèšç®ãããã§è¡ãããããšã§ãã ããã¯æãåããŠããã°ãå±€ã§ãã ã»ãšãã©ã®ã³ãŒããšããŸããŸãªã¯ã©ã¹ããããŸãã ããã¯å®éãç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã§ãã
ããŒã¿ã¢ã¯ã»ã¹å±€
éåžžãããã§EFã¯äœæ¥åäœãšãªããžããªã®ãã¿ãŒã³ãå®è£
ããŸãã ãã®ãããDbContextã¯äœæ¥åäœã§ãããDBã¯ããããªããžããªãšèšå®ããŸãã å®éãããã¯ããŒã¿ãé
眮ããããããããŒã¿ãååŸããå Žæã§ãã ããŒã¿ãœãŒã¹ãããŒã¿ããŒã¹ãå¥ã®ã¢ããªã±ãŒã·ã§ã³ã®APIãã¡ã¢ãªå
ã®ãã£ãã·ã¥ããŸãã¯äœããã®çš®é¡ã®ä¹±æ°ãžã§ãã¬ãŒã¿ãŒã§ãããã©ããã«é¢ä¿ãªãã ä»»æã®ããŒã¿ãœãŒã¹ã
ãšã³ãã£ãã£
ã¯ããããããçš®é¡ã®ãŠãŒã¶ãŒãåç©ãªã©ã§ãã 1ã€ã®éèŠãªãã€ã³ã-圌ãã¯åœŒãã ãã«ç¹åŸŽçãªããçš®ã®è¡åãæã£ãŠãããããããŸããã äŸïŒ
class User { public string FirstName { get; set; } public string LastName { get; set; } public string FullName { get { return FirstName + " " + LastName; } } public bool Equal(User user) { return this.FullName == user.FullName; } }
ããŠãéåžžã«ç°¡åãªäŸã§ãã ãããã°
using System; using System.Collections.Generic; using System.Text;
PS
ããŠãèšäºã®ææ³äžã®èª€ããä¿®æ£ããŠãããNastyaã«æè¬ããŸããããã§ããNastyaã¯ããªããèµ€ãåæ¥èšŒæžã§ç¡é§ã«ãªãããäžè¬çã«ã¯ã¯ãŒã«ã§ããæããŠã<3ã