Angel \”Java\” Lopez on Blog

October 19, 2011

Asynchronous Programming: Links, News and Resources (2)

Filed under: .NET, Asynchronous, JavaScript, Links, NodeJs — ajlopez @ 10:00 am

Previous Post

More links about Asynchronous Programming:

Node.js is Cancer
http://teddziuba.com/2011/10/node-js-is-cancer.html

[nodejs] Re: Reaction to article: Node is Cancer
http://groups.google.com/group/nodejs/browse_thread/thread/fadc4efc3e4babe8?hl=en%3Fhl%3Den

"async" support in node.js
https://github.com/koush/node/wiki/%22async%22-support-in-node.js

Asynchronous Programming with Async and Await
http://msdn.microsoft.com/en-us/library/hh191443%28v=VS.110%29.aspx

InfoQ; Building Scalable Systems: an Asyncrhonous Approach
http://www.infoq.com/presentations/Building-Scalable-Systems-Asynchronous-Approach

Progress Reporting in C# 5 Async
http://www.codeproject.com/KB/Parallel_Programming/AncillaryAsyncProgress.aspx

IanG on Tap: C# 5 Async Exception Handling
http://www.interact-sw.co.uk/iangblog/2010/11/01/csharp5-async-exceptions

zlib implementation
https://github.com/razorg/node-zlib

BlueEyes
https://github.com/jdegoes/blueeyes
A lightweight Web 3.0 framework for Scala, featuring a purely asynchronous architecture, extremely high-performance, massive scalability, high usability, and a functional, composable design.

Evented Ajax
https://github.com/mojolly/jquery.evented_ajax.js
An event driven replacement for $.ajax designed for use with non-blocking, evented backends (you know, stuff like NodeJS, EM, Twisted)

Asynchronous Programming in JavaScript with "Promises"
http://blogs.msdn.com/b/ie/archive/2011/09/11/asynchronous-programming-in-javascript-with-promises.aspx

Step, control-flow the node.js way
http://thechangelog.com/post/516202796/step-control-flow-the-node-js-way

SignalR Demo
https://github.com/bradygaster/SignalR.Demo

Using an Asynchronous Server Socket
http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx

Asynchronous server application framework for Clojure
https://github.com/texodus/saturnine

Picard
https://github.com/strobecorp/picard
Async clojure HTTP framework

The Netty project
http://www.jboss.org/netty
The Netty project is an effort to provide an asynchronous event-driven network application framework and tools for rapid development of maintainable high performance & high scalability protocol servers & clients.

Node.x
https://github.com/purplefox/node.x
http://purplefox.github.com/node.x/
A general purpose framework that uses an asynchronous event based style for building highly scalable network or file system aware applications
Runs on the JVM.
Everything is asynchronous.
Embraces the style of node.js and extends it to the JVM. Think node.js *on steroids*. Plus some.

Asynchronous scalable web applications with real-time persistent long-running connections with SignalR
http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx

libev
http://software.schmorp.de/pkg/libev.html
A full-featured and high-performance event loop that is loosely modelled after libevent, but without its limitations and bugs. It is used, among others, in the GNU Virtual Private Ethernet and rxvt-unicode packages, and in the Deliantra MORPG Server and Client.

libio
http://software.schmorp.de/pkg/libeio.html
Event-based fully asynchronous I/O library for C (used by IO::AIO). Currently in BETA!

Groovy++ in action: Gretty/GridGain/REST/Websockets
http://groovy.dzone.com/articles/groovy-action

Reactor Pattern
http://en.wikipedia.org/wiki/Reactor_pattern
The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs.

Proactor Pattern
http://en.wikipedia.org/wiki/Proactor_pattern
Proactor is a software design pattern for Event handling in which long running activities are running in an asynchronous part. A Completion Handler is called after the asynchronous part has terminated. The proactor pattern can be considered to be an asynchronous variant of the synchronous reactor pattern.

The state of Axum: Isolation, Agents, and Message-passing in .NET
http://blogs.msdn.com/b/maestroteam/archive/2011/02/28/the-state-of-axum.aspx

How GitHub Works: Be Asynchronous
http://zachholman.com/posts/how-github-works-asynchronous/

Using node.js async library reminds me of continuations and monads
http://iamwil.posterous.com/64271154

Tweaking WCF to build highly scalable async REST API
http://www.codeproject.com/KB/webservices/fixwcf_for_restapi.aspx

My Links
http://www.delicious.com/ajlopez/asynchronous

More links are coming. Keep tuned!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

September 20, 2011

C# 5: Links, News and Resources (1)

Filed under: .NET, C Sharp, C Sharp 5, Links, Programming Languages — ajlopez @ 10:18 am

These are my links about the new C# 5, its history, and the main two new features: compiler as a service, async/wait asynchronous programming. Related post: Windows 8 and WinRT: Links, News and Resources.

Future directions for C# and Visual Basic
http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-816T
Anders will talk about asynchronous programming and Windows 8 programming, coming in the next version of Visual Studio. He will also discuss the long-lead project “Roslyn”, including object models for code generation, analysis, and refactoring, and upcoming support for scripting and interactive use of C# and Visual Basic.

Mono’s C# Compiler as a Service on Windows.
http://tirania.org/blog/archive/2010/Apr-27.html
The Mono team is proud to bring you a preview of C# 5.0 a few years before our friends in Building 41 do.

Project Roslyn or Compiler-as-a-Service. Bringing flexibility of dynamic languages to C#
http://blog.softelegance.com/net/project-roslyn-or-compiler-as-a-service-bringing-flexibility-of-dynamic-languages-to-c/

Microsoft previews Compiler-as-a-Service software
http://www.computerworld.com/s/article/9220056/Microsoft_previews_Compiler_as_a_Service_software
Microsoft’s Roslyn project will bring the flexibility of dynamic languages to C# and Visual Basic

