ãŸããã
å€ãã®å Žåãæºåž¯é»è©±ãã¿ãã¬ããããããã°ã©ã ã管çãããå ŽåããããŸããããã®ããã«æºåž¯é»è©±ã§å¥ã®ã¢ããªã±ãŒã·ã§ã³ãäœæããããšã¯äžé©åã§ãïŒãŸãã¯äžå¯èœã§ãïŒïŒãã®ãããžã§ã¯ãã§ã¯äœæ¥ãå€ãããŸãã ïŒ ãã®ç¶æ³ã¯ç§ã«å®æçã«çºçããæçµçã«ç§ã¯ãã®åé¡ã«ãã£ã±ããšå¯ŸåŠããããšã«ããŸããã ãã®çµæãã·ã¹ãã ã®ã¢ãŒããã¯ãã£ãšäœ¿çšæ¹æ³ããã®èšäºã§èª¬æãããŸãã
ç®ç
Androidããã€ã¹ã«åºã¥ãããã©ã°ã€ã³UIãC ++ããã°ã©ã ã«å®è£ ã§ããã·ã¹ãã ãäœæããŸãã åæã«ããµãŒãããŒãã£ã®ã©ã€ãã©ãªã«å¯Ÿããã«ã¹ã¿ã C ++ã³ãŒãã®äŸåé¢ä¿ãæå°éã«æããããŒã¿è»¢éãããã³ã«ããæœè±¡åããããšèããŸããã ã·ã¹ãã ã¯ãC ++ã©ã€ãã©ãªãšAndroidã¢ããªã±ãŒã·ã§ã³ã®2ã€ã®éšåã§æ§æããå¿ èŠããããŸãã
ã·ã¹ãã æ§æ
ãã®ã·ã¹ãã ã«ã¯ãAndroidããã€ã¹ãã¯ã©ã€ã¢ã³ããšããŠæ©èœããã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãŒããã¯ãã£ãããããµãŒããŒã¯ãŠãŒã¶ãŒããã°ã©ã ã§ãã ãããã®éã®éä¿¡ã¯ãTCP / IPãœã±ããã䜿çšããŠå®è¡ãããŸãã éä¿¡ãããã³ã«ãå®è£ ããããã«ã TAUã©ã€ãã©ãªãäœæãããŸããã
ã©ã€ãã©ãªãæ åœããäž»ãªã¿ã¹ã¯ïŒ
- ãµãŒããŒãšã¯ã©ã€ã¢ã³ãéã§éä¿¡ãããããŒã¿ã®çæãšåŠç
- ã¯ã©ã€ã¢ã³ãã§çºçããããŸããŸãªã€ãã³ãïŒã€ãã³ãUIãã³ãã©ãŒïŒã«å¿çããããã®ãŠãŒã¶ãŒã³ãŒããžã®å¶åŸ¡ã®è»¢é
- ãµãŒããŒãšã¯ã©ã€ã¢ã³ãéã®æ¥ç¶ã®äœæãšç¶æ
- ã¯ã©ã€ã¢ã³ãã«è¡šç€ºãããUIèŠçŽ ã®æ§æãèšè¿°ããããã«å¿ èŠãªããŒã¿æ§é ã®çæ
ã©ã€ãã©ãªã¯ã次ã®åå空éã§æ§æãããŸãã
- tau :: Communications_Handling-ãã±ãããçæããã¯ã©ã€ã¢ã³ãããåä¿¡ããããŒã¿ã解æãããŠãŒã¶ãŒã³ãŒãã§ãã³ãã©ãŒãåŒã³åºããŸãã ã¯ã©ã€ã¢ã³ããæ¥ç¶ããŠããåæãããŸã§ã®éã«çºçãããã¹ãŠã®ããšã¯ããã®åå空éã®ã¯ã©ã¹ã³ãŒãã«ãã£ãŠå¶åŸ¡ãããŸãã
- tau :: layout_generation-ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ã®å Žæãšåäœãèšè¿°ããJSONæ§é ãäœæã§ããæ©èœãå«ãŸããŠããŸãã ãã®åŸããã®ããŒã¿ã¯ã¯ã©ã€ã¢ã³ãã«éä¿¡ããã察å¿ããUIã衚瀺ãããŸãã
- tau :: util-ããŸããŸãªè£å©æ©èœãå«ãŸããŠããŸããããã¯ãã«ã¹ã¿ã C ++ãããžã§ã¯ãã§ã©ã€ãã©ãªã䜿çšããããã«å¿
èŠã§ã¯ãããŸããããå€ãã®å Žå䟿å©ã§ãã ãã®åå空éã®ã¯ã©ã¹ã¯ããµãŒãããŒãã£ã®ã©ã€ãã©ãªãŸãã¯éæšæºã®ã³ã³ãã€ã©æ¡åŒµæ©èœã䜿çšã§ããå¯äžã®ã¯ã©ã¹ã§ãã ãããã£ãŠãããã«TCP / IPãœã±ããã®æäœãæ
åœããã¯ã©ã¹ããããŸã-ããã¯ãã©ãããã©ãŒã åºæã®ã³ãŒãã§ãã çŸåšãboost :: asioããã³C ++ / CLIã«åºã¥ã2ã€ã®ãããã¯ãŒã¯éä¿¡å®è£
ããããŸãã tau :: Communications_Handling以å€ã®ãã¹ãŠã®ãããã¯ãŒã¯ã³ãŒã«ã®å®è£
ãåé€ãããšãã©ã€ãã©ãªãŠãŒã¶ãŒã¯å¿
èŠã«å¿ããŠãããã¯ãŒã¯ããŒãå
šäœãåå¥ã«æžã蟌ãããšãã§ããŸãã
- tau :: common-ã©ã€ãã©ãªã®ä»ã®éšåãã䜿çšãããã¯ã©ã¹ãå«ã¿ãŸãïŒtau :: layout_generationãštau :: Communications_Handlingã®éã«äŸåé¢ä¿ããªãããã«ããããã掟çããŸãïŒ
䜿çšããŸãã äŸïŒ1-ããã«ã¡ã¯ãworld
ã©ã€ãã©ãªã䜿çšãããã¢ãç°¡åãªäŸããå§ããŸãããã®äŸã§ã¯ãç»é¢ã«ãŠã§ã«ã«ã ã¡ãã»ãŒãžã衚瀺ãããŸãã ãã®å Žåãã«ã¹ã¿ã ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
é衚瀺ã®ããã¹ã
#include <tau/layout_generation/layout_info.h> #include <tau/util/basic_events_dispatcher.h> #include <tau/util/boost_asio_server.h> class MyEventsDispatcher : public tau::util::BasicEventsDispatcher { public: MyEventsDispatcher( tau::communications_handling::OutgiongPacketsGenerator & outgoingGeneratorToUse): tau::util::BasicEventsDispatcher(outgoingGeneratorToUse) {}; virtual void packetReceived_requestProcessingError( std::string const & layoutID, std::string const & additionalData) { std::cout << "Error received from client:\nLayouID: " << layoutID << "\nError: " << additionalData << "\n"; } virtual void onClientConnected( tau::communications_handling::ClientConnectionInfo const & connectionInfo) { std::cout << "Client connected: remoteAddr: " << connectionInfo.getRemoteAddrDump() << ", localAddr : " << connectionInfo.getLocalAddrDump() << "\n"; } void packetReceived_clientDeviceInfo( tau::communications_handling::ClientDeviceInfo const & info) { using namespace tau::layout_generation; std::cout << "Received client information packet\n"; std::string greetingMessage = "Hello, habrahabr!"; sendPacket_resetLayout(LayoutInfo().pushLayoutPage( LayoutPage(tau::common::LayoutPageID("FIRST_LAYOUT_PAGE"), LabelElement(greetingMessage))).getJson()); } }; int main(int argc, char ** argv) { boost::asio::io_service io_service; short port = 12345; tau::util::SimpleBoostAsioServer<MyEventsDispatcher>::type s(io_service, port); std::cout << "Starting server on port " << port << "...\n"; s.start(); std::cout << "Calling io_service.run()\n"; io_service.run(); return 0; }
ã¯ã©ã€ã¢ã³ãããã€ã¹ïŒ MyEventsDispatcher ïŒãšå¯Ÿè©±ãããã¹ãŠã®ãŠãŒã¶ãŒããžãã¯ãå«ãã¡ã€ã³ã¯ã©ã¹ã¯ã tau :: util :: BasicEventsDispatcherããç¶æ¿ããå¿ èŠããããŸãã åºæ¬ã¯ã©ã¹ã®2ã€ã®ã¡ãœããonClientConnectedïŒïŒããã³packetReceived_clientDeviceInfoïŒïŒããªãŒããŒã©ã€ãããŸãã æåã¯ã¯ã©ã€ã¢ã³ããæ¥ç¶ãããšãã«åŒã³åºãããŸãã 2çªç®ã®æ¹æ³ã¯ããµãŒããŒãžã®æ¥ç¶åŸã«ã¯ã©ã€ã¢ã³ãããã€ã¹ã«é¢ããæ å ±ãæ¥ããšãã«å®è¡ãããŸãïŒæ¥ç¶ãã¯ã©ã€ã¢ã³ãã«ãã£ãŠéä¿¡ãããåŸã®æåã®ãã±ããïŒã
ãã®å Žåãæåã®æ¹æ³ã¯ç°¡åã§ããã³ã³ãœãŒã«ã«æ å ±ã¡ãã»ãŒãžã衚瀺ããã ãã§ãã 2çªç®ã®æ¹æ³ã§ã¯ããµãŒããŒã¯ã¯ã©ã€ã¢ã³ãã«ã¬ã€ã¢ãŠããéä¿¡ããŸããããã¯ãã¯ã©ã€ã¢ã³ãã«è¡šç€ºããã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããããŒã¿ã§ãã
ãããã¯ãŒã¯ãä»ããŠããŒã¿ãéä¿¡ããã³ãŒãã¯ãã¹ãŠmainïŒïŒã«ãããŸãã ãã®å Žåã boost :: asioã©ã€ãã©ãªã䜿çšããŠéä¿¡ãå®è£ ããŸãã tau :: utilåå空éã«ã¯å¯Ÿå¿ããæœè±¡åããããããã«ãããã®äŸãã§ããã ãã³ã³ãã¯ãã«ããŸãã ããŒã¹ãã®äœ¿çšã¯ãªãã·ã§ã³ã§ã-TCP / IPãœã±ããã®å®è£ ã¯ã©ã€ãã©ãªãšäžç·ã«éåžžã«ç°¡åã«äœ¿çšã§ããŸãã
ç·šé
äŸãšããŠãã³ã³ãã€ã«ã«ã¯g ++ã䜿çšããŸãã ãã®å Žåãã³ãã³ãã¯æ¬¡ã®ããã«ãªããŸãã
g++ -lboost_system -pthread -lboost_thread -D TAU_HEADERONLY -D TAU_CPP_03_COMPATIBILITY -I $LIBRARY_LOCATION main.cpp -o demo
ã芧ã®ãšãããããã€ãã®è¿œå ãã©ã¡ãŒã¿ãŒãã³ã³ãã€ã©ãŒã«æž¡ãããŸãã
- ã©ã€ãã©ãªãœãŒã¹ãžã®ãã¹ãå«ããïŒãªãã·ã§ã³-I $ LIBRARY_LOCATION ïŒ
- ããŒã¹ãã«å¿ èŠãªè¿œå ã©ã€ãã©ãª:: asioïŒãªãã·ã§ã³-lboost_system -pthread -lboost_thread ïŒ
- ãããžã§ã¯ãã§ã©ã€ãã©ãªãã³ã³ãã€ã«ããæ¹æ³ã瀺ãè¿œå ãã¯ãã®å®£èšïŒ -D TAU_HEADERONLY -D TAU_CPP_03_COMPATIBILITY ïŒ
ãã®ãªãã·ã§ã³ã»ããã¯æãäžè¬çãªãã«ããªãã·ã§ã³ã§ãããæå°éã®åŽåã§ã©ã€ãã©ãªããããžã§ã¯ãã«å«ããããšãã§ããŸãã
å¿ èŠã«å¿ããŠãããããã¹ãŠåãé€ãããšãã§ããŸãã ãããžã§ã¯ãå ã§ã©ã€ãã©ãªã䜿çšããå Žåã -I $ LIBRARY_LOCATIONããã³-D TAU_HEADERONLYãæå®ããå¿ èŠã¯ãããŸããã C ++ 11ãšäºææ§ã®ããã³ã³ãã€ã©ã®å Žåã -D TAU_CPP_03_COMPATIBILITYãªãã·ã§ã³ã¯äžèŠã§ãã boostãžã®äŸå:: asioã«ã¯ãããã¯ãŒã¯éšåã®ã¿ããããäŸåé¢ä¿ãªãã§éåžžã«ç°¡åã«æžãæããããšãã§ããŸãã
ã³ã³ãã€ã«ããã³èµ·ååŸããµãŒããŒã¯ããŒã12345ã§ãªãã¹ã³ãéå§ããŸãã
é»è©±ã§ã¯ã©ã€ã¢ã³ããèµ·åããæ¥ç¶ãäœæããŠæ¥ç¶ããã¡ãã»ãŒãžã衚瀺ããŸãã å€èŠ³ã¯æ¬¡ã®ãšããã§ãïŒPuTTYãä»ããŠãªã¢ãŒãã³ã³ãã¥ãŒã¿ãŒã§ãµãŒããŒãèµ·åããã¯ã©ã€ã¢ã³ãããšãã¥ã¬ãŒã¿ãŒã§èµ·åããŸããïŒã
ãµãŒããŒæ¥ç¶ã®äœæ

