ããããã¹ã¬ããã«ã¯ä»£æ¿æ段ããããŸãã ç§ã«ç¥ãããŠãã-俳åªïŒä¿³åªïŒãšãœãããŠã§ã¢ãã©ã³ã¶ã¯ã·ã§ã³ã¡ã¢ãªã®ã¢ãã«ã ã¿ã€ãã«ããæãããªããã«ããã®èšäºã®ããŒããŒãæåã§ãã ããããããªãã®å¥œå¥å¿ãæºããSTMã«é¢ããã€ã³ã¿ãŒãããäžã®èšäºã¯éåžžã«å€ããããŸãã
ã¢ã¯ã¿ãŒã¢ãã«ãšã¯äœã§ããïŒ
ã€ã³ã¿ãŒãããã«ã¯ãã¢ã¯ã¿ãŒã¢ãã«ãžã®åç §ããããããããŸãã ãããã£ãŠãæŽå²ãã¢ããªã±ãŒã·ã§ã³ã䜿çšãã¿ãŒã³ã«ã¯è§Šããã«ãã¢ã¯ã¿ãŒãšã¯äœãã«ã€ããŠã®ã¿èšè¿°ããŸãã
ãããã£ãŠãã¢ã¯ã¿ãŒã¯æ¬¡ã®ãããªãªããžã§ã¯ãã§ãã
- ç¶æ ãäºãã«å ±æããªãã§ãã ããã
- éåæã¡ãã»ãŒãžãéä¿¡ããããšã«ãã£ãŠã®ã¿çžäºäœçšããŸãã
- ã¢ã¯ã¿ãŒã¯2ã€ã®ã¡ãã»ãŒãžãåæã«åŠçããŸããã 代ããã«ãã¢ã¯ã¿ãŒã¯åä¿¡ããã¡ãã»ãŒãžããã¥ãŒã«åéããé çªã«åŠçããŸãã
ã¢ã¯ã¿ãŒã¯ãJMSãActiveMQãMSMQãªã©ã®ããŸããŸãªã¡ãã»ãŒãžãã¥ãŒã·ã¹ãã ãéåžžã«é£æ³ãããŸãã ããã«ãå€ãã®GUIãã¬ãŒã ã¯ãŒã¯ã§ã¯ãã¢ã¯ã¿ãŒãªã©ã®ã³ã³ãããŒã«ã¯ãéåæã¡ãã»ãŒãžã䜿çšããŠäºãã«å¯Ÿè©±ããŸãã
åæ£ã³ã³ãã¥ãŒãã£ã³ã°
䞊åã³ã³ãã¥ãŒãã£ã³ã°ã§ãåãç©çãã·ã³äžã§èšç®ãå転ããŠãããšæ³åããå¿ èŠãããã®ã¯ãªãã§ããïŒ ãŸããã¯ã©ã¹ã¿ãŒãããå Žåã¯ã©ããªããŸããïŒ è² è·ã®é«ããããžã§ã¯ãã®å Žåãããã¯ç¹ã«åœãŠã¯ãŸããŸãã é ããæ©ããããããã¯1å°ã®ãã·ã³ã®å¢çã«æ²¿ã£ãŠäŒã¿ãŸãã ãã®å Žåã®ãããŒã¢ãã«ã¯ãŸã£ããé©åããŸããã ã¹ã¬ããã«ã¯å ±æã¡ã¢ãªããããŸãã åæ£ã·ã¹ãã ã®å Žåã«é¡äŒŒãããã®ãå®è£ ããããšãããšãããŒãéã®ããŒã¿ã®åæã«åé¡ãçºçããŸããç°ãªãããŒãã§å®è¡ãããŠããã¹ã¬ããã¯å ±æã¡ã¢ãªãæã£ãŠããããã«èŠããããã§ãã ããããã¢ã¯ã¿ãŒã¯ãéåæã¡ãã»ãŒãžãä»ããŠã®ã¿äºãã«ââ察話ããŸããéåæã¡ãã»ãŒãžã¯ããããã¯ãŒã¯ãä»ããŠé©åã«éä¿¡ãããŸãã
ã¢ã¯ã¿ãŒã«ã¯ãåæ£ã³ã³ãã¥ãŒãã£ã³ã°ã®å¥ã®å©ç¹ããããŸãã ãªããªã ã¢ã¯ã¿ãŒã¯èªåã®ç¶æ ã誰ãšãå ±æããŸãã;ãã®ç¶æ èªäœã¯ãããŒãéã®ã·ãªã¢ã«åãšè»¢éãç°¡åã§ãã äžæ¹ããã¹ãŠã®ã¡ãã»ãŒãžã¯éåæã«é ä¿¡ããããããã¢ã¯ã¿ãŒã¯ã¡ãã»ãŒãžã«å³åº§ã«å¿çããå¿ èŠã¯ãããŸããããããã£ãŠãã¢ã¯ã¿ãŒãç¶æ ã®ã·ãªã¢ã©ã€ãº/ãã·ãªã¢ã©ã€ãºã«æéãè²»ãããã¡ãã»ãŒãžã®åŠçãçæé延æããããšã¯æ£åžžã§ãã
æ¢åã®å®è£
åŸæ¥ãã¢ã¯ã¿ãŒã¢ãã«ã¯ãã¢ã¯ã¿ãŒããã€ãã£ãã«ãµããŒããããŠããErlangããã³Scalaã®ããã°ã©ããŒã«æãããŠããŸãã Javaãå«ãããŸããŸãªèšèªçšã®ã©ã€ãã©ãªããããæãæåãªãã®ã¯Akkaã§ãã ããã«ã¯ããã®ã©ã€ãã©ãªã®æŠèŠããããŸãã
ããããAkkaãæã£ãŠããŠãã俳åªããµããŒãããããã®ç¬èªã®ã©ã€ãã©ãªãäœæããããšã¯æããŸããã§ããã ãªããããå¿ èŠãªã®ãã以äžã§èª¬æããŸãã ãããŸã§ã®éãç§ã¯å³æžé€šã§ä¿³åªãã©ã®ããã«åããããèŠãããŸãã
nop.actors
ãã¬ãŒã ã¯ãŒã¯ã«ã¢ã¯ã¿ãŒãµããŒããå®è£ ããŸããã ãã®ã¡ã«ããºã ã¯ãAkkaã®åæå®ãããã¢ã¯ã¿ãŒã«äŒŒãŠãããéåæã¡ãã»ãŒãžã®åãæž¡ãã®ã¿ããããŸãã
俳åªãã©ã®ããã«èª¬æããŸããïŒ ãã®ããã«ã¯ãã€ã³ã¿ãŒãã§ãŒã¹ãèšè¿°ããå¿ èŠããããŸãã ã¢ã¯ã¿ãŒãšå®è£ ã«ãã£ãŠåŠçãããã¡ãã»ãŒãžã®ã»ãããã€ãŸã å®éã«ã¡ãã»ãŒãžãåŠçããŸãã ãã¿ãŒã³ãããã³ã°ããµããŒããããŠããèšèªã§é¡äŒŒç¹ãæç»ããå Žåãã€ã³ã¿ãŒãã§ã€ã¹ã®èšè¿°ã¯ä»£æ°å宣èšãšåçã§ãããå®è£ ã¯ãã¿ãŒã³ãããã³ã°èªäœãšåçã§ãã 俳åªã®èª¬æã®äŸã次ã«ç€ºããŸãã
@Actor public interface Pingable { void ping(String token, Pinger pinger); }
@Actor public interface Pinger { void pong(String token); }
public class DefaultPingable implements Pingable { @Override public void ping(String token, Pinger pinger) { System.out.println("Pinging with: " + token); pinger.pong(token); } }
ãããŠããããã©ã®ããã«äœ¿çšããããã§ãïŒ
Pingable pingable = Actors.wrap(Pingable.class, new DefaultPingable()); pingable.ping("hello", new Pinger() { @Override public void pong(String a) { System.out.println("Ping received: " + a); } });
åŒæ°ã§æž¡ãããããŒã¿ã«ã¯ç¹å®ã®å¶éããããŸãã éå ¬åŒã«ã¯ãããªããã£ããPOJOãä»ã®ã¢ã¯ã¿ãŒããã³ãªã¹ãã®ã¿ã転éã§ããããã«ç解ã§ããŸãã æ£åŒã«ã¯ã次ã®ããã«èšè¿°ãããŸãã Sãã¡ãã»ãŒãžã§éä¿¡ããããã¹ãŠã®ã¿ã€ãã®ã»ãããšããŸãã 次ã«ïŒ
- ããªããã£ãåãšã©ãããŒã¯ã©ã¹ã¯Sã«å«ãŸããŠããŸãã
- ã¢ã¯ã¿ãŒã¢ãããŒã·ã§ã³ã§ããŒã¯ãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã¹ãŠSã«å«ãŸããŸãã
- åæåã¯ãã¹ãŠSã§ãã
- ãªã¹ã<T>ãã»ãã<T>ãT [] TãSã«å ¥ãå Žåã¯Sãå ¥åãã
- åãã£ãŒã«ãã®ã¿ã€ããSã§ããå Žåããã©ã€ããŒããã£ãŒã«ããšãããã®ããããã®ã¢ã¯ã»ãµã¡ãœããã®ãã¢ã§æ§æãããã¯ã©ã¹ã¯ãã¹ãŠSã«å«ãŸããŸãã
次ã«ãHTTPãããã³ã«ãä»ããŠã¢ã¯ã¿ãŒããªã¢ãŒãã§äœ¿çšå¯èœã«ããæ¹æ³ãèŠãŠã¿ãŸãããã ãããè¡ãããã«ãnopã«çµ±åããããã¬ãŒã ã¯ãŒã¯ã䜿çšããã¡ã«ããºã ããããŸãã ã¢ã¯ã¿ãŒããªã¢ãŒãã§ã¢ã¯ã»ã¹å¯èœã«ããã«ã¯ãActorManagerãªããžã§ã¯ãã§exportActorã¡ãœãããåŒã³åºãå¿ èŠããããŸãã ActorManagerã¯ãäŸåæ§æ³šå ¥ãéããŠååŸã§ããŸãã
public class PingController { private ActorManager actorManager; @Injected public PingController(ActorManager actorManager) { this.actorManager = actorManager; } public Content pingDemo() { ActorInfo fooInfo = actorManager.exportActor(new DefaultPingable()); // , hello // ... } }
ãã¡ãããnopãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠæäŸãããæ©èœãå šäœãšããŠäœ¿çšããå¿ èŠã¯ãããŸããã ãã¹ãŠã®äŸåé¢ä¿ããã©ãã°ããå¿ èŠããªãå Žåã¯ãHttpActorDispatcherã¯ã©ã¹ããµãŒãã¬ããã«é 眮ããã ãã§ååã§ãã
ãã©ãŠã¶åŽã®ã¢ã¯ã¿ãŒ
ãªã¹ããããŠããã¢ã¯ã¿ãŒã®ããããã£ã¯ãã¢ã¯ã¿ãŒããã©ãŠã¶ãŒãšWebãµãŒããŒã®éã§åæ¹åã«ããŒã¿ãç©æ¥µçã«äº€æããå¿ èŠãããWebã¢ããªã±ãŒã·ã§ã³ã«æé©ã§ããããšã瀺åããŠããŸãã ããããããã«ã¯JavaScriptã®ã¢ã¯ã¿ãŒã¢ãã«ã®ãµããŒããå¿ èŠã§ãã ãããŠåœŒå¥³ã¯nop.actorsã«ããŸãïŒ
ãã©ãŠã¶èªäœã®å éšã§ã®ã¿ã¢ã¯ã¿ãŒãååŸããå Žåããã¹ãŠãã·ã³ãã«ã«ãªããŸãã ãŸããã¢ã¯ã¿ãŒã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãã¢ã¯ã¿ãŒåŒã³åºãã§ã©ããããå¿ èŠããããŸãã 次ã«ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãã¢ã¯ã¿ãŒã«ããã«ã¯ãã¢ã¯ã¿ãŒã¡ãœããã§ã©ããããå¿ èŠããããŸãã Pingerã¢ã¯ã¿ãŒã®äŸã§ã¯ã次ã®ããã«ãªããŸãã
DefaultPinger = actor(function(elem) { this.elem = elem; }); DefaultPinger.prototype.pong = function(token) { var messageElem = document.createElement("div"); messageElem.textContent = token; this.elem.appendChild(messageElem); }
var pinger = actor(new DefaultPinger(document.getElementById("pingResult"))); pinger.pong("hello");
ãã©ãŠã¶åŽã®ã¢ã¯ã¿ãŒãšWebãµãŒããŒåŽã®ã¢ã¯ã¿ãŒã®çžäºäœçšã確å®ã«ãããå Žåã¯ãJavaScriptã§ã€ã³ã¿ãŒãã§ãŒã¹ãèšè¿°ããå¿ èŠããããŸãã ãã®äŸã§ã¯ã説æã¯æ¬¡ã®ããã«ãªããŸãã
Pingable = {}; Pinger = {}; Pingable.ping = ["value", actorRef(Pinger)]; Pinger.pong = ["value"];
ããã§ã®äžè¬ååã¯ããã§ãã ã¢ã¯ã¿ãŒãšéä¿¡ããããã«å¿ èŠãªãããã³ã«ã¯ããªããžã§ã¯ããšããŠèšè¿°ãããŸãã ãªããžã§ã¯ãã®ããããã£ã¯ãã¢ã¯ã¿ãŒã«ãã£ãŠåŠçãããã¡ãã»ãŒãžã«å¯Ÿå¿ããŠããŸãã ããããã£ã®å€ã¯åžžã«ãã¡ãã»ãŒãžãšãšãã«æž¡ãããåŒæ°ã®ã¿ã€ãããªã¹ãããé åã§ãªããã°ãªããŸããã ãã¬ãŒã ã¯ãŒã¯ã¯ã次ã®ã¿ã€ãã®åŒæ°ãç解ããŸãã
- æååãå€ãã¯ãä»»æã®ããªããã£ãåãŸãã¯åæåãšäžèŽããŸãã
- actorRefïŒAïŒãããã§Aã¯ã¢ã¯ã¿ãŒã®èª¬æã§ãã
- 1ã€ã®èŠçŽ Aã®é åã¯ãåŒæ°ãã¿ã€ãAã®èŠçŽ ãæã€ã³ã¬ã¯ã·ã§ã³ã§ããããšã瀺ããŸãã
- ä»»æã®ãªããžã§ã¯ãã¯POJOãæå³ãããªããžã§ã¯ãã®ããããã£ã®å€ã¯POJOããããã£ã®ã¿ã€ãã瀺ããŸãã
ActorRemotingã¯ã©ã¹ã¯ããªã¢ãŒãã¢ã¯ã¿ãŒã®æäœãæ åœããŸãã ã¯ã©ã¹ãåæåããŠäœ¿çšããäŸã次ã«ç€ºããŸãã
var remoting = new ActorRemoting("/actors/" + sessionId); var pingable = remoting.importActor(Pingable, nodeId, actorId); remoting.start(pregable.ping("hello", pinger);
ãã¡ããããµãŒããŒã¯ãŸãã»ãã·ã§ã³IDãããŒãIDãããã³ã¢ã¯ã¿ãŒIDããã©ãŠã¶ãŒã«äœããã®æ¹æ³ã§æž¡ãå¿ èŠããããŸãã ããšãã°ããããã®å€æ°ãåæåããJavaScriptã³ãŒããããŒãžã«è¿œå ããããšã§ãããŒãžãçæãããšãã«ãããè¡ãããšãã§ããŸãã
å®å šãªäŸ
äžèšã§ã¯ããµãŒããŒåŽãšãã©ãŠã¶åŽã®äž¡æ¹ã§nopã«ã¢ã¯ã¿ãŒã¢ãã«ãå®è£ ããããšã«ã€ããŠèª¬æããŸããã ãã ããåœé¢ã¯ãããããã¹ãŠã1ã€ã®å°ããªã¢ããªã±ãŒã·ã§ã³ã«ãŸãšããæ¹æ³ã«ã€ããŠã¯é»ã£ãŠããŸããã ãã®ããã次ã®ã¯ã©ã¹ãå¿ èŠã§ãã
@Route(prefix = "pingpong") public interface PingRoute { @RoutePattern("/") String main(); }
@RouteBinding(PingRoute.class) public class PingController extends AbstractController { private ActorManager actorManager; @Injected public PingController(ActorManager actorManager) { this.actorManager = actorManager; } public Content main() { ActorInfo pingInfo = actorManager.exportActor(Pingable.class, new DefaultPingable()); return html(createView(PingView.class).setActorInfo(pingInfo)); } }
public class PingView extends Template { PingView setActorInfo(ActorInfo actorInfo); }
@ModuleRequires(modules = ActorsModule.class) public class PingModule extends AbstractModule { @Override public void load() { app.loadPackage(PingModule.class.getPackage().getName()); } }
ããã«ã次ã®å 容ã®PingView.xmlãã³ãã¬ãŒããè¿œå ããå¿ èŠããããŸãã
<?xml version="1.0" encoding="UTF-8"?> <t:template xmlns:t="http://nop.org/schemas/templating/core"> <t:head> <t:parameter name="actorInfo"/> <t:service name="actorsRoute" class="org.nop.actors.ActorsRoute"/> </t:head> <t:body> <html> <head> <title>A simple actors example</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <script src="${actorsRoute.resource('actors.js')}" type="text/javascript"/> </head> <body> <div> <input type="text" id="argument"/> <button id="pingButton" type="button">Ping</button> </div> <div id="pingResult"/> <script> Pingable = {}; Pinger = {}; Pingable.ping = ["value", actorRef(Pinger)]; Pinger.pong = ["value"]; DefaultPinger = actor(function(elem) { this.elem = elem; }); DefaultPinger.prototype.pong = function(token) { var messageElem = document.createElement("div"); messageElem.textContent = token; this.elem.appendChild(messageElem); } var pinger = actor(new DefaultPinger( document.getElementById("pingResult"))); var remoting = new ActorRemoting("/actors/${actorInfo.sessionId}"); var pingable = remoting.importActor(Pingable, ${actorInfo.nodeId}, ${actorInfo.actorId}); remoting.start(); var argumentElem = document.getElementById("argument"); document.getElementById("pingButton").onclick = function() { pingable.ping(argumentElem.value, pinger); } </script> </body> </html> </t:body> </t:template>
ããã«å®è¡ã§ãããµã³ãã«ã¯ãã¡ãããããŠã³ããŒãã§ããŸã ã
俳åªã®ãã§ã¹
ããã§ã¯ããã¹ãŠãæããã§ããããã«æãããŸãã3人ã®ä¿³åªãã²ãŒã ã«åå ããŠããŸãïŒ2人ã®ãã¬ã€ã€ãŒãš1ã€ã®ç«¶æå Ž æåŸã®ä¿³åªã¯ããã¬ãŒã€ãŒã®åãããã§ãã¯ããäºãã®åããéç¥ããŸãã ãããã£ãŠããã®ãããªã€ã³ã¿ãŒãã§ãŒã¹ã«ã€ããŠæžãããšãã§ããŸãïŒ
@Actor public interface Board { void registerPlayer(Player player, PieceColor color); void move(Player player, BoardLocation source, BoardLocation destination); }
@Actor public interface Player { void moveRejected(); void moved(BoardLocation source, BoardLocation destination); }
ããŒãã®å®è£ ã¯ããã¬ã€ã€ãŒãééã£ãåããããããæééãã«è¡ããªãã£ãå Žåãæããã«moveRejectedã¡ãã»ãŒãžããã¬ãŒã€ãŒã«éãè¿ããŸãã 移åããã¡ãã»ãŒãžã¯äž¡æ¹ã®ãã¬ã€ã€ãŒã«éä¿¡ãããŸãã æ©è¡è ãž-移åã®ç¢ºèªã®ãµã€ã³ãšããŠã察æŠçžæãž-察æŠçžæã®é²æç¶æ³ã®éç¥ãšããŠã
ããã¯ãŸãã«ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãéåžžã«çŽ æŽã«ãªã£ãŠãããšããããšã§ãã èªåã§ç§»åãããã¬ã€ã€ãŒã¯ã誰ã«ä»£ãã£ãŠç§»åãè¡ããããã瀺ããŸãã æ»æè ã¯ãããç¥ããªããã¡ã«äœ¿çšã§ããŸãã ããã«ãäœããã®çç±ã§ã俳åªãã¬ãŒã€ãŒã®1人ããåãããå Žåã圌ã¯ã²ãŒã ã®ç¶æ ã埩å ããæ¹æ³ããããŸããã ããã§ããããã®æ¬ ç¹ãå æããããã«æ¬¡ã®ã€ã³ã¿ãŒãã§ãŒã¹ãäœæããŸãã
@Actor public interface Board { void authorizePlayer(PlayerObserver observer, String key); }
@Actor public interface Player { void move(BoardLocation source, BoardLocation destination, PieceType promotedType); }
@Actor public interface PlayerObserver { void authorizationAccepted(PieceColor color, Player player); void authorizationRejected(); void moveRejected(); void boardStateChanged(BoardState state); void moved(BoardLocation source, BoardLocation destination); }
ãããèµ·ãã£ãããšã§ãã ããã§ããã¬ãŒã€ãŒã¯PlayerObserverã€ã³ã¿ãŒãã§ã€ã¹ã®èåŸã«é ããŠããŸãã ãããŠã競æå Žã¯1人ã®ããŒããš1人ã®ãã¬ãŒã€ãŒã§è¡šãããŸãã ãã¬ã€ã€ãŒã¯ãç¹å®ã®ãã¬ã€ã€ãŒãå©çšã§ãã競æå Žã®äžçš®ã§ãã ã²ãŒã ã«å ¥ããšãã¢ã¯ã¿ãŒãã¬ãŒã€ãŒã¯ã²ãŒã ãã£ãŒã«ãã«ãã¹ã¯ãŒããéç¥ããèªåãžã®ãªã³ã¯ãéä¿¡ããŸãã authorizationAcceptedã¡ãã»ãŒãžã®åœ¢åŒã§ã競æå Žãã確èªãåãåããŸãã ããã«ãã²ãŒã ã«æ¥ç¶ããããšã«ãããã¢ã¯ã¿ãŒã¯ã¡ãã»ãŒãžboardStateChangedã®åœ¢åŒã§çŸåšã®ç«¶æå Žã®ã¹ããŒã¿ã¹ãåãåããŸãã
Playerã¢ã¯ã¿ãŒãšBoardã¢ã¯ã¿ãŒã®äž¡æ¹ãäºãã«ç¶æ ãå ±æããå¿ èŠãããããšã«æ³šæããŠãã ããã æ¬åœã«ããã§ããnopã¯ããããµããŒãããŠããŸãã ããã¯ãããŸããŸãªè§åºŠããèŠãããšãã§ãã1ã€ã®ä¿³åªã§ãããšèšããŸãã authorizePlayerã®ã¡ãã»ãŒãžåŠçã¯ãå®éã«ã¯æ¬¡ã®ããã«ãªããŸãã
@Override public void authorizePlayer(PlayerObserver observer, String key) { boolean matches = false; for (PlayerImpl player : players.values()) { if (player.token.equals(key)) { observer.authorizationAccepted(player.color, player); sendFullState(observer); player.setPlayerObserver(observer); updateObserverList(); matches = true; break; } } if (!matches) { observer.authorizationRejected(); } } private void sendFullState(PlayerObserver observer) { BoardState state = new BoardState(); // . // ... observer.boardStateChanged(state); }
ããã§ã¯ãããŒããã¡ãã»ãŒãžãåŠçããŠããéããã¬ã€ã€ãŒã¯ãªãã¶ãŒããŒã«æž¡ãããŸãã ãªããªã ãã¬ãŒã€ãŒã¯æããã«ã¢ã¯ã¿ãŒã«ãªã£ãŠããªãããããã¬ãŒã ã¯ãŒã¯ã¯èªåçã«ãããäœæããåæã«ããŒããšããŒãžããŸãã å®éãä»ãšå ±éã®ç¶æ ãæããªãæ°ããã¢ã¯ã¿ãŒãäœæããã«ã¯ãActors.wrapã䜿çšããŠæ瀺çã«ã¢ã¯ã¿ãŒã«ããå¿ èŠããããŸãã
ããŒã/ãã¬ãŒã€ãŒã®å®å šãªã¢ã¯ã¿ãŒã³ãŒãã¯ãã¡ãã«ãããŸã ã
JavaScriptã®äžéšã®å Žåãã¢ã¯ã¿ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®èª¬æãå¿ èŠã§ãã ããã¯æ¬¡ã®ãããªãã®ã§ãã
Board = {}; Player = {}; PlayerObserver = {}; BoardLocation = { row : "value", column : "value" }; PieceState = { type : "value", color : "value", location : BoardLocation }; Move = { source : BoardLocation, destination : BoardLocation, piece : "value", capturedPiece : "value" }; BoardState = { moves : [Move], pieces : [PieceState] }; Board.authorizePlayer = [actorRef(PlayerObserver), "value"]; Player.move = [BoardLocation, BoardLocation]; PlayerObserver.authorizationAccepted = ["value", actorRef(Player)]; PlayerObserver.authorizationRejected = []; PlayerObserver.moveRejected = []; PlayerObserver.boardStateChanged = [BoardState]; PlayerObserver.moved = [BoardLocation, BoardLocation];
PlayerObserverã®å®è£ ã¯ããµãŒããŒããã¡ãã»ãŒãžãå±ããšããŒãžãåæç»ãããã¬ãŒã€ãŒããã£ã®ã¥ã¢ã移åãããšãµãŒããŒã«ã¡ãã»ãŒãžãéä¿¡ããŸãã
ãã©ãŠã¶ã¢ã¯ã¿ãŒã®å®å šãªå®è£ ã¯ã ããããå ¥æã§ããŸã ã
ãã§ã¹ã®äŸã¯ããã¢ã¢ããªã±ãŒã·ã§ã³ãšããŠnopãã¬ãŒã ã¯ãŒã¯ã®é åžã«å«ãŸããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯/ demo / chessãã©ã«ããŒã«ãããŸãã å®æãããµãŒãã¹ãäžããŸããã
ã¡ãªãã
ééçãªã¡ãã»ãŒãžã³ã°ãå®çŸã§ããããšã«å ããŠãnop.actorsã¯æ¬¡ã®ããšãå®è¡ã§ããŸãã
ãŸãããã¬ãŒã ã¯ãŒã¯ã¯å®å šã«ã¢ãžã¥ãŒã«åãããŠããŸãã ããã»ã¹å ã®ã¢ã¯ã¿ãŒã®ã¡ã«ããºã ã®å®è£ ããããŸãã ããã»ã¹å ã®ã¢ã¯ã¿ãŒã®äžã«ãªã¢ãŒãã¢ã¯ã¿ãŒã®å®è£ ãããããã®å®è£ ã¯ä»»æã®ãã©ã³ã¹ããŒãã䜿çšã§ããŸãã
第äºã«ãããŒãžã§ã³3.0ã®ãµãŒãã¬ããã䜿çšãããã³ã°ããŒã«ãªã¯ãšã¹ãã®éåæåŠçã 1000ã®ã¯ã©ã€ã¢ã³ãããµãŒããŒã«æ¥ç¶ããŠããå Žåãããã¯äœãããªã1000ã®ã¹ã¬ãããäœæããããšãæå³ããŸããã
第äžã«ãã·ã¹ãã ã¯èªåçã«ã¢ã³ããŒãããã¢ã¯ã¿ãŒããã£ã¹ã¯ã«äœãããã«ã¡ã¢ãªã解æŸããŸãã ããã«ãã¢ã¯ã¿ãŒã®åç¶æéã¯æœåšçã«ç¡éã§ãã