Google+ C# client

By Kenneth 'RabidDog' Clark at November 10, 2011 23:57
Filed Under: C#, Code, Web

After the hackathon, I noticed that the .NET realm is not covered by the current Google+ clients. This prompted me to write a client to facilitate the current APIs. It is strongly typed, easy to use and pretty handy. I have included basic tests to describe it’s usage. Currently it only supports the API Key. Next is the paging and OAuth 2. Check it out if you get a chance https://github.com/RabidDog/GooglePlusNet

 

Ciao

C# HttpWebRequest and HttpWebResponse

By Kenneth 'RabidDog' Clark at November 09, 2011 13:34
Filed Under: C#, Code, Web

 

Another quick post on doing a simple http request and processing the response. Working on the Google+ client for C# and due to the fact the API is REST based, I need to be able to make an HTTP request and process the HTTP response. When looking at the client I am implementing I decided to wrap the whole round trip into a single operation. Here is the results of my labor.

 

First let me give you the class definition:

 

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;

namespace CodeShark.Communication
{
    class HttpProcessing
    {
        public static String ProcessRequest(string requestUrl)
        {
            // This will be the raw string response
            String output;

            var httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUrl);
            httpWebRequest.MaximumAutomaticRedirections = 4;
            httpWebRequest.MaximumResponseHeadersLength = 4;

            httpWebRequest.Credentials = CredentialCache.DefaultCredentials;

            using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
            {

                Debug.WriteLine("Content length is {0}", httpWebResponse.ContentLength);
                Debug.WriteLine("Content type is {0}", httpWebResponse.ContentType);

                using (var responseStream = httpWebResponse.GetResponseStream())
                {
                    if(responseStream == null)
                        throw new InvalidDataException("Could not retrieve any data from the URL " + requestUrl);


                    var readStream = new StreamReader(responseStream, Encoding.UTF8);

                    output = readStream.ReadToEnd();

                    Debug.WriteLine("Response stream received.");
                    Debug.WriteLine(output);
                }
            }

            return output;
        }
    }
}
Now for a quick explanation. We create the HTTP request using the URL supplied. Then we set some limits on the bouncing the HTTP request can do and set the credentials. The request is fired off when we call the httpWebRequest.GetResponse(). Once we have the HttpWebResponse we need to read the response stream. We get the response stream by calling httpWebResponse.GetResponseStream(). Using this stream you can read the response (presumably text). Pretty simple, nothing to fancy but something we do quiet often without even knowing it.

Google South Africa 2011–Developers day

By Kenneth 'RabidDog' Clark at November 05, 2011 00:50
Filed Under: Code, Web

Well after the experience of the hackathon I would be lying if I said I wasn’t nervous about attending the developers day. I decided to go anyways and give Google a chance to redeem themselves.

 

well the day didn’t start off very well although the venue was superb. The keynote address was nothing short of uninspiring. The next segment regarding Android development was just as uninspiring. Being at a developers day I was expecting a slightly more in depth presentation regarding Android and not the usual stuff you can pick up anywhere on Google. After the first presentation I decided I was going to ditch the Android track and proceeded to the Google Application Engine (GAE) presentation, hoping things would get better but not expecting it to.

 

Well I was wrong! The Google Application Engine presentation was superb. Opening my eyes to a span of horizons regarding the technology (which I am not going to get into now). With a smile on my face I proceeded to the next mobile presentation which covered some stats. The audience asked some absurd questions that took up  most of the presentation so I don’t think the speaker got to finish. I will get back to the questions in a second.

 

Once he completed his segment we started a code lab using HTML 5 and Google Chrome. YAY! Finally get to do some coding! It was super cool to code along to the presentation and watch the project start taking shape. At the end of the presentation we could finish the application and submit it. By submitting it we would put ourselves in line to win a Samsung Galaxy Ace (S5830). I proceed to keep my head down and complete the project.

 

Will working on the lab, the presentations continued around Google+ (eish) and some start up support project that Google is running with interviews and some inspiration stuff for those that are interested in starting their own business. Having tried this and failed miserably (due to some bad decisions on my part), I am fully aware of the pitfalls and pointers that these individuals were giving so I listened with half an ear. They have some fantastic ideas though, I am looking forward to seeing them come to fruition.

 

Anyways I carried on with the lab and finally finished it. Sitting around a friend of mine asked if I had submitted it for review. This was 20 minutes before the deadline! So I rushed off and had the guys have a look at the lab and they signed it off.

 