ãã®äŸã§ã¯ãã¯ã©ã€ã¢ã³ããšãµãŒããŒéã§è¿œå ã®éç¥ãéåä¿¡ããããšã¯ã§ããŸããã®ã§ã次ã®äŸã«é²ã¿ãŸãããã
äŸ2-ã·ã¹ãã ã®æ©èœã®ãã詳现ãªãã¢ã³ã¹ãã¬ãŒã·ã§ã³
ãã®äŸã§ã¯ããµãŒããŒã«ããã€ãã®ç°ãªãèŠçŽ ãè¿œå ãããããããéç¥ãåä¿¡ããæ¹æ³ãåŠã³ãç¶æ ãå€æŽããããŒãžãåãæ¿ããŸãã
ãµãŒããŒã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
é衚瀺ã®ããã¹ã
#include <tau/layout_generation/layout_info.h> #include <tau/util/basic_events_dispatcher.h> #include <tau/util/boost_asio_server.h> namespace { std::string const INITIAL_TEXT_VALUE("initial text"); tau::common::LayoutID const LAYOUT_ID("SAMPLE_LAYOUT_ID"); tau::common::LayoutPageID const LAYOUT_PAGE1_ID("LAYOUT_PAGE_1"); tau::common::LayoutPageID const LAYOUT_PAGE2_ID("LAYOUT_PAGE_2"); tau::common::ElementID const BUTTON_WITH_NOTE_TO_REPLACE_ID("BUTTON_WITH_NOTE_TO_REPLACE"); tau::common::ElementID const BUTTON_TO_RESET_VALUES_ID("BUTTON_TO_RESET_NOTES"); tau::common::ElementID const BUTTON_TO_PAGE_1_ID("BUTTON_TO_PG1"); tau::common::ElementID const BUTTON_TO_PAGE_2_ID("BUTTON_TO_PG2"); tau::common::ElementID const BUTTON_1_ID("BUTTON_1"); tau::common::ElementID const BUTTON_2_ID("BUTTON_2"); tau::common::ElementID const BUTTON_3_ID("BUTTON_3"); tau::common::ElementID const BUTTON_4_ID("BUTTON_4"); tau::common::ElementID const TEXT_INPUT_ID("TEXT_INPUT"); tau::common::ElementID const BOOL_INPUT_ID("BOOL_INPUT"); tau::common::ElementID const LABEL_ON_PAGE2_ID("LABEL_ON_PAGE2"); }; class MyEventsDispatcher : public tau::util::BasicEventsDispatcher { public: MyEventsDispatcher( tau::communications_handling::OutgiongPacketsGenerator & outgoingGeneratorToUse): tau::util::BasicEventsDispatcher(outgoingGeneratorToUse) {}; virtual void packetReceived_requestProcessingError( std::string const & layoutID, std::string const & additionalData) { std::cout << "Error received from client:\nLayouID: " << layoutID << "\nError: " << additionalData << "\n"; } virtual void onClientConnected( tau::communications_handling::ClientConnectionInfo const & connectionInfo) { std::cout << "Client connected: remoteAddr: " << connectionInfo.getRemoteAddrDump() << ", localAddr : " << connectionInfo.getLocalAddrDump() << "\n"; } virtual void packetReceived_clientDeviceInfo( tau::communications_handling::ClientDeviceInfo const & info) { using namespace tau::layout_generation; std::cout << "Received client information packet\n"; LayoutInfo resultLayout; resultLayout.pushLayoutPage(LayoutPage(LAYOUT_PAGE1_ID, EvenlySplitLayoutElementsContainer(true) .push(EvenlySplitLayoutElementsContainer(false) .push(BooleanInputLayoutElement(true).note(INITIAL_TEXT_VALUE).ID(BOOL_INPUT_ID)) .push(ButtonLayoutElement().note(INITIAL_TEXT_VALUE) .ID(BUTTON_WITH_NOTE_TO_REPLACE_ID))) .push(TextInputLayoutElement().ID(TEXT_INPUT_ID).initialValue(INITIAL_TEXT_VALUE)) .push(EmptySpace()) .push(EmptySpace()) .push(EmptySpace()) .push(EvenlySplitLayoutElementsContainer(false) .push(ButtonLayoutElement().note("reset notes").ID(BUTTON_TO_RESET_VALUES_ID)) .push(EmptySpace()) .push(ButtonLayoutElement().note("go to page 2").ID(BUTTON_TO_PAGE_2_ID) .switchToAnotherLayoutPageOnClick(LAYOUT_PAGE2_ID)) ) ) ); resultLayout.pushLayoutPage(LayoutPage(LAYOUT_PAGE2_ID, EvenlySplitLayoutElementsContainer(true) .push(EvenlySplitLayoutElementsContainer(false) .push(ButtonLayoutElement().note("1").ID(BUTTON_1_ID)) .push(ButtonLayoutElement().note("2").ID(BUTTON_2_ID))) .push(EvenlySplitLayoutElementsContainer(false) .push(ButtonLayoutElement().note("3").ID(BUTTON_3_ID)) .push(ButtonLayoutElement().note("4").ID(BUTTON_4_ID))) .push(EvenlySplitLayoutElementsContainer(true) .push(LabelElement("").ID(LABEL_ON_PAGE2_ID)) .push(ButtonLayoutElement().note("back to page 1").ID(BUTTON_TO_PAGE_1_ID))) )); resultLayout.setStartLayoutPage(LAYOUT_PAGE1_ID); sendPacket_resetLayout(resultLayout.getJson()); } virtual void packetReceived_buttonClick( tau::common::ElementID const & buttonID) { std::cout << "event: buttonClick, id=" << buttonID << "\n"; if (buttonID == BUTTON_TO_RESET_VALUES_ID) { sendPacket_updateTextValue(TEXT_INPUT_ID, INITIAL_TEXT_VALUE); } else if (buttonID == BUTTON_TO_PAGE_1_ID) { sendPacket_changeShownLayoutPage(LAYOUT_PAGE1_ID); } else if (buttonID == BUTTON_1_ID) { sendPacket_changeElementNote(LABEL_ON_PAGE2_ID, "Button 1 pressed"); } else if (buttonID == BUTTON_2_ID) { sendPacket_changeElementNote(LABEL_ON_PAGE2_ID, "Button 2 pressed"); } else if (buttonID == BUTTON_3_ID) { sendPacket_changeElementNote(LABEL_ON_PAGE2_ID, "Button 3 pressed"); } else if (buttonID == BUTTON_4_ID) { sendPacket_changeElementNote(LABEL_ON_PAGE2_ID, "Button 4 pressed"); } } virtual void packetReceived_layoutPageSwitched( tau::common::LayoutPageID const & newActiveLayoutPageID) { std::cout << "event: layoutPageSwitch, id=" << newActiveLayoutPageID << "\n"; } virtual void packetReceived_boolValueUpdate( tau::common::ElementID const & inputBoxID, bool new_value, bool is_automatic_update) { std::cout << "event: boolValueUpdate, id=" << inputBoxID << ", value=" << new_value << "\n"; } virtual void packetReceived_textValueUpdate( tau::common::ElementID const & inputBoxID, std::string const & new_value, bool is_automatic_update) { std::cout << "event: textValueUpdate, id=" << inputBoxID << ",\n\tvalue=" << new_value << "\n"; sendPacket_changeElementNote(BOOL_INPUT_ID, new_value); sendPacket_changeElementNote(BUTTON_WITH_NOTE_TO_REPLACE_ID, new_value); } }; int main(int argc, char ** argv) { boost::asio::io_service io_service; short port = 12345; tau::util::SimpleBoostAsioServer<MyEventsDispatcher>::type s(io_service, port); std::cout << "Starting server on port " << port << "...\n"; s.start(); std::cout << "Calling io_service.run()\n"; io_service.run(); return 0; }
åã®äŸããã®ãã¹ãŠã®å€æŽã¯ã MyEventsDispatcherã¯ã©ã¹ã§è¡ãããŸããã 次ã®ã¯ã©ã€ã¢ã³ãã€ãã³ããã³ãã©ã¡ãœãããè¿œå ãããŸããã
- packetReceived_buttonClickãã¿ã³ã€ãã³ããã³ãã©ãŒ ã ãã¿ã³IDã¯ããã©ã¡ãŒã¿ãŒãšããŠã¡ãœããã«æž¡ãããŸãã
- ã¯ã©ã€ã¢ã³ããããµãŒããŒã«å€æ°å€ã転éãããã±ããã®ãã³ãã©ãŒïŒ packetReceived_boolValueUpdateãpacketReceived_intValueUpdateãpacketReceived_floatPointValueUpdateãpacketReceived_textValueUpdate
- packetReceived_layoutPageSwitchedèŠçŽ ãæã€è¡šç€ºããŒãžã®å€æŽã€ãã³ãã®ãã³ãã©ãŒ
ããã«ãæ¥ç¶æã«ã¯ã©ã€ã¢ã³ãã«éä¿¡ãããã¬ã€ã¢ãŠããããã«å¿ããŠå€æŽãããŸããã
ãã¢ãããã®ã§ããã³ãã©ãŒå ã®ã³ãŒãã¯å¯èœãªéãã·ã³ãã«ã§ããã€ãã³ãã«é¢ããæ å ±ãã³ã³ãœãŒã«ã«ãã³ãããã¯ã©ã€ã¢ã³ãã«ããŸããŸãªã³ãã³ããéä¿¡ããŸãã
ãã¹ãŠã®ã³ãã³ãã¯packetReceived_buttonClickïŒïŒãã¿ã³ãã³ãã©ãŒããã¯ã©ã€ã¢ã³ãã«éä¿¡ãããŸãïŒãã¡ãããããã¯ããã§è¡ãå¿ èŠã¯ãããŸããããããç°¡åã§èŠèŠçã§ãïŒã
åã³ãã³ãã¯ããµãŒããŒããã¯ã©ã€ã¢ã³ãã«éä¿¡ããããã±ããã«å¯Ÿå¿ããŠããŸãã ãããã®ããã±ãŒãžã®åœ¢æãšéä¿¡ã¯ã BasicEventsDispatcherã§å®çŸ©ãããç¹å¥ãªã¡ãœãããåŒã³åºããããšãã«çºçããŸãã
- sendPacket_resetLayoutïŒïŒ -ã¬ã€ã¢ãŠãå šäœã®çœ®æ
- sendPacket_requestValueïŒïŒ -å ¥åã®1ã€ã§å€æ°å€ãèŠæ±ãã
- sendPacket_updateBooleanValueïŒïŒãsendPacket_updateIntValueïŒïŒãsendPacket_updateFloatPointValueãsendPacket_updateTextValueïŒïŒ -å ¥åã®å€æ°ã®å€ãå€æŽãã
- sendPacket_changeElementNoteïŒïŒ -èªã¿åãå°çšããã¹ãïŒãã¿ã³ããã§ãã¯ããã¯ã¹ãã©ãã«ã®ããã¹ãïŒãå€æŽããŸã
- sendPacket_changeShownLayoutPageïŒïŒ -èŠçŽ ãæã€å¥ã®ããŒãžã«åãæ¿ããŸã
- sendPacket_changeElementEnabledStateïŒïŒ -èŠçŽ ã®ã¢ã¯ãã£ããªç¶æ ãåãæ¿ããŸãïŒéã¢ã¯ãã£ããªèŠçŽ ã¯è¡šç€ºãããŸãããçžäºäœçšããããšã¯ã§ããŸããïŒ
ãã®äŸã®ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
UIèŠçŽ ã䜿çšããäœæ¥ã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³