BUILD conference–day 3, The future of C#
http://lostechies.com/gabrielschenker/2011/09/16/build-conferenceday-3/

Roslyn: Compiler as a Service, not a black-box anymore!
http://www.codequake.com/post/2011/09/16/Roslyn-Compiler-as-a-Service-not-a-black-box-anymore!.aspx

what is C# 5 and where does it come from?
http://stackoverflow.com/questions/4135010/what-is-c-5-and-where-does-it-come-from

Using C# Compiler as a Service in F#, PoshConsole (Powershell)
http://naveensrinivasan.com/2010/05/11/using-c-compiler-as-a-service-in-f-poshconsole-powershell/

C# 4.0 and beyond by Anders Hejlsberg
http://channel9.msdn.com/blogs/matthijs/c-40-and-beyond-by-anders-hejlsberg

C# 5 Async
http://blogs.msdn.com/b/ericlippert/archive/tags/async/

The Future of C# and Visual Basic
http://channel9.msdn.com/events/PDC/PDC10/FT09

Discussion of C# 5′s new async features
http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/00cc045a-f9e6-402c-bffb-feb4fe1e0611/

C# 5 – await and async in ASP.NET « I Came, I Learned, I Blogged
http://evolpin.wordpress.com/2011/05/02/c-5-await-and-async-in-asp-net/

Await Keyword in C# 5 for Async Programming
http://www.pnpguidance.net/post/AwaitKeywordCSharp5AsyncProgramming.aspx

C# 5 Async Support – Await Keyword
http://davidhayden.com/blog/dave/archive/2010/10/31/Csharp5AwaitKeyword.aspx

Coroutines with C# 5′s await — Logos Bible Software Code Blog
http://code.logos.com/blog/2010/10/coroutines_with_c_5s_await.html

Asynchrony in C# 5, Part One
http://blogs.msdn.com/b/ericlippert/archive/2010/10/28/asynchrony-in-c-5-part-one.aspx

C# 5 Async, Part 1: Simplifying Asynchrony – That for which we await : Reed Copsey, Jr.
http://reedcopsey.com/2010/10/28/c-5-async-part-1-simplifying-asynchrony-that-for-which-we-await/

C# 5 – Jon Skeet: Coding Blog
http://msmvps.com/blogs/jon_skeet/archive/tags/C_2300_+5/default.aspx
Check the Eduasync series
http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx

Hiring for Roslyn
http://blogs.msdn.com/b/ericlippert/archive/2010/12/16/hiring-for-roslyn.aspx

C# 5.0 Other news
http://blog.functionalfun.net/2010/11/c-50-other-news.html

C#5 and Meta-Programming
http://codebetter.com/patricksmacchia/2010/05/31/c-5-and-meta-programming/

Progress Reporting in C# 5 Async
http://www.codeproject.com/KB/Parallel_Programming/AncillaryAsyncProgress.aspx

C# 5 Async Exception Handling
http://www.interact-sw.co.uk/iangblog/2010/11/01/csharp5-async-exceptions

C# 5 Async, Part 1: Simplifying Asynchrony – That for which we await
http://reedcopsey.com/2010/10/28/c-5-async-part-1-simplifying-asynchrony-that-for-which-we-await/

C# 5 New Features
http://www.pluralsight-training.net/microsoft/courses/tableofcontents?courseName=csharp-newincs5

Ok, you have interpreter as a service, dynamic objects, goroutines, channels,
software transaction memory, REPL, distributed code in AjSharp ;-)
http://ajlopez.wordpress.com/category/ajsharp/

My Links
http://www.delicious.com/ajlopez/c%235

Keep tuned, more to come!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

September 16, 2011

Windows 8 and WinRT: Links, News and Resources

Filed under: .NET, C Sharp, HTML5, JavaScript, Links, Windows 8, WinRT — ajlopez @ 9:38 am

This week Windows 8 was unveiled and introduced into society, at Build Conference. Some links I found interesting about Windows 8, Metro applications, WinRT and .NET programming.

http://en.wikipedia.org/wiki/Windows_8

WinRT demystified – Miguel de Icaza
http://tirania.org/blog/archive/2011/Sep-15.html

Building Windows 8 – Site Home – MSDN Blogs
http://blogs.msdn.com/b/b8/

Build Conference
http://www.buildwindows.com/

Some Thoughts on Windows 8
http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/14/some-thoughts-on-windows-8.aspx

Sessions at BUILD Day 2 and Windows 8
http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/15/sessions-at-build-day-2-and-windows-8.aspx

WinRT and .NET in Windows 8
http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/15/winrt-and-net-in-windows-8.aspx

Bye Bye Brain, first game on Windows 8
http://vimeo.com/29104421

The final days of Adobe Flash
http://www.bytheshaw.com/article/The+final+days+of+Adobe+Flash.html

Windows Developer Preview Metro style app samples
http://code.msdn.microsoft.com/Windows-Developer-Preview-6b53adbb
The Windows Developer Preview Samples Gallery contains a variety of code samples that exercise the various new programming models, platforms, features, and components available for the BUILD conference.

Using WinRT from .NET
http://ermau.com/using-winrt-from-net/

WinRT is Replacing Win32
http://www.winsupersite.com/blog/supersite-blog-39/windows8/winrt-replacing-win32-140605

Build 2011: What Is WinRT, and Is Silverlight Dead?
http://www.readwriteweb.com/hack/2011/09/build-2011-what-is-winrt-and-i.php
The Windows Runtime library (WinRT) is the principal provider of system services for applications in Windows 8 that will be designed to incorporate the new "Metro" style

Functional Fun: Windows Runtime – Dial in the right expectations before reading up
http://blog.functionalfun.net/2011/09/windows-runtime-dial-in-right.html