Anyways we got to the prize giving and two individuals grabbed what appeared to be two Samsung Galaxy S2 devices. Very cool! Then came the announcement for the winner of the Samsung Galaxy Ace. After going through the process of eliminating contenders, by God’s grace alone, I was chosen as the winner. I gladly accepted the prize but was then asked to demo the lab! I am not much of a public speaker, especially if I am unprepared but I did it anyway. I am not sure the audience understood what I was saying while running through the lab application but at least the one liner at the end got a bit of a chuckle. Oh and for the record, to all you Microsoft haters out there, my code lab was completed using Visual Studio 2010 and hosted on IIS 7.5. So there! Microsoft tools can also get the job done! The right tool for the job.

 

So all in all, the day was a success. Some surprises as to offerings by Google, who seem to also be adopting a cloud service offering and some really cool education regarding HTML 5

 

Thanks Google, for the time, the presentations and the prize. Only piece of advice I have is to perhaps include more labs, less rushed time slots and a little more food at lunch time Smile

 

As for the audience, I urge you to please formulate your thoughts before asking a question. Babbling along trying to create a question and sound intelligent at the same time just puts people to sleep. Make the question short and too the point. Give the speaker the opportunity to respond and leave it at that. Do not engage in a conversation with the individual, it is just rude and inconsiderate to the rest of the audience, if you want to explore your questions more in depth take it offline. Probably the most embarrassing moments for me (as a South African) was the questions around “What Google is going to do for the poor with regard to giving them mobile devices” and then the question regarding what Google was going to do about the fact that a 2 year old device wasn’t going to run the Android Ice Cream Sandwich (Android 4). Lets be honest here, 2 years in the technology space is a long time. I hate to admit it but it is. I also get upset with the fact that we toss out hardware like toilet paper but we cannot expect Google to make sure their Android OS is backwards compatible with the plethora of hardware vendors previous devices. Sure this was a Google Nexus device but let also not kid ourselves as to the maturity of the Android OS. It is a relatively new OS in the grand scheme of things and unfortunately if we are going to be early adopters these are the prices we are going to pay. Perhaps what we should do is petition the device manufacturers to work more closely together with Google.

 

Another thing to remember is that the more backwards compatible a piece of software is, the more bloated it will become. In the mobile space you cannot afford bloat. A mobile OS needs to be lean and tight. Doing only what it absolutely has to. With limited power we cannot go overboard the way we do with our personal computers. (This includes Mac)

 

Well I think I have pretty much covered everything and the next time I will 1) Prepare something for the Hackathon and 2) definitely attend the next developer day.Time to see if I can get a Microsoft developer day in somewhere as well Smile

 

Thanks again to everyone that made today what it was and I enjoyed meeting those that I did and those that I didn’t, well maybe next time Smile

Jenkins, Glassfish 3 and Windows 2008 R2

By Kenneth 'RabidDog' Clark at October 06, 2011 23:51
Filed Under: Java, Code, Web, Continuous Integration

Right lets get cracking. First thing you going to want to do is grab the Jenkins files available at http://mirrors.jenkins-ci.org/. Select the package you looking for. The WAR file is the web application deployable to containers such as Tomcat or Glassfish. There is also a standalone version but seeing as I want to brush up my Glassfish skills I decided to grab the WAR file.

 

Now this is were I generally start getting extremely nervous. In my experience, deploying these things on app servers is always a nightmare requiring tweaking and additional work. So here we go.

 

In the Glassfish administration console, select the applications link. This will give you a list of currently deployed applications on the server. Right now I have zero Smile So, select the deploy button on the grid header, select the browse button and navigate to your jenkins.war file.

 

Once you have done all this you will notice that Glassfish has conveniently detected that it is a web application, suggested a context root and an application name. Select the the item “server” in the virtual servers list and make sure “Enabled” is checked. Proceed to select anything else you want the server to handle. I just want to get this deployed so I am going to keep it minimal. Once you are satisfied click the “OK” button on the bottom right of the page. I was pleasantly suppressed to see that the deployment went off with out a hitch! If successful you will be returned to the Applications list with jenkins listed there now. On the right of the grid you will see links to perform actions. Select the “Launch” link. This will take you to a web page giving you the URL for the http location and the https location.

 