ã芧ã®ãšãããã¯ã©ã€ã¢ã³ãããã€ã¹äžã®åã¢ã¯ã·ã§ã³ã«å¯ŸããŠã察å¿ããã³ãŒãããµãŒããŒäžã§å®è¡ãããŸãã ãŠãŒã¶ãŒå ¥åèŠçŽ ã®å€ãå€æŽããããšããµãŒããŒã¯ãã®èŠçŽ ã®å€æ°ã®æ°ããå€ã«é¢ããéç¥ãåãåããŸãã ãã¿ã³ã¯ãªãã¯ãã³ãã©ã§ã¯ãããŸããŸãªãã±ããããµãŒããŒããã¯ã©ã€ã¢ã³ãã«éä¿¡ãããŸãïŒãã±ããã®ã¿ã€ãã¯ãã©ã®ãã¿ã³ãæŒããããã«ãã£ãŠç°ãªããŸãïŒã ãã®äŸã§ã¯ãããŒãžåãæ¿ãã®ä»çµã¿ã瀺ããŠããŸãã ããŒãžã³ã°ã¬ã€ã¢ãŠãã䜿çšãããšãæ©èœã«å¿ããŠèŠçŽ ãã°ã«ãŒãåã§ããŸãã ã¯ã©ã€ã¢ã³ãã®ç»é¢ã«ã¯åžžã«1ã€ã®ããŒãžã®ã¿ã衚瀺ããããããã€ã³ã¿ãŒãã§ãŒã¹ã®è² è·ã軜æžãããŸãã
äŸ3-圹ã«ç«ã€ãã®
ä»æ¥ã®æåŸã®äŸã¯ããã®ãããžã§ã¯ããéå§ããã¿ã¹ã¯ã®1ã€ã®éšåçãªå®è£ ã§ãã ããã¯ãWindowsçšã®æãåçŽãªããŒããŒãå ¥åãšãã¥ã¬ãŒã¿ãŒã§ãïŒ sendInputïŒïŒ winapié¢æ°ã䜿çšããŸãïŒã
ãã®äŸã®ã³ãŒãã¯ãç§ã®githubã«ãããŸãã ããã§ã¯èª¬æããŸããã2çªç®ã®äŸãšæ¯èŒããŠãã©ã€ãã©ãªã®äœ¿çšã«é¢ããæ°ããããšã¯ç€ºããŸããã ããã§ã¯ã圌ã®äœåã®ãã¢ã®ã¿ãæäŸããŸãã
ããŒããŒããšãã¥ã¬ãŒã·ã§ã³