InfoQ: WinRT: An Object Orientated Replacement for Win32
http://www.infoq.com/news/2011/09/WinRT-API
User interfaces in C++ will be written primarily in XAML.
Overlapping Windows No Longer Exist <— I remember Windows 1.0 ;-)
Under WinRT all APIs are exposed as objects that C# and VB can consume directly.
The fourth major language for Windows 8 is JavaScript.
All Metro Applications Must be Digitally Signed.

Sinofsky outlines the Windows 8 vision | News | TechRadar UK
http://www.techradar.com/news/software/operating-systems/sinofsky-outlines-the-windows-8-vision-1027101?src=rss&attr=all

Best place to discuss Windows 8
http://blogs.msdn.com/b/b8/archive/2011/09/14/best-place-to-discuss-windows-8.aspx

Metro style browsing and plug-in free HTML5
http://blogs.msdn.com/b/b8/archive/2011/09/14/metro-style-browsing-and-plug-in-free-html5.aspx

Experiencing Windows 8 touch on Windows 7 hardware
http://blogs.msdn.com/b/b8/archive/2011/09/13/experiencing-windows-8-touch-on-windows-7-hardware.aspx

Welcome to Windows 8 – The Developer Preview
http://blogs.msdn.com/b/b8/archive/2011/09/13/welcome-to-windows-8-the-developer-preview.aspx

JAPF » Blog Archive » BUILD: WinRT, Silverlight, WPF, XAML
http://www.japf.fr/2011/09/build-winrt-silverlight-wpf-xaml/

Building real-time web apps with WebSockets using IIS, ASP.NET and WCF | BUILD2011 | Channel 9
http://channel9.msdn.com/Events/BUILD/BUILD2011/SAC-807T

A bad picture is worth a thousand long discussions. « Doug Seven
http://dougseven.com/2011/09/15/a-bad-picture-is-worth-a-thousand-long-discussions/

Internet Explorer 10 Metro will not support Flash, Silverlight – Tech Products & Geek News | Geek.com
http://www.geek.com/articles/news/internet-explorer-10-metro-will-not-support-flash-silverlight-20110915/

C#er : IMage: Windows 8: What you Need to Know
http://csharperimage.jeremylikness.com/2011/09/windows-8-what-you-need-to-know.html?m=1

"What’s New in the .NET Framework 4.5 Developer Preview" (and Yield is coming to VB.Net!) – Greg’s Cool [Insert Clever Name] of the Day
http://coolthingoftheday.blogspot.com/2011/09/new-in-net-framework-45-developer.html

Guide to Installing and Booting Windows 8 Developer Preview off a VHD (Virtual Hard Disk)
http://www.hanselman.com/blog/GuideToInstallingAndBootingWindows8DeveloperPreviewOffAVHDVirtualHardDisk.aspx

A few facts about Microsoft’s new Windows Runtime « Tim Anderson’s ITWriting
http://www.itwriting.com/blog/4866-a-few-facts-about-microsofts-new-windows-runtime.html

OK, so I think HTML/JS for Metro apps is a good idea « codeface
http://blog.markrendle.net/2011/09/15/ok-so-i-think-the-htmljs-for-metro-apps-is-a-good-idea/

I know what you’re thinking, and you’re wrong. « Doug Seven
http://dougseven.com/2011/09/14/i-know-what-youre-thinking-and-youre-wrong/
Metro, Silverlight, .NET

Microsoft to developers: Metro is your future | ZDNet
http://www.zdnet.com/blog/microsoft/microsoft-to-developers-metro-is-your-future/10611

Microsoft Unveils ‘Reimagined’ Windows 8 at Build Event — Visual Studio Magazine
http://visualstudiomagazine.com/articles/2011/09/13/build-preview-of-windows-8.aspx

Welcome to Windows 8 – The Developer Preview – Building Windows 8 – Site Home – MSDN Blogs
http://blogs.msdn.com/b/b8/archive/2011/09/13/welcome-to-windows-8-the-developer-preview.aspx

Delivering fast boot times in Windows 8 – Building Windows 8 – Site Home – MSDN Blogs
http://blogs.msdn.com/b/b8/archive/2011/09/08/delivering-fast-boot-times-in-windows-8.aspx

Windows 8 will feature Hyper-V guest OS machine virtualization | ExtremeTech
http://www.extremetech.com/computing/95339-windows-8-will-feature-hyper-v-guest-os-machine-virtualization?obref=obinsite

"A sort of PC": how Windows 8 will invade tablets (and why it might work)
http://arstechnica.com/microsoft/news/2011/08/a-sort-of-pc-how-windows-8-will-invade-tablets-and-why-it-might-work.ars

Improving our file management basics: copy, move, rename, and delete – Building Windows 8 – Site Home – MSDN Blogs
http://blogs.msdn.com/b/b8/archive/2011/08/23/improving-our-file-management-basics-copy-move-rename-and-delete.aspx

My Links
http://www.delicious.com/ajlopez/windows8
http://www.delicious.com/ajlopez/winrt
http://www.delicious.com/ajlopez/vs2011

Angel "OMGC++Again" Lopez

September 13, 2011

AjScript: Javascript-Alike interpreter in C# (2) Expressions

Previous Post

As in other interpreters, one key piece is the Expression, something to evaluate during the execution of a program. In AjScript (repository) I have an IExpression:

public interface IExpression
{
    object Evaluate(IContext context);
}

These are the implemented expression in current solution:

A simple expression, ConstantExpression:

public class ConstantExpression : IExpression
{
    private object value;
    public ConstantExpression(object value)
    {
        this.value = value;
    }
    public object Value { get { return this.value; } }
    public object Evaluate(IContext context)
    {
        return this.value;
    }
}

A bit more interesting, VariableExpression, given a name, and a context, returns the value of a named variable:

public class VariableExpression : IExpression
{
    private string name;
    public VariableExpression(string name)
    {
        this.name = name;
    }
    public string Name { get { return this.name; } }
    public object Evaluate(IContext context)
    {
        return context.GetValue(this.name);
    }
}