Click the link you want and wait for jenkins to perform it’s initial operations. If all goes well, you will be presented with the dashboard to perform your configuration and maintenance.

 

Just as a side note, having been involved with Glassfish 1 and 2 then slacking off during development of 3 I must admit that the level of the application server has increased significantly! I am very impressed at how the admin UI has been fixed and the ease of use and deployment. Hats off to the development team.

 

Oh, just as point, for those that think they have to go buy super powered machines, this box is running 1GB RAM with one of the first AMD 64 bit processors and runs fine, so now need to empty the wallet just yet Smile Bear in mind that this is a personal machine so it isn’t subject to huge loads. Will do some stress testing and see where it gets me.

 

Other than that, have fun!

Glassfish 3 on Windows Server 2008 R2

By Kenneth 'RabidDog' Clark at October 06, 2011 23:27
Filed Under: Java, Web, Open Source

First things first. Lets get the downloads out the way.

 

Go grab java 7 from http://www.oracle.com/technetwork/java/javase/downloads/index.html

Then go and grab Glassfish 3 from http://glassfish.java.net/public/downloadsindex.html#top (I went with the open source edition)

 

Install Java 7 (you only need to do this if you don’t have a JRE 6 or higher). Then you need to install Glassfish. Follow the prompts. I left the installation location the same (c:\glassfish3).

 

Next thing you need to do is navigate to c:\glassfish3\bin. I had to open the asadmin.bat file and edit it. I had to change all virtual references to physical references (perhaps because the environment variables hadn’t been set yet)

 

Next thing, open a command prompt and navigate to c:\glassfish3\bin. We are going to create a domain now, you can do this by entering the command asadmin create-domain. This will walk you through the domain creation process. Once that is done you can run the command asadmin start-domain. To verify that the domain has started navigate http://localhost:4848 (or change the port to the admin port you stipulated). If you see the admin console everything is running 100%

 

Next post I am going to explore deploying Jenkins http://jenkins-ci.org/

 

References:

http://glassfish.java.net/public/downloadsindex.html#top

http://blogs.eteration.com/blog/?p=494

http://www.oracle.com/technetwork/java/javase/downloads/index.html

file:///C:/glassfish3/glassfish/docs/quickstart.html

SOAP Message validation in WCF

By Kenneth 'RabidDog' Clark at September 27, 2011 18:16
Filed Under: C#, Web