ãã®äŸã®ã³ãŒãã¯ãããè€éãªããŒããŒããšãã¥ã¬ãŒã·ã§ã³ã¿ã¹ã¯ã«ç°¡åã«æ¡åŒµã§ããŸãã
ãšãããŒã°
çµè«ã§ã¯ãªããã³ãã¥ããã£ã«èšŽãããã åæ§ã®ã·ã¹ãã ãå¿ èŠã§ããïŒ å¥ã®èªè»¢è»ãçºæããŠããŸããïŒ ãã詳现ã«èª¬æããå¿ èŠãããã®ã¯äœã§ããïŒ ã©ã®æ¹åã«ããã«çºå±ããå¿ èŠããããŸããïŒ
ããã§ã次ã®éçºãã¹ãæãæµ®ãã³ãŸãïŒãããã¯ã»ãŒå®å šã«çŽäº€ããŠãããããåªå é äœãä»ããããšæããŸãïŒã
- ä»ã®ãã©ãããã©ãŒã ïŒIOSãPCïŒã®ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãè¿œå ãã
- ããŒã¿è»¢éãããã³ã«ã®æ©èœãæ¡åŒµããïŒæ¥ç¶ç£èŠçšã®ããŒãããŒããã±ãããéä¿¡å¶åŸ¡ã³ãã³ãïŒ
- æ°ããUIèŠçŽ ïŒããããããŠã³ããã¯ã¹ãç»åãªã©ïŒã®è¿œå
- ã¯ã©ã€ã¢ã³ãäžã®èŠçŽ ã®å€èŠ³ïŒè²ããã©ã³ããã¹ã¿ã€ã«ïŒã®ããæ·±ãã«ã¹ã¿ãã€ãº
- ããå ·äœçãªã¯ã©ã€ã¢ã³ãããã€ã¹æ©èœïŒéç¥ãã»ã³ãµãŒãé³éãã¿ã³ãªã©ïŒã®ãµããŒã
- ä»ã®ããã°ã©ãã³ã°èšèªçšã®ãµãŒããŒã©ã€ãã©ãªã®è¿œå
ããã«ãçŸåšã®ç¶æ ã®ã©ã€ãã©ãªã®ã¢ãŒããã¯ãã£ãšå®è£ ã«ã€ããŠã®æ¹å€ãèããŠããããã§ãã
åç §ïŒ