Sometimes, an expression has one or two parameters. I have UnaryExpression, BinaryExpression as abstract class. The BinaryExpression code:

public abstract class BinaryExpression : IExpression
{
    private IExpression leftExpression;
    private IExpression rigthExpression;
    public BinaryExpression(IExpression left, IExpression right)
    {
        this.leftExpression = left;
        this.rigthExpression = right;
    }
    public IExpression LeftExpression { get { return this.leftExpression; } }
    public IExpression RightExpression { get { return this.rigthExpression; } }
    public abstract object Apply(object leftValue, object rightValue);
    public object Evaluate(IContext context)
    {
        object leftValue = this.leftExpression.Evaluate(context);
        object rightValue = this.rigthExpression.Evaluate(context);
        return this.Apply(leftValue, rightValue);
    }
}

Note that the Apply method is abstract. A concrete implementation:

using Microsoft.VisualBasic.CompilerServices;
public class ConcatenateExpression : BinaryExpression
{
    public ConcatenateExpression(IExpression left, IExpression right)
        : base(left, right)
    {
    }
    public override object Apply(object leftValue, object rightValue)
    {
        if (leftValue == null)
            leftValue = string.Empty;
        if (rightValue == null)
            rightValue = string.Empty;
        return Operators.ConcatenateObject(leftValue, rightValue);
    }
}

I'm a lazy programmer: note the use of Visual Basic Operators. I could write a custom implementation. I have all the tests in place to refactor this expression.

I didn't write all expressions at once. An example: I wrote Context class using tests, and then the VariableExpression class using tests. Then I added variable support in Parser, and evaluates simple expressions that use constants and variables. I use this pattern many times: add a new base class (Context, Function…), add a new expression, improve lexer/parser to support the new expression, use the expression in code tests, etc.

Upcoming topics: commands, function implementation, closures, hoisting, native objects. And AjScript examples.

Keep tuned!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

September 12, 2011

AjScript: Javascript-Alike interpreter in C# (1) Base Interface

Filed under: .NET, AjScript, C Sharp, JavaScript, Open Source Projects, Programming Languages — ajlopez @ 11:12 am

Next Post

I’m working on implementing a C# interpreter of AjScript: a Javascript-alike language. The code in progress is published at:

https://github.com/ajlopez/AjScript

Initially it was at my AjCodeKatas project in Google Code, but now I prefer GitHub: it able me to have more projects. Google Code has a limit in the number of projects, so I was forced to put little projects in the AjCodeKata. Now, GitHub frees me from that limitation. And GitHub with its public forks and pull request has its charm.

The idea is to have an interpreter with the “good parts” of Javascript. I should discuss with myself about inheritance support. But a key point that it supports is: access to native .NET objects. You can write var obj = new System.IO.DirectoryInfo(‘.’) directly in AjScript. And you can invoke AjScript code from a .NET application.

But now, I will present the base interfaces of this interpreter. First, IObject, the interface that every AjScript object should implement:

 

public interface IObject
{
    IFunction Function { get; }
    object GetValue(string name);
    void SetValue(string name, object value);
    ICollection<string> GetNames();
    object Invoke(string name, object[] parameters);
    object Invoke(ICallable method, object[] parameters);
}

Interesting, every object has a Function property: that function is the “class” of the object, the function used in the new command.

To keep the variable names and their values, I have an IContext interface:

public interface IContext
{
    IContext RootContext { get; }
    ReturnValue ReturnValue { get; set;  }
    void SetValue(string name, object value);
    object GetValue(string name);
    void DefineVariable(string name);
}

Note that a context could have a parent context, in order to support nested context. ReturnValue property is used to detect the return command that could have executed many levels inside the current execution.

Any AjScript method implements ICallable:

public interface ICallable
{
    int Arity { get; }
    IContext Context { get; }
    object Invoke(IContext context, object @this, object[] arguments);
}

Note that functions are IObject and ICallable but with the power of create a new object:

public interface IFunction : ICallable, IObject
{
    object NewInstance(object[] parameters);
}

Upcoming posts: examples, closures, native object management, lexer and parser, test and TDD (I wrote the interpreter using TDD, I have > 80% code coverage).

Pending work: implements Function with arguments, prototype with .constructor and other properties, typeof, Javascript original “classes” like Number and others, decide what features of Javascript are “in” and what ones are “out”. Suggestions?

Keep tuned!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

August 8, 2011

Social Online Games Programming (Part 4) Processing arbitrary Game Actions

Filed under: .NET, ASP.NET MVC, Azure, Game Development, HTML5, JavaScript — ajlopez @ 8:49 am

Previous Post
Next Post

There is a new release of Windows Azure Toolkit for Social Games:

http://watgames.codeplex.com/releases/view/70342

Let examine a key change in this version. There is a new entry at Tankster.GamePlay\Services\IGameService.cs:

[WebInvoke(Method = "POST", UriTemplate = "command/{gameId}")]
HttpResponseMessage Command(Guid gameId, HttpRequestMessage request);
[WebInvoke(Method = "POST", UriTemplate = "command/v2/{gameId}")]
HttpResponseMessage Command2(Guid gameId, HttpRequestMessage request);

There are TWO entry points to send game commands from client. Why? Having two URIs the server can be used by old clients and new ones. Note the “v2” in the UriTemplate.

The new Command2 (partial) code at implementation (GameService.cs):

// Add gameAction
var gameAction = new GameAction
{
    Id = Guid.NewGuid(),
    Type = commandType,
    CommandData = commandData,
    UserId = this.CurrentUserId,
    Timestamp = DateTime.UtcNow
};
// Cleanup game actions lists
for (int i = 0; i < game.GameActions.Count(); i++)
{
    if (game.GameActions[i].Timestamp < DateTime.UtcNow.AddSeconds(-10))
    {
        game.GameActions.RemoveAt(i);
        i--;
    }
}
game.GameActions.Add(gameAction);
this.gameRepository.AddOrUpdateGame(game);
return SuccessResponse;

If you compare the old code (Command method) with the above code, the main difference is:

- The server doesn’t manage the logic of “who is the next player in turn”

- The server doens’t distribute the received command via a GameActionProcessor

And another change: game action type is an int, now. In the previous release, it was an enum, reflecting a fixed set of action types.

It still updates the game status blob adding the new game command (it could be a chat message, or a new shot). In this new way, THE SERVER CODE is more independent from game logic: the client code has the responsibility of select the next player. The notion of turn is leave to game client development. Now, the server code could be used for other multi-players games. Yes, we could have our own Social game! ;-)

Windows Azure and worker/web roles are in charge of federated authentication, the formation of  new games, etc. But the engine is more “game agnostic” in this new release.

The client code sends commands:

Steps:

1- Client code sends a new Game Action in JSON (i.e.: shot information (position, angle, force)).

2- A web role instance receives the Game Action and updates the list of actions in the corresponding game blob status (saving the actions of the last 10 seconds)

3- The other players are polling the game status, until they notice a new game action that implies turn change.

Client code could manage the case of timeout of its player, or the “going offline” of one the other browsers.

Pros:

- Server code is more generic, and it could be used for other games

Cons:

- The client code could be cheated (no server control, validation over game actions)

- More complexity (turn logic, timeout management, offline and latency issues, cheat control) at client code.

The litmus test: implementing a new game using the same server code. Some points to polish: skirmish mode is still hardcoded to a maximum of 5 players; the 10 seconds windows for game actions is arbitrary. Possible solutions: each game client code creates a new game (waiting for other players) specifying the minimum, maximum number of players and a timeout in seconds, and time window for game action status.

But remember, the example code is still in beta. A new version is coming.

Keep tuned!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

July 29, 2011

Social Online Games Programming (Part 3) Tankster, Blob Storage and JSONP

Filed under: .NET, AJAX, ASP.NET MVC, Azure, Game Development, HTML5, JavaScript, JQuery — ajlopez @ 10:59 am

Previous Post
Next Post

In my previous post I wrote about the Windows Azure Social Gaming Toolkit, and its example multi-player online game Tankster. See:

http://watgames.codeplex.com/
http://www.tankster.net/

There are two interesting posts by @ntotten about the inner guts of the game:

Architecture of Tankster – Introduction to Game Play (Part 1)
Architecture of Tankster– Scale (Part 2)

It’s worth to mention Nathan’s text here:

Before we begin with an explanation of the implementation, it is important to know what our goals where for this game. We had three primary goals when building this game.

  1. The game must scale to handle several hundred thousand concurrent users.*
  2. The architecture must be cost effective.
  3. The architecture must be flexible enough for different types of games.

* This is the goal, but there are still some known limitations in the current version that would prevent this. I will be writing more about that later.

Now, I want to write about the use and implementation of blob storage in Tankster.

Why to use blob storage? If you play Tankster in practice mode, the Javascript client doesn’t use the Azure backend. Javascript can access web role and blob storage via Ajax/JSON calls. But in multi-player game (there is one kind of game, named Skirmish), each player client code polls the blob storage to get the game status (tank shots, chat messages, other status). But again, why blob storage? There are money reasons (cost of each access to Web Role service API vs. cost of read a blob), but I don’t know about Azure prices (you know, MVPs don’t touch the money ;-) . But there is another reason: to spread the workload, given some air to web role instances.

There is an AzureBlobContainer class in Tankster.Common library project:

public class AzureBlobContainer<T> : IAzureBlobContainer<T>
{
    private readonly CloudBlobContainer container;
    private readonly bool jsonpSupport;
    private static JavaScriptSerializer serializer;
    public AzureBlobContainer(CloudStorageAccount account)
        : this(account, typeof(T).Name.ToLowerInvariant(), false)
    {
    }
    public AzureBlobContainer(CloudStorageAccount account, bool jsonpSupport)
        : this(account, typeof(T).Name.ToLowerInvariant(), false)
    {
    }
    public AzureBlobContainer(CloudStorageAccount account, string containerName)
        : this(account, containerName.ToLowerInvariant(), false)
    {
    }
	//....

 

The class use generics. Type T could be a Game, GameQueue or another .NET type. You can reuse this class in other projects: it’s “game agnostic” code. The many constructors add flexibility for testing purpose.

This is the code to save a typed object to a blob:

public void Save(string objId, T obj)
{
    CloudBlob blob = this.container.GetBlobReference(objId);
    blob.Properties.ContentType = "application/json";
    var serialized = string.Empty;
    serialized = serializer.Serialize(obj);
    if (this.jsonpSupport)
    {
		serialized = this.container.Name + "Callback(" + serialized + ")";
    }
    blob.UploadText(serialized);
}

The object (type T) is serialized to JSON. AND not only JSON: note that a there is a Callback (you could remove this part if you don’t need this feature in your project). Then, a game object is saved as (I stolen …errr… borrowed ;-) this code from Nathan’s post):

gamesCallback(
    {"Id":"620f6257-83e6-4fdc-99e3-3109718934a6"
    ,"CreationTime":"\/Date(1311617527935)\/"
    ,"Seed":1157059416
    ,"Status":0
    ,"Users":[
        {"UserId":"MxAb1iZtey732BGsWsoMcwx3JbklW1xSnsxJX9+KanI="
        ,"UserName":"MxAb1iZtey732BGsWsoMcwx3JbklW1xSnsxJX9+KanI="
        ,"Weapons":[]
        },
        {"UserId":"ZXjeyzvw7WTdP8/Uio4P6cDZ8jmKvCXCDp7JjWolAOY="
        ,"UserName":"ZXjeyzvw7WTdP8/Uio4P6cDZ8jmKvCXCDp7JjWolAOY="
        ,"Weapons":[]
        }]
    ,"ActiveUser":"MxAb1iZtey732BGsWsoMcwx3JbklW1xSnsxJX9+KanI="
    ,"GameRules":[]
    ,"GameActions":[]
    })

Why the callback? To support JSONP:

http://en.wikipedia.org/wiki/JSONP

JSONP or “JSON with padding” is a complement to the base JSON data format, a pattern of usage that allows a page to request data from a server in a different domain. As a solution to this problem, JSONP is an alternative to a more recent method called Cross-Origin Resource Sharing.

Under the same origin policy, a web page served from server1.example.com cannot normally connect to or communicate with a server other than server1.example.com. An exception is the HTML <script> element. Taking advantage of the open policy for <script> elements, some pages use them to retrieve Javascript code that operates on dynamically-generated JSON-formatted data from other origins. This usage pattern is known as JSONP. Requests for JSONP retrieve not JSON, but arbitrary JavaScript code. They are evaluated by the JavaScript interpreter, not parsed by a JSON parser.

If you are a newbie to JSON and JSONP, this is a short tutorial/example using JQuery (the same library used by Tankster client code):

Cross-domain communications with JSONP, Part 1: Combine JSONP and jQuery to quickly build powerful mashup

But (you know, there is a “but” in every software project ;-) Azure blob storage doesn’t support the JSONP URL (that has a randomly generated callback id):

Query JSON data from Azure Blob Storage with jQuery

There is a proposed solution in that Stack Overflow thread. Agent Maxwell Smart would say: ah! the “old trick” of having the callback in the blob!

dataCallback({"Name":"Valeriano","Surname":"Tortola"})

You can read a more detailed description of problem/solution with example code at @woloski’s post (good practice Matthew! write a post!):

Ajax, Cross Domain, jQuery, WCF Web API or MVC, Windows Azure

One problem to point: note that the callback name is “hardcoded” in blob storage. The gamesCallback present in game status blob should be the name of a global function. But you can change the blob text to whatever valid Javascript code.

And the client code? You can study the gskinner code at Tankster.GamePlay web project, under src\ui\net\ServerDelegate.js:

(function (window) {
    goog.provide('net.ServerDelegate');
    goog.require('net.ServerRequest');

    var ServerDelegate = function () {
        throw new Error('ServerDelegate cannot be instantiated.');
    };

    var p = ServerDelegate;

    p.BASE_API_URL = "/";
    p.BASE_BLOB_URL = "http://tankster.blob.core.windows.net/";
    p.BASE_ASSETS_URL = "";
    p.load = function (type, data, loadNow) {
        var req;
        if (p.CLIENT_URL == null) {
            p.CLIENT_URL = window.location.toString();
        }
//....

There is an interesting switch:

switch (type) {
    //Local / config calls
    case 'strings':
        req = new ServerRequest('locale/en_US/strings.js',
		   null, 'jsonp', null, 'stringsCallback'); break;
    //Game calls
    case 'endTurn':
        req = new ServerRequest(apiURL+'Game/EndTurn/',
		    null, 'xml'); break;
    case 'leaveGame':
        req = new ServerRequest(apiURL+'Game/Leave/'+data.id,
		    {reason:data.reason}, 'xml', ServerRequest.POST); break;
    case 'playerDead':
        req = new ServerRequest(apiURL+'Game/PlayerDead/',
		    null, 'json'); break;
    case 'gameCreate':
        req = new ServerRequest(apiURL+'Game/Queue', data,
		    'xml', ServerRequest.POST); break;
    case 'usersGame':
        req = new ServerRequest(blobURL+'sessions/'+data,
		    null, 'jsonp', null, 'sessionsCallback'); break;
    case 'gameStatus':
        req = new ServerRequest(blobURL+'games/'+data,
		    null, 'jsonp', null, 'gamesCallback'); break;
    case 'gameQueueStatus':
        req = new ServerRequest(blobURL+'gamesqueues/'+data,
		    null, 'jsonp', null, 'gamesqueuesCallback'); break;
    case 'notifications':
        req = new ServerRequest(blobURL+'notifications/'+data,
		    null, 'jsonp'); break;

    //User calls
    case 'verifyUser':
//...

See the ‘gameStatus’ polling: it uses ‘jsonp’ as format. My guess: the ‘gamesCallback’ parameter is not needed: you can use any other name, the function to call resides in the blob content.

I think there are alternatives to game status. The blob reflects the Game entity (see Tankster.Core\Entities\Game.cs). But it could be implemented in two blobs by game:

- One, having the initial status (players, positions,etc…) and the list of ALL the history of the game (think about to implement a chess or go game, you need to save the history).

- Another one, having the “news” (last 10 seconds of game actions). So, the data to poll should be shorter.

The price to pay: web role service should update both. But that update only occurs when a player sends a move (shot, chat…). The poll of game status occurs in every client, triggered by a repeated timeout. Actually, the game blob keeps the last 10 seconds actions AND initial status, weapons, etc…. Each client polls that info. In case a client disconnects and reconnects, it could poll the “complete game” blob to be in sync again.

The separation of that info in two blobs should improve the scalability of the solution. But you know: premature optimization is the root of all evil ;-) . If you take that way of store and retrieve games, you should run some stress or/and load tests to have a really measure of such decision impact.

More Tankster code analysis, patterns, and social game dev in general: coming soon.

Some links:

WAT is to Social Gaming, as Windows Azure is to… | Coding4Fun Blog | Channel 9

Thanks! They mention my post ;-)

Episode 52 – Tankster and the Windows Azure Toolkit for Social Games | Cloud Cover | Channel 9

Microsoft tailors Azure cloud services to social game developers | VentureBeat

Windows Azure Toolkit for Social Games Released to CodePlex – ‘Tankster’ Social Game Built for Windows Azure

Tankster, a Social Game Built for Windows Azure | Social Gaming on Windows Azure | Channel 9

Social Gaming on Windows Azure | Channel 9

Build Your next Game with the Windows Azure Toolkit for Social Games

Microsoft delivers early build of Windows Azure toolkit for social-game developers | ZDNet

http://www.delicious.com/ajlopez/tankster

Keep tuned!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

July 21, 2011

Social Online Games Programming (Part 2) Tankster and Windows Azure Toolkit For Social Games

Previous post
Next post

Yesterday, July 20th, Microsoft released a preview version of Windows Azure Toolkit for Social Games, and published a beta version (with code) of a first demo game.

You can download the code from Codeplex: http://watgames.codeplex.com/

You can play the game at: http://www.tankster.net/

The current solution main projects:

Tankster.GamePlay is a Web Role. The only worker role is Tankster.WorkerRole. Tankster.Core is a class library. There are interesting code at Tankster.Common: Azure utilities to access repositories, a job engine; all its code is game-agnostic.

These are my first short comments about the code and implemented features (remember, is a beta! Some of these features/implementations could change in the next release):

- Client technology: HTML5, Javascript, EaselJs (for canvas programming).
- Server technology: ASP.NET MVC 3, some Razor test views (interesting topic: how to test the game without the REAL game), WCF Web API (another interesting topic to discuss: alternative technologies to received the game activity)
- There is a client game model and entities in Javascript. See src/model, src/game.

- There is a server game model (see Tankster.Core class library project)

- You can play in single player mode, but you can choose multi-player online. Then, the game uses ACS Portal to login using Federated Authentication:

- The client code resides in a single page: index.html (with lot of referenced javascript files)
- Client code sends JSON data (commands) to WCF Web API endpoints, using Ajax/JQuery. There are services published, exposing a REST-like interface

routes.MapServiceRoute<GameService>("game");
routes.MapServiceRoute<AuthService>("auth");
routes.MapServiceRoute<UserService>("user");
routes.MapServiceRoute<TestService>("test");

- Most of the game activity is send to game/command service. The service updates the game status residing in a blob at Azure Storage. Code excerpt:

// Add gameAction
var gameAction = new GameAction
{
    Id = Guid.NewGuid(),
    Type = commandType,
    CommandData = commandData,
    UserId = this.CurrentUserId,
    Timestamp = DateTime.UtcNow
};
// Cleanup game actions lists
for (int i = 0; i < game.GameActions.Count(); i++)
{
    if (game.GameActions[i].Timestamp < DateTime.UtcNow.AddSeconds(-10))
    {
        game.GameActions.RemoveAt(i);
        i--;
    }
}
game.GameActions.Add(gameAction);
this.gameRepository.AddOrUpdateGame(game);

- The game status is polled by javascript clients from blob storage. In this way, the ASP.NET MVC web role has less workload.

- The blob resides in the same domain, so no cross-domain JSON call is needed. But the game is prepared to use cross-domain Ajax call, replacing the XmlHttpRequest object by a Flash component.

- The Skirmish game mode (five players in a game) is made queuing the new players in a Game Queue, managed at worker role.

- The Statistics are processed at worker role: some game actions are sent to Azure queue, so the statistics process doesn’t disturb the client game.

- User status, Game status, Skirmish Game Queue status are blobs.

- Statistics data uses SQL Azure.

- There only worker role use a Job Engine to process many tasks, example:

// Game Queue for Skirmish game
Task.TriggeredBy(Message.OfType<SkirmishGameQueueMessage>())
    .SetupContext((message, context) =>
    {
         context.Add("userId", message.UserId);
    })
    .Do(
        new SkirmishGameQueueCommand(userRepository,
            gameRepository, workerContext))
    .OnError(logException)
    .Start();

There are a lot of points to comment and discuss, feed for upcoming posts. Surely, the solution will evolve and new versions will be published (this week? next week?). But it is interesting to have a published game online AND the code to analyzes it.

Keep tuned!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

June 29, 2011

AjModel: Model by Code (Part 2) Models and Repositories

Filed under: .NET, AjModel, ASP.NET MVC, C Sharp, Software Development — ajlopez @ 10:50 am

Previous Post

I was working on my AjModel project. You can download the source code from my AjCodeKatas Project under trunk/AjModel. I added a Model class, and enhanced Entity Model and Property Model:

The model refers all the entity models I want to have in the coded model. AjModel enrich the already coded classes of your model, adding information like human descriptions, legends, etc. The idea is to generate automatically a UI for the coded model, for different technologies. The enhanced model could have nothing new, and AjModel should generate the initial UI, at runtime. The enhanced model could be consumed from differents UI technologies: the “proof of concept” application is an ASP.NET MVC one.

There is a fluent interface for EntityModel, and PropertyModel. There are extension methods, and wrappers/builders, like:

Some usage examples, borrowed from my tests:

EntityModel<Customer> model = new EntityModel<Customer>();
FluentEntityModel<Customer> fluentModel = new FluentEntityModel<Customer>(model);
fluentModel.Name("BusinessCustomer")
    .SetName("BusinessCustomers")
    .Descriptor("Business Customer")
    .SetDescriptor("Business Customers");
//..
Model model = new Model();
var entityModel = model.ForEntity<Customer>();
entityModel.Descriptor("Business Customer")
    .SetDescriptor("Business Customers");
//..
Model model = new Model();
model.ForEntity<Customer>().Property(
    c => c.Name,
    pm => pm.Descriptor("Customer Name")
            .Description("The Customer Name")
);

Where pm is a FluentPropertyModel.

In the UI process, I want to retrieve an entity by its identity. Or I need to get a list of entities to build a grid. Then, I need something to manage the entities, as a list. I implemented repositories in a context, to be implemented by different technologies. The current implementation is an in-memory list:

I’m planning to write adapter examples to NHibernate, Entity Framework, but those ideas are still in blueprints ;-)

Usage examples:

this.entityModel = new EntityModel<Customer>();
this.domain = new SimpleDomain();
this.repository = new Repository<Customer>(this.entityModel, this.domain.Customers);

Note that the repository is a typed one, using generics. And it needs an entity model, and (in the current implementation) an IList to manage. The context contains a list of repositories:

var entityModel = new EntityModel<Customer>();
var domain = new SimpleDomain();
var repository = new Repository<Customer>(entityModel, domain.Customers);
var context = new Context();
context.AddRepository(this.repository);
var repo = context.GetRepository("Customer");

SimpleDomain is a class I created for tests:

public class SimpleDomain
{
    public SimpleDomain()
    {
        this.Customers = new List<Customer>();
        for (int k = 1; k <= 10; k++)
        {
            Customer customer = new Customer()
            {
                Id = k,
                Name = string.Format("Customer {0}", k)
            };
            this.Customers.Add(customer);
        }
    }
    public IList<Customer> Customers { get; set; }
    public ProductList Products { get; set; }
}

A model can be created using a class like SimpleDomain. It discovers IList public properties:

var model = new Model(typeof(SimpleDomain));
var entityModel = model.GetEntityModel("Customer");
Assert.IsNotNull(entityModel);
entityModel = model.GetEntityModel("Product");
Assert.IsNotNull(entityModel);

I plan to add all types in an assembly that satisfied a predicate, like having “Entities” in their namespaces.

Entities can be added and retrieved to/from a repository:

Customer entity = new Customer() { Id = 1000 };
this.repository.AddEntity(entity);
Customer newEntity = this.repository.GetEntity(1000);

And they can be removed, too.

Entity model has the info to create new entities from values: a feature I will use in the UI:

EntityModel<Person> model = new EntityModel<Person>();
IDictionary<string, object> values = new Dictionary<string, object>()
{
    { "Id", 1 },
    { "FirstName", "Joe" },
    { "LastName", "Doe" },
    { "Age", "30" }
};
object entity = model.NewEntity(values);

In the next posts, I will discuss MVC UI implementation. All is work in progress, but the project is taking shape. And I having fun coding it ;-)