Well, after a bit more research it seems that Microsoft does support validating outgoing messages. It still doesn’t resolve the issues in my post (http://kenneth.gotcheese.co.za/post/Microsoft-cannot-stop-being-a-rebel.aspx) but does answer where Microsoft feels any validation should be done regarding SOAP. On one hand I agree with them but on the other I disagree. They allow for the INotify property if you enable data binding but they can’t enable the max length on field? Strange I know but I suppose they have their reasons!

 

Anyways, you are able to validate the outgoing message against the declaring XSD. Again this sounds fine but has a few issues, namely those around exposing the XSDs for public consumption. I suppose you could get round this via HTTP authentication but that means you have to push authentication backwards and forwards. The other option is to distribute the XSDs with the client proxies. I see that the Service Reference created in Visual Studio 2010 does exactly this (after rewriting your XSDs for you Smile).

 

To perform the validation you need to first create a client message inspector that implements the IClientMessageInspector.

 

Something like this:

public class MessageInspector : IClientMessageInspector

 

Once you have done that you need to implement the relevant methods (those that the interface declares).

 

The method we are going to focus on is the BeforeSendRequest method. In this method we will perform the validation using the XSD for the message. What you will need to do is check that the Message object is not a fault. If it is a fault return at this point. Next you want to get the Body of the Envelope. This can be achieved by calling GetReaderAtBodyContents()

var bodyReader = message.GetReaderAtBodyContents();

 

Next you going to need to get the XSD for your message. This might prove tricky if you have not got a naming convention that can be used to derive the name of the XSD. A way around this might be to load up the locations of the XSDs into a dictionary (perhaps even load all the XSD Schemas into that list so you can look it up via targetNamespace) but that I will leave to your imagination.

 

Once you have the body contents you open up the XSD file, load it into an XmlReader and read the XML document. If any errors occur, the callback method attached to the XmlReaderSettings.ValidationErrorHandler will be called.

 

First we configure the XmlReaderSettings:

var xsdPath = "path\\to\\your\\file.xsd";

using (var stream = File.OpenRead(xsdPath)) {

   var schemaReader = XmlReader.Create(stream);

   var readerSettings = new XmlReaderSettings
                              {
                                     CloseInput = true,
                                     Schemas = new XmlSchemaSet(),
                                     ValidationFlags = XmlSchemaValidationFlags.None,
                                     ValidationType = ValidationType.Schema
                              };


   readerSettings.Schemas.Add("http://yournamespacehere.com", schemaReader);
   readerSettings.Schemas.Compile();

    //Attach to error event handler
   readerSettings.ValidationEventHandler += new ValidationEventHandler(InspectionValidationHandler);
}

 

Then to validate the document you create an instance of a reader, attach the reader settings and read the document like so:

 

var wrappedReader = XmlReader.Create(bodyReader, readerSettings);

var startDepth = wrappedReader.Depth;

while (wrappedReader.Read())
{
      if (wrappedReader.Depth == startDepth && wrappedReader.NodeType == XmlNodeType.EndElement)
      {
             break;
      }
}

If there are any errors in the document they will be raised while reading and pushed to the callback handler.

 

For more information one solving this problem check out the references I found while solving it:

 

JavaScript Hashmap and MVC 3

By Kenneth 'RabidDog' Clark at September 22, 2011 23:00
Filed Under: C#, Code, JavaScript, Web

I was fiddling with an idea that allowed rows to be dynamically added to an html page and deleted off the page. This became a bit tricky because I couldn’t identify the row I wanted to get rid of.

 

Eventually what I ended up doing was maintaining a list of the rows in a JavaScript object that functioned the same as the hash map and as opposed to deleting one row at a time I would remove the entire list from the page and re render it. The reason for this is when submitting arrays to an MVC 3 controller based on a strongly typed model you have to name the hidden input fields sequentially. Something like this:

 

<input type="hidden" id="EventList_0_SomeId" name="EventList[0].SomeId"  value="myid" />
<input type="hidden" id="EventList_0_Capacity"  name="EventList[0].Capacity"  value="25" />

 

As you probably gathered the next one would increment the 0 in the id and the 0 in the name to 1. The next one 2 and so on and so forth.

 

<input type="hidden" id="EventList_1_SomeId" name="EventList[1].SomeId"  value="myid" />
<input type="hidden" id="EventList_1_Capacity"  name="EventList[1].Capacity"  value="25" />

<input type="hidden" id="EventList_2_SomeId" name="EventList[2].SomeId"  value="myid" />
<input type="hidden" id="EventList_2_Capacity"  name="EventList[2].Capacity"  value="25" />

<input type="hidden" id="EventList_3_SomeId" name="EventList[3].SomeId"  value="myid" />
<input type="hidden" id="EventList_3_Capacity"  name="EventList[3].Capacity"  value="25" />

Just as a pointer, the name and the id of the input have to be declared or the MVC 3 controller will not resolve the values. The above example is a model that contains a list of objects that contain a property called SomeId and Capacity. If you do it the way I have illustrated above, it will resolve into a nice object representation in the controller that you can manipulate.

 

The Hashmap declaration:

function Map()
{
    // members
    this.keyArray = new Array(); // Keys
    this.valArray = new Array(); // Values
        
    // methods
    this.put = put;
    this.get = get;
    this.size = size;  
    this.clear = clear;
    this.keySet = keySet;
    this.valSet = valSet;
    this.showMe = showMe;   // returns a string with all keys and values in map.
    this.findIt = findIt;
    this.remove = remove;
}

function put( key, val )
{
    var elementIndex = this.findIt( key );
    
    if( elementIndex == (-1) )
    {
        this.keyArray.push( key );
        this.valArray.push( val );
    }
    else
    {
        this.valArray[ elementIndex ] = val;
    }
}

function get( key )
{
    var result = null;
    var elementIndex = this.findIt( key );

    if( elementIndex != (-1) )
    {   
        result = this.valArray[ elementIndex ];
    }  
    
    return result;
}

function remove( key )
{
    var result = null;
    var elementIndex = this.findIt( key );

    if( elementIndex != (-1) )
    {
        this.keyArray = this.keyArray.removeAt(elementIndex);
        this.valArray = this.valArray.removeAt(elementIndex);
    }  
    
    return ;
}

function size()
{
    return (this.keyArray.length);  
}

function clear()
{
    for( var i = 0; i < this.keyArray.length; i++ )
    {
        this.keyArray.pop(); this.valArray.pop();   
    }
}

function keySet()
{
    return (this.keyArray);
}

function valSet()
{
    return (this.valArray);   
}

function showMe()
{
    var result = "";
    
    for( var i = 0; i < this.keyArray.length; i++ )
    {
        result += "Key: " + this.keyArray[ i ] + "\tValues: " + this.valArray[ i ] + "\n";
    }
    return result;
}

function findIt( key )
{
    var result = (-1);

    for( var i = 0; i < this.keyArray.length; i++ )
    {
        if( this.keyArray[ i ] == key )
        {
            result = i;
            break;
        }
    }
    return result;
}

function removeAt( index )
{
  var part1 = this.slice( 0, index);
  var part2 = this.slice( index+1 );

  return( part1.concat( part2 ) );
}
Array.prototype.removeAt = removeAt;

 

The usage is just as simple. Include the JavaScript file and then:

var map = new Map();

map.put("key", value);
map.remove("key");

//etc

 

A really nice feature is that it does not duplicate keys but performs an “update” on the object at that key. So if you want to retrieve all the keys you can do something like this:

 

for (var i = 0; i < hashMap.keyArray.length; i++) {
    var value = map.valArray[i];
    var key = map.keyArray[i];
    console.log(key, value.toSource());
}

 

 

I found the Hashmap declaration over here http://freecode-freecode.blogspot.com/2007/06/hashmap-object-in-javascript-like.html

 

Some other interesting tid bits on the MVC embedded arrays, lists and editors for:

Internet Explorer 8 and JQuery 1.6.x

By Kenneth 'RabidDog' Clark at September 21, 2011 13:49
Filed Under: Code, JavaScript, Web

Recently I launched a new site for a friend http://www.motoschool.co.za. Everything was working really well till the site was opened in Internet Explorer 8.

 

So I set about trying to figure out what was going on. Every time a link was opened the tab would crash and recover. My initial thoughts where that something was wrong with the JavaScript. So I started commenting out code to try and establish what was going on. Then I thought there might be something wrong with the CSS that was causing the tab to crash. I went around in circles for about an hour till I decided to scrap everything.

 

I commented out all the styles and scripts and the site stopped crashing the tab. Then I started adding back the references one by one till the browser crashed again. This happened as soon as I included the JQuery 1.6 min file. I couldn’t figure out what to do till a ray of sunshine hit me and I thought about the JavaScript parsing engine in Internet Explorer 8. What if the parsing engine was failing on something and causing so sort of memory leak or overflow?

 

So I proceeded to download the uncompressed version of the JQuery library and added it. Holding my breath, I refreshed the page and clicked around a few times. The site was now working!

Facebook vs Google+

By Kenneth 'RabidDog' Clark at September 19, 2011 20:13
Filed Under: Personal, Web

I logged on to www.facebook.com today and noticed something called “smart lists”. Upon closer inspection this feature is a mechanism to group friends and view only their feeds. Nice, so now you can isolate the feeds you want to see as opposed to having to sift through endless notifications from apps your friends are using that they need “an axe to chop down trees” or a neighbour “has found your long lost gold fish” or any other arbitrary rubbish that gets pushed to your news feed trying to get you to consume the application. So, yeah neat and original idea. Oh wait, it is not original! Doesn’t Google+ circles offer the same functionality? Well I suppose it does, I mean after all if it looks like a circle and acts like a circle it must be a circle “symbol crash”.

 

Upon seeing this I remembered that www.facebook.com was suing someone over a very similar infringement of their beloved news feed.

 

So after reading an interesting article about who is suing who in the mobile space I thought I would see who www.facebook.com is suing (Google Search Results) I almost wet myself laughing when I viewed the results. So I thought, why not see who else is suing who. My next stop was who is Google suing (Results). The more I went on the more I started realising that software not only makes business supposedly run better but it is currently, single handed, funding law firms. With so much effort being pushed into suing people to get money that they feel is theirs no wonder there has been no significant break through since world war 2.

 

Let me validate that statement. World war 2 saw the discovery and implementation of:

Jet aircraft

Fuel injected engines

Ballistic missiles

Nuclear Fission 

Assault Rifles

Radar

Sonar

Precursors to the computer

Devices used in household appliances

Multi track recording

Synthetic rubber

 

and the list goes on and on. So tell me, what have we discovered since world war 2? Asides from making computers small and more powerful? Asides from increasing the capacity of previous discoveries? What have we done in the 66 years after world war 2? Well in my estimation, squat.  Argue all you want but provide me with proof. All we have done is create a society based on rampant consumerism, technological devices get upgraded and upgraded and upgraded, even though we are using less than 50% of the actual capacity of the machines.

 

Anyways this isn’t supposed to be a rant about society, it is just a pointer to how incredibly backwards we have everything. Perhaps I should do an article about creating opportunities for innovation in this space. Maybe I will if I get time. In the mean time, let carry on suing everyone because at the end of the day surely no one in the worlds population of ~6,775,235,700 people  could possibly have the same idea as me. I mean, I am just that special!

JSON serialization and deserialization

By Kenneth 'RabidDog' Clark at August 21, 2011 23:46
Filed Under: Code, JavaScript, Methodologies, Web

More JSON goodness! While doing my tests using the Jasmine framework I started noticing in my code that the data I was submitting needed to be serialized from a JavaScript object to a JSON representation. One would think that this might be real easy but alas, it seems that only the newer versions of the browsers implement the stipulated methods to serialize the object.

 

Even everybody's favourite JavaScript library, JQuery, doesn’t implement a mechanism to do this. (check out http://stackoverflow.com/questions/2277405/json-stringify-missing-from-jquery-1-4-1 for further discussions and http://api.jquery.com/category/utilities/ for confirmation)

 

So I started going through posts and pointers from other developers. The first set of posts I read used a customised mechanism of serializing the object (http://blog.stchur.com/2007/04/06/serializing-objects-in-javascript/ and http://www.sitepoint.com/javascript-json-serialization/). While this looks very cool I wasn’t willing to replicate the functionality just in case I missed something.

 

Then I came across http://www.json.org/js.html which defined a mechanism to do what I needed but I still wasn’t convinced. So after a while of reading I came across (http://stackoverflow.com/questions/2277405/json-stringify-missing-from-jquery-1-4-1 –> last post which points to http://code.google.com/p/jquery-json/). HOOAH! This did exactly what I wanted and wrapped it up nicely.

 

So off I go implementing the methods using the functions provided in jquery-json. The more I did, the less I liked it. The code was starting to smell a bit. So instead of doing the the following over and over and over:

   1: //Convert to JSON string
   2: var jsonString = $.toJSON(myObject); 

I decided it would probably be better to wrap the entry point into this mechanism into a single entry point for my application. Allowing me to swop out the implementation if need be without having to remove/rename a stack of references. So it ended up looking like this.

   1: //Back to my handy helper class :)
   2: function Helper() { }
   3:  
   4: //Convert JSON to object
   5: Helper.getObject = function (jsonString) {
   6:     return $.evalJSON(jsonString);
   7: }
   8:  
   9: //Convert object to JSON
  10: Helper.getJson = function (object) {
  11:     return $.toJSON(object);
  12: }

 

A great deal of people might think this is over complicating it, adding an unnecessary layer etc. I would argue that it decouples my dependency on the jquery-json library or at least isolates it’s usage to one location. As pointed out previously, should I need to call a different library I would only have to change it in one file. Nothing really fancy about the code but might spark other ideas. The jquery-json library also implements a secureEvalJSON which seems to prevent possible abuse of the JSON returned. With that being said I am going to change my getObject implementation to use it Smile

 

References:

http://code.google.com/p/jquery-json/

http://www.metaltoad.com/blog/using-jsonp-safely – interesting post on JSONP security



I am South African. Always have been always will be. I love my country. I love my wife and two children.


I also really enjoy solving problems. I currently work as a Software Architect exploring new solutions for business problems. Having been round the block a few times I enjoy showing new developers how best to solve problems, how to find answers and how to approach solution development.


In my spare time I enjoy riding my super bike, training in Systema and horsing around with my family.


Month List

Visitors

Twitter Feed

6. February 18:01
Unit tests don't check if code works. They PROVE the code works!

12. January 23:34
@Annaling horrific. People like that should face sever punishment. Unless of course they tried to find the cat :(

12. January 08:28
@Annaling to fix cat problems u need a dog :)

9. January 15:34
@UnexpectedPippa my boy is 2. They rock! My daughter, son and myself have endless fun with them!