private static void UseAkkaWithRemoting()
        {
            var config = ConfigurationFactory.ParseString(@"
akka {
    actor {
        provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
    }
    remote {
        helios.tcp {
            port = 0
            hostname = localhost
        }
    }
}
");

            var userName = Program.GetUserName();

            using (var system = ActorSystem.Create("KeyWatcherHost", config))
            {
                var users = system
                            .ActorSelection("akka.tcp://KeyWatcherListener@localhost:4545/user/users");

                using (var keyLogger = new BufferedKeyWatcher(Program.BufferSize))
                {
                    keyLogger.KeysLogged += (s, e) =>
                    {
                        users.Tell(new UserKeysMessage(userName, e.Keys));
                    };

                    Application.Run();
                }
            }
        }
        private static void UseAkkaLocally()
        {
            var builder = new ContainerBuilder();

            builder.RegisterModule <DependenciesModule>();
            builder.RegisterModule <ActorsModule>();
            var container = builder.Build();

            var userName = Program.GetUserName();

            using (var system = ActorSystem.Create("KeyWatcherHost"))
            {
                new AutoFacDependencyResolver(container, system);

                var users = system.ActorOf(system.DI().Props <UsersActor>(), "users");

                using (var keyLogger = new BufferedKeyWatcher(Program.BufferSize))
                {
                    keyLogger.KeysLogged += (s, e) =>
                    {
                        users.Tell(new UserKeysMessage(userName, e.Keys));
                    };

                    Application.Run();
                }
            }
        }
 private static void UseBufferedKeyWatcher()
 {
     using (var keyLogger = new BufferedKeyWatcher(Program.BufferSize))
     {
         keyLogger.KeysLogged += (s, e) => Console.WriteLine(e.Keys);
         Application.Run();
     }
 }
        private static void UseAkkaWithRemotingWithQuietness()
        {
            var config = ConfigurationFactory.ParseString(@"
akka {
    actor {
        provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
    }
    remote {
        helios.tcp {
            port = 0
            hostname = localhost
        }
    }
}
");

            var userName = Program.GetUserName();

            using (var system = ActorSystem.Create("KeyWatcherHost", config))
            {
                var users = system
                            .ActorSelection("akka.tcp://KeyWatcherListener@localhost:4545/user/users");

                using (var keyLogger = new BufferedKeyWatcher(Program.BufferSize))
                {
                    keyLogger.KeysLogged += (s, e) =>
                    {
                        users.Tell(new UserKeysMessage(userName, e.Keys));
                    };

                    var quietObservation =
                        Observable.FromEventPattern <BufferedKeysEventArgs>(
                            keyLogger, nameof(BufferedKeyWatcher.KeysLogged));

                    using (var quietSubscription = quietObservation
                                                   .Throttle(TimeSpan.FromSeconds(2))
                                                   .Subscribe(args => Console.Out.WriteLine("It's quiet in here...")))
                    {
                        Application.Run();
                    }
                }
            }
        }
        private static void UseAkkaViaWebApiLocally()
        {
            var userName = Program.GetUserName();

            using (var keyLogger = new BufferedKeyWatcher(Program.BufferSize))
            {
                keyLogger.KeysLogged += (s, e) =>
                {
                    var message = JsonConvert.SerializeObject(
                        new UserKeysMessage(userName, e.Keys), Formatting.Indented);
                    var content = new StringContent(message,
                                                    Encoding.Unicode, "application/json");
                    var postResponse = new HttpClient().PostAsync("http://localhost:6344/api/keywatcher", content);
                    postResponse.Wait();
                };

                Application.Run();
            }

            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            var userName = Program.GetUserName();

            Console.Out.WriteLine("Waiting for Orleans Silo to start. Press Enter to proceed...");
            Console.In.ReadLine();

            var config = ClientConfiguration.LocalhostSilo(30000);

            GrainClient.Initialize(config);

            using (var keyLogger = new BufferedKeyWatcher(Program.BufferSize))
            {
                keyLogger.KeysLogged += (s, e) =>
                {
                    var user = GrainClient.GrainFactory.GetGrain <IUserGrain>(userName);
                    user.ProcessAsync(new UserKeysMessage(userName, e.Keys));
                };

                Application.Run();
            }
        }