Keep tuned!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

June 24, 2011

Writing An Application Using TDD (Part 5) Adding Views

Previous Post
Next Post

Now I have some tests in place, I add some MVC views in this step. You can download the code from my AjCodeKatas Google Project, under trunk/AppTdd/Step04. So, this post has few new tests: it shows how we can build the interface AFTER the tests, and WITHOUT having a database or service layer, yet.

First, I added a new Site.master master page and style.css (borrowed from another ASP.NET MVC project)

I added a new Home controller:

Then, I added a view using the context menu over the Index method:

 

I modified the master page code, to have a new entry in its menu:

I added a new view associated to Index action in Subject controller:

I selected the “List” view content, and “Subject” as the type to use in the model.

But the controller method is:

public ActionResult Index()
{
    return View(subjects);
}

It uses a subject list, that is injected in the constructor by the tests:

public SubjectController(IList<Subject> subjects)
{
    this.subjects = subjects;
}

But wait! That list is injected by the tests. Now, I should inject in the normal process of the controller, in its parameter-less constructor:

public SubjectController()
    : this(Domain.Instance.Subjects)
{
}

I added a Domain.Instance to use as our in-memory domain:

public class Domain
{
    private static Domain instance = new Domain();
    private Domain()
    {
        this.Subjects = new List<Subject>()
        {
            new Subject() { Id = 1, Name = "Mathematics" },
            new Subject() { Id = 2, Name = "Physics" },
            new Subject() { Id = 3, Name = "Biology" },
            new Subject() { Id = 4, Name = "Literature" }
        };
    }
    public static Domain Instance { get { return instance; } }
    public IList<Subject> Subjects { get; set; }
}

I changed the links generated in the Index view from:

to use the Id property as primary key:

This is the result:

I created the other views using the Visual Studio “Add View…” wizard:

I had some missing actions, I wrote a new:

public ActionResult Edit(int id)
{
    var model = this.subjects.Where(s => s.Id == id).FirstOrDefault();
    return View(model);
}

With tests! ;-)

[TestMethod]
public void GetSubjectForEdit()
{
    IList<Subject> subjects = GetSubjects();
    SubjectController controller = new SubjectController(subjects);
    ActionResult result = controller.Edit(1);
    Assert.IsNotNull(result);
    Assert.IsInstanceOfType(result, typeof(ViewResult));
    ViewResult viewResult = (ViewResult)result;
    Assert.IsInstanceOfType(viewResult.ViewData.Model, typeof(Subject));
    Subject model = (Subject)viewResult.ViewData.Model;
    Assert.AreEqual(1, model.Id);
    Assert.AreEqual("Mathematics", model.Name);
}

Curiously, I detected a “bad” test. I had written in my AddSubject test:

Assert.IsTrue(subjects.Any(s => s.Name == "Chemistry"));
Assert.AreEqual(4, subject.Id);

But the new id should be 5 (our testable list has 4 predefined subjects):

Assert.IsTrue(subjects.Any(s => s.Name == "Chemistry"));
Assert.AreEqual(5, subject.Id);

I fixed the code and the controller action, run the web application, and voila!

Main points:

- I am using an in-memory domain.

- The views run over the already tested actions

No service layer or persistence yet. Next steps: add more classes to domain (Books), service layer (using test), and some persistence.

Interesting related post about development with TDD without a database (or adding it after the tests) by @RonJeffries:

But We Need a Database … Don’t We? | xProgramming.com

See? We Don’t Need a Database … Yet | xProgramming.com

Keep tuned!

Angel “Java” Lopez

http://www.ajlopez.com

http://twitter.com/ajlopez

« Newer PostsOlder Posts »

Theme: Shocking Blue Green. Blog at WordPress.com.

Follow

Get every new post delivered to your Inbox.

Join 28 other followers