Wednesday, May 16, 2007





We released our first product today: Keima Composer. In a nutshell, it helps mobile phone and wireless broadband engineers design their networks, by guiding the engineer to the best selection of sites from existing or available assets. More details can be found in the datasheet.

Releasing our first product has been a learning experience for all of us, and it's been fascinating to watch the product grow. Although this is "version 1.0", we've been using it in consultancy projects for some time. Earlier this year, we used Composer to reduce the number of sites needed rollout by a client by 30%.

We've got loads of ideas for new features and additions; watch this space...

Thursday, November 16, 2006

I'm pleased to report that our company Keima has just announced a partnership with WaveCall. We're all very excited about the opportunities this will open up for us.

The full text of the press release can be found here.

Friday, October 13, 2006


Update: The bug has been fixed! Now that's what I call service.




Update: the bug has been reported.



I've been working with a number of classes that expose events. These classes are marked as serializable so that they can be saved to the disk. However, I don't want the events to be serialized, as the built-in serializer will try to serialize all the subscribers to these events, and not all subscribers will be serializable (windows forms, for example). So, following the guidelines I've tagged the events of these classes with the [field:NonSerialized] attribute to prevent the subscribers to these events from being serialized. Unfortunately, this attribute appears to have no effect if the class is written in C++/CLI, although it does work for classes written in C#.


To demonstrate this, consider the following class that implements a String "Text" property and exposes a simple "TextChanged" event that can be used to notify interested parties of changes to it:

[Serializable]
public class TestClass
{
String text_;
public TestClass(String text)
{
text_ = text;
}

public String Text
{
get
{
return text_;
}
set
{
if (text_ != value)
{
text_ = value;
TextChanged(this, new EventArgs());
}
}
}

[field:NonSerialized]
public event EventHandler TextChanged;
}

 


If I wire up the "TextChanged" event to a control on a windows form, I can serialize instances of this class without worrying about it also trying to serialize the windows form as it does so.


Now implement the same class in C++/CLI:

[Serializable]
public ref class TestClass2
{
public:
TestClass2(String^ text)
: text_(text)
{}

property String^ Text
{
String^ get()
{
return text_;
}
void set(String^ text)
{
if (text_ != text)
{
text_ = text;
TextChanged(this, gcnew EventArgs());
}
}
}

[field:NonSerialized]
event EventHandler^ TextChanged;

private:
String^ text_;
};

 


Wiring up the "TextChanged" event of this class up to a windows form control and then try to serialize it causes a "Type 'Form1' in Assembly 'TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable" error. This occurs because the serializer has tried to serialize the event (and it's subscriber, the windows form) even though it was explicitly marked with the [field:NonSerialized] attribute.


I think this is just an error in the implementation of [field:NonSerialized] for C++ / CLI: I've tried using Lutz Roeder's Reflector to look at the contents of the assemblies, and it does seem to show that the [field:NonSerialized] attribute is missing from the C++ version.


A work around is to implement the event explicitly in the C++ version of the class by implementing "add" and "remove", and providing a suitable [NonSerialized] delegate as the event's backing store. However, it would obviously be better if the [field:NonSerialized] attribute worked correctly!


 

Friday, April 28, 2006

The eclectic corners of the Web never cease to amaze. Take Ian's Shoelace Site for example: there's more information about shoelaces there than I ever thought possible.

On the face of it, a website about shoelaces didn't sound very promising. But as I dug a little deeper, my inner boy-scout became fascinated by the different knots for shoelaces. I'm tempted to learn how to do the "Better bow" just so that I don't have to spend as much tying my son's shoes...

Monday, February 27, 2006

A searchable Calvin and Hobbes online database: how cool is that?

Thursday, February 09, 2006

This video shows that Rube Goldberg lives on in Halflife 2. This really shows off the possibilities of the physics engine (but it also proves that some people have way too much time on their hands...)

Tuesday, February 07, 2006

I've always been a big fan of Technical Lego, but Andrew Carol's Lego Difference Engine is really quite amazing. Very impressive!