activa's blog

.NET, Web, Mobile and more stuff I can't stop talking about

Browsing Posts published by Philippe Leybaert

Yesterday I saw a question on StackOverflow by someone who wanted to have something similar to real classes in Javascript. This caught my interest and tried to come up with a very simple way to define “traditional” classes in Javascript.

I’m sure this has been done several times before by hundreds of people, but I wanted to see what I could do with my limited knowledge of Javascript.

The idea was to be able to do something like this:

var Shape = new Class( { color:"white", area: function() { return 0.0; } } );

var Square = Shape.Derive({side:0.0, area:function() { return this.side*this.side; } } );
var Circle = Shape.Derive({r:0.0, area:function() { return this.r*this.r*Math.PI; } } );

var shapes = [];

shapes.push(new Square({side:5.0}));
shapes.push(new Circle({r:5.0}));
shapes.push(new Square({side:3.0 , color:"red"}));

for (var i in shapes)
  console.log("area = " + shapes[i].area() + " , color = " + shapes[i].color);

/*
Should output:
area = 25 , color = white
area = 78.53981633974483 , color = white
area = 9 , color = red
*/

The code required to make this happen is surprisingly simple. A real Javascript ninja could make it even shorter I’m sure:

Class = function(parent, options) {
    if (parent && typeof(parent) != 'function') {
      options = parent;
      parent = undefined;
    }

    var newClass = function(o) { $.extend(this,o); };

    if (typeof(parent) == 'function') {
      newClass.prototype = new parent();
    }

    $.extend(newClass.prototype,options);

    newClass.Derive = function(o) { return new Class(newClass,o); };

    return newClass;
  };

I admit, it does use jQuery ($.extend), but it wouldn’t be hard to write a simple replacement function for that one. It simply copies the properties of a given object to another object. Maybe I’ll add that when I have some time to burn.

As you can see, there are 3 ways to create a class:

var NewClass1 = new Class( prototype );
var NewClass2 = new Class( BaseClass, prototype );
var NewClass3 = BaseClass.Derive( prototype );

In all cases, the prototype parameter is optional. It is used to define functions and default properties for each class.

That’s it. If you think it’s useful, feel free to use it for whatever you like.

In the current version of Windows Phone, there’ s no support for a built-in local database. This will be taken care of in the next release of the OS (codename “Mango”), which will be released late this year. Mango will have a built-in SQL CE (-like) database which can be accessed using LINQ to SQL. At the time of writing, there seem to be a few drawbacks you’ll have to keep in mind:

  • The backend store is in a non-standard format
  • It’s not possible to execute ad-hoc SQL queries (neither DDL nor DML)
  • Shipping a database file with your app is a complicated process

If any of these limitations is a blocker for your application, or you just want to have a local database right now, using SQLite is a great alternative.

Using CoolStorage for easy SQLite access on Windows Phone

By far the easiest way to use a local SQLite database in your Windows Phone app is by using the free, open-source Vici CoolStorage ORM library. There is a specific native build for Windows Phone which includes a driver for SQLite.

Adding CoolStorage to your app is pretty straightforward:

  • Option 1: If you have NuGet installed in VS2010, add the Vici CoolStorage package (available in the NuGet gallery)
  • Option 2: If you don’t have NuGet, download the binaries from the Vici Project website and reference both Vici.Core.WP7.dll and Vici.CoolStorage.WP7.dll

Then you add the following line of code somewhere in your initialization code:

    CSConfig.SetDB("mydb.sqlite"); // "mydb.sqlite" is the name of your database file

By default, CoolStorage will create the database file for you if it doesn’t exist. But for this article, we’ll assume you already have a database with data (see here)

CoolStorage is a full-blown ORM with support for relations, lazy loading, relation prefetching, etc, so you will be able to use all of that in your Windows Phone app, but for once I won’t go into that, because if you want you can also use CoolStorage as a lightweight data layer and execute ad-hoc SQL queries.

Here are some examples:

// execute a SQL insert statement
CSDatabase.ExecuteNonQuery("insert into customer (name,city) values (@name,@city)",
                                  new { name="Microsoft", city="Redmond" });
// execute a select SQL statement and map the result to a class

class QueryResult
{
   public string name;
   public int numsales;
   public decimal totalsales;
}

QueryResult[] results = CSDatabase.RunQuery<QueryResult>(
                                        @"select name,count(*),sum(s.total)
                                            from salesperson sp
                                            inner join sales s on s.salespersonid=sp.id
                                            group by sp.name");
// retrieve a scalar value (for example, the total number of customers)

int numCustomers = CSDatabase.GetScalar<int>("select count(*) from customer");

So if you’re not that crazy about ORM’s, or you want to execute some very specific SQL satements, you can do that very easily on Windows Phone with a local SQLite db.

Shipping a SQLite database file with your app

If you have an existing SQLite database file and you want to ship it with your application, you’ll have to make it available in Isolated Storage. This is pretty straightforward, but not always obvious:

First, add your database file to your Visual Studio project and set the build action to “Content” (also leave “Do not copy”).

Then add the following piece of code before calling CSConfig.SetDB(…):

string fn = "mydb.sqlite";

StreamResourceInfo sr = Application.GetResourceStream(new Uri(fn, UriKind.Relative));

IsolatedStorageFile iStorage = IsolatedStorageFile.GetUserStoreForApplication();

if (!iStorage.FileExists(fn))
{
   using (var outputStream = iStorage.OpenFile(fn, FileMode.CreateNew))
   {
      byte[] buffer = new byte[10000];

      for(;;)
      {
         int read = sr.Stream.Read(buffer, 0, buffer.Length);

         if (read <= 0)
             break;

         outputStream.Write(buffer, 0, read);
      }
   }
}

// Now you can use your database

CSConfig.SetDB(fn);

Having the possibility to ship a SQLite database file with your app is especially useful if you want to share a pre-built database with other mobile platforms, since both iPhone and Android have built-in support for SQLite.

In a next post, I will show how to use the ORM features of CoolStorage.

And while you’re at it, you might as well use MonoTouch (and CoolStorage) for building the iPhone version of your app, allowing you to reuse all of your business logic and data layer code.

Our CoolStorage ORM has been around for quite a while, but I felt that it was particularly useful as a data access layer on smaller scale applications and mobile devices running .NET (or some flavor of it). Not everybody needs a massive (*) data access layer like Entity Framework or NHibernate.

About a year ago support for MonoTouch was added to the core library, which meant you could use SQLite databases in iPhone and iPad applications when using MonoTouch. Porting CoolStorage to MonoTouch was fairly straightforward because the MonoTouch guys did a great job by building an ADO.NET provider for SQLite in the core MonoTouch library.

Next up: Windows Phone support. I wanted to get this done in time for Microsoft’s Mix conference, but I was shocked to learn there was no ADO.NET or System.Data available. This meant the complete data access layer had to be refactored to use custom interfaces instead of ADO.NET interfaces and classes, which I did. A few days before MIX, CoolStorage was running successfully on Windows Phone using an SQLite databases in isolated storage.

To recap, Vici CoolStorage now supports the following databases out of the box:

  • SQL Server (on .NET)
  • MySQL (on .NET)
  • SQLite (on .NET)
  • SQLite (on MonoTouch)
  • SQLite (on Windows Phone)

The version supporting Windows Phone (1.5) is not yet released, but a development build can be downloaded from the Vici Project website. The final release of version 1.5 is planned before the end of April.

(*) Rob Conery wrote a very useful and lightweight data layer which he named “Massive“. So I’m obviously not referring to that.

Handling dates in JSON responses is something many web developers struggle with. The JSON Specification doesn’t specify how dates should be represented in a JSON string, so every implementation invented its own way of representing dates.

These are some of the formats in use today:

  1. {“date”: new Date(ms_since_epoch) }
  2. {“date”: Date(ms_since_epoch) }
  3. {“date”: “Date(ms_since_epoch) }
  4. {“date”: “/Date(ms_since_epoch)/” }
  5. {“date”: “\/Date(ms_since_epoch)\/” }
  6. {“date”: “yyyy-MM-ddTHH:mm:ssZ” }
  7. {“date”: “yyyy-MM-ddTHH:mm:ss” }

Formats 1 and 2 are actually invalid JSON. However, they’re the only formats that were handled correctly by jQuery 1.3.2 and earlier. eval() also handles these. But again, it’s not valid JSON.

That leaves the other 5 formats, which are valid according to the JSON specs.

Starting with version 1.4, jQuery’s built-in JSON evaluator will check if there is a function JSON.parse() available. If it is there, it will use that function to evaluate JSON objects. If not, jQuery will use the “unsafe” eval() way of parsing JSON. JSON.parse() is a function from the json2.js file, which can be downloaded from the JSON website

The problem

JSON.parse() doesn’t handle dates. At all. But it does have a way to handle non-standard values by specifying an extra parameter “reviver”, which is a function that takes a value and returns the value converted to the data type of your choice.

For example: if you want to handle the ISO date format correctly, you can do this:


var parsedObject = JSON.parse(jsonData, function (key, value) {
   var a;

   if (typeof value === 'string') {
     a =/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);

     if (a) {
       return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));
     }
   }

   return value;
});

(this example is taken from the json2.js source code)

This function will check if a string value parsed from the JSON string is in a specific date format, and return a Javascript date object.

You could expand this function to handle every other possible date format, which shouldn’t be too hard to do, but how do you tell jQuery to use this “reviver” function?

Well, you can’t.

The solution

There’s an easy solution: after including json2.js, redefine the JSON.parse() function so it passes your conversion (reviver) function to the original JSON.parse() function:

<script type="text/javascript" src="json2.js"></script>
<script>
(function() {
   var _origParse = JSON.parse;

   JSON.parse = function(text) {
      return _origParse(text, function(key, value) {
         var a;

         if (typeof value === 'string') {
            a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);

            if (a)
                 return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));

            if (value.slice(0, 5) === 'Date(' && value.slice(-1) === ')') {
               var d = new Date(value.slice(5, -1));

               if (d)
                  return d;
            }
         }

         return value;
      });
   }
})();

</script>

Now when you return some JSON object to your jQuery script, dates will be parsed correctly, without having to change your code. The code snippet above handles cases 3 to 6 correctly. I’ll leave it up to you to add case 7…

The iPhone is a fabulous device, few people will argue about that.

But…

When I started developing iPhone apps about a year ago, it felt… awkward. If you want to create an app for the iPhone, you have to use Objective C, which was invented sometime around 1934. I’m kidding of course: it was 1986, but that’s a small detail.

Apart from the odd syntax (which is fine, other languages have odd syntax as well), I was amazed by the lack of basic language and framework features we take for granted these days.

To illustrate the contrast, I’ll show a small function that strips the time portion of a date, written in Objective C:

+ (NSDate *) stripTime:(NSDate *) date {
   NSCalendar *gregorian =
         [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

   NSDateComponents *components =
          [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
                       fromDate:date];

   date = [gregorian dateFromComponents:components];

   [gregorian release];

   return date;
}

The same thing in C#:

public DateTime StripTime(DateTime date)
{
    return date.Date;
}

I guess I have been spoiled by C#. Can you imagine what it would be like to consume a SOAP webservice from Objective C? Well, check this out. (I have to admit: it received a 5-star rating, so I guess it was worth the 62 hours spent on it)

PS. I realize I suck at Objective C, and I’m sure a better Objective C developer can shave off a line or 2 of my code, but you get the picture…

Thank god a few geniuses over at Novell created MonoTouch

I’ve been developing iPhone apps for the past 9 months using the recommended development tools, being Xcode, Interface Builder and the iPhone SDK.

Being a C# .NET programmer didn’t make this easy: Objective-C is… weird and… primitive. Dealing with pointers after 10 years of focusing on problems instead of memory addresses is a slight culture shock, but luckily having previous C and C++ experience helps a lot.

In September last year, the geniuses (by lack of a stronger word) at Novell’s Mono team came up with MonoTouch, a C# cross-compiler that allows you to build iPhone apps using .NET and C#, including the use of most of the .NET Framework. I’m not going to go into detail on how this works. Enough has been written about this subject.

One feature of MonoTouch caught my attention: as of version 1.2, an ADO.NET provider was added for accessing the iPhone’s native SQLite database format. A relational database accessed from C# code desperately needs an ORM, don’t you agree? So last weekend I decided to try and port the CoolStorage ORM to MonoTouch. It wasn’t as easy as I thought, because of some severe limitations in the version of SQLite installed on the iPhone, but in the end I got it working, and working well.

To give you an idea of the time you’ll save by using an ORM like CoolStorage on the iPhone, I will present three examples:

  1. Reading a list of records using the iPhones’s SQLite library (C / Objective-C)
  2. Reading a list of records using ADO.NET + MonoTouch
  3. Reading a list of records using CoolStorage + MonoTouch

We’re not going to make it too complicated. The example reads a list of customer records. It retrieves the ID, Name and City. No filters are being applied, simply a list of customers ordered by Name. After that, it prints the records to the console.

The examples also omits the declaration of the Customer class (which is used to hold a single customer record)

Native Objective-C example:

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];

databasePath = [documentsDir stringByAppendingPathComponent:@"mydb.db3"];

sqlite3 *database;

customers = [[NSMutableArray alloc] init];

if(sqlite3_open([databasePath UTF8String], &amp;database) == SQLITE_OK) {
   const char *sql = "select id,name,city from customer order by name";
   sqlite3_stmt *stmt;

   if(sqlite3_prepare_v2(database, sql, -1, &amp;stmt, NULL) == SQLITE_OK) {

      while(sqlite3_step(stmt) == SQLITE_ROW) {
           Customer *customer = [[Customer alloc] init];

           customer.CustomerID = sqlite3_column_int(stmt, 0)];
           customer.Name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 1)];
           customer.City = [NSString stringWithUTF8String:(char *)sqlite3_column_text(stmt, 2)];

           [customers addObject:customer];

	   [customer release];
      }
   }

   sqlite3_finalize(stmt);
}

sqlite3_close(database);

for (int i=0;i&lt;[customers count];i++) {
   Customer *customer = [customers objectAtIndex:i];

   NSLog("ID: %d, Name: %@, City: %@",customer.CustomerID,customer.Name,customer.City);
}

It’s pretty obvious that things will get unbearably complicated when you try to do things like accessing related records, persisting data to the database, and so on.

Now let’s introduce MonoTouch and ADO.NET.

ADO.NET example (MonoTouch):

string dbName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "mydb.db3");

var conn = new SqliteConnection("Data Source=" + dbName);

List customers = new List();

using (var cmd = conn.CreateCommand())
{
  conn.Open();
  cmd.CommandText ="select id,name,city from customer order by name";
  using(var reader = cmd.ExecuteReader())
  {
    while (reader.Read())
    {
      Customer customer = new Customer();

      customer.CustomerID = int.Parse(reader["id"].ToString());
      customer.Name = (string) reader["name"];
      customer.City = (string) reader["city"];

      customers.Add(customer);
    }
  }
}

foreach (var customer in customers)
   Console.WriteLine("ID: {0}, Name: {1}, City: {2}",customer.CustomerID,customer.Name,customer.City);

Now that’s a lot better, don’t you think? But still, it requires a lot of boilerplate code that’s just there to distract you from what you’re actually trying to do: read a list of records from the database.

So let’s move to the next level:

CoolStorage example (MonoTouch):

string dbName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "mydb.db3");

CSConfig.SetDB(dbName, false);

var customers = Customer.List().OrderedBy("Name");

foreach (var customer in customers)
   Console.WriteLine("ID: {0}, Name: {1}, City: {2}",customer.CustomerID,customer.Name,customer.City);

Well, you get the picture… Now you can focus on the application instead of data access technology. Isn’t this what it’s all about?

In case you want to use this in your own code, go ahead and grab the latest development build of CoolStorage, which now fully supports MonoTouch. It can be downloaded from the CoolStorage website.

Best of all, it’s open source…

Read till the end, because nothing is what it seems

What is equality?

Equality means different things in different programming languages. In most modern languages (C# for example), you can define your own terms of what equality means. In others you can’t.

Take javascript for example. There are actually two kinds of equality: normal equality and being identical.

To check if two variables or values are equal, you use:

f (a == b) {
  // ...
}

To check if two variables are identical, you use:

if (a === b) {
  // ...
}

Most articles (and even supposedly good books) define the latter comparison as being equal and of the same type. While this over-simplification may be true in the majority of cases, it is very inaccurate, because you have to know what “equal” means. I’m not going to talk about javascript’s normal equality operator (==), because enough has been written about that. I’ll focus on the === operator.

The correct meaning of === is that the 2 operands should be identical. This means they should reference the same object, or, in the case of value types, the values should be the same. Only numbers and booleans are value types. Strings behave as value types, but they are actually reference types.

Bringing this all together, let’s look at some examples of equality in javascript:

var a = 1;
var b = 1;

alert(a == b); // true
alert(a === b); // true

b = "1";

alert(a == b); // true
alert(a === b); // false

These are the obvious ones. Now the more interesting stuff:

var a = [1,2,3];
var b = [1,2,3];
var c = a;

alert(a === b); // false (these look equal to me, and of the same type)
alert(a === c); // true

Remember I mentioned that strings behave like value types? Now it becomes interesting:

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

And to make it really interesting:

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

I thought strings behave like value types? Well, it depends who you ask…

EDIT: As one of the commenters (zihotki) points out, the last example adds another twist to the story. Creating a string using the String() object constructor actually doesn’t create a variable of type “string”, but of type “object”. But you can use the object as a string. If you are unaware of this behavior, you can easily shoot yourself in the foot without knowing it.

Even before there was talk about ASP.NET MVC, there were a few open source MVC frameworks available for .NET. Among them, MonoRail was best known, but there was also ProMesh.NET, a .NET MVC web framework that evolved from a small personal project to a full-blown MVC framework for building web applications in .NET, without using ASP.NET WebForms.

Vici Project

A few months ago, just before the release of ProMesh.NET version 2.0, we decided to move the project to the Vici Project, a project that bundles several open-source frameworks for .NET 2.0. The idea of the Vici Project is to provide .NET developers with a collection of lightweight libraries and frameworks, and at the same time get the community involved in the development and support of these libraries.

To make it easier to get the community involved, a complete system was created with the following features:

  • Central SubVersion repository with online browsing (using WebSVN)
  • Automated build server (using JetBrains TeamCity)
  • Wiki infrastructure for maintaining documentation
  • Support forum

After several months of testing all of this, the project is finally ready to go live. There is still a lot of work to be done, especially on documentation, but I think there is no point in postponing the release.

The first sub-project of the Vici Project to be released is Vici MVC, formerly known as ProMesh.NET. Later this week, 2 other projects will be released as well: Vici Parser (formerly LazyParser.NET/SharpTemplate.NET) and Vici CoolStorage (formerly CoolStorage.NET)

    Vici MVC 2.0 new features (compared to ProMesh.NET 1.2)
  • New powerful URL routing engine. Also supports “extension-less” URLs with IIS 7.0 or IIS 6.0 (with wildcard mapping or URL rewriting)
  • Support for view components (“inline” controllers with templated views)
  • Support for sub-templates with parameters
  • Support for template macros
  • Configurable template syntax
  • Full C# 2.0 expression supported in templates
  • New template language syntax (the old one is still supported)

Anyone interested in contributing to the Vici Project, please let me know by posting on the forum (or by sending me a private message on the forum. My username is activa)

Early next year, a cool new service will go online targeted at web developers and designers. It will go by the name of dStyler.com but it’s a little hard to explain what the service will do, but I’ll start with a simple example:

It turns this into this
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vel arcu eget lorem dapibus molestie.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vel arcu eget lorem dapibus molestie.
With just a single line of CSS

What dStyler actually provides is real-time online image generation. It is a highly scalable REST-style webservice that generates images based on a custom-built URL. For example, the box on the right is generated by the following url:

http://dstyler.com/ufnqfr/204×254/bo-333/ib-fff-2/ro-5/gr-eef-b8e/gr-fff9-fff0-210×260/sh-0008-0-r3.jpg.

It is in a way similar to the Google Charts API and the Google static maps API.

Some of the things dStyler can generate:

  • Solid backgrounds
  • Gradients
  • Single or double borders
  • Drop shadows
  • Image embedding (useful for watermarks)
  • Special effects
  • Rounded corners
  • Slicing

The online administration interface allows you to:

  • Build images in an interactive way (to generate the URL for you)
  • Upload images to your account that can be used for generating images

Best of all, dStyler.com will be a free service

We are currently looking for people interested in beta testing this service. So if you’re interested, contact me at beta -at- dstyler -dot- com (I know, I hate these obfuscated e-mail addresses more than anyone, but sadly enough, the world is a nasty world filled with f**king spammers)




This weblog is sponsored by The Vici Project.

We all love unit tests (do we?). Yes we do (repeat 100 times). And we all love mocking for making life easier, but sometimes we just want to write some simple unit tests that don’t require any mocking at all, because the code you are testing is easy to test without having to resort to all those mocking tricks

But what if you need to test code that relies on the date or some elapsed time? Let’s say you wrote a simple caching class that automatically removes items from the cache when a certain amount of time has passed since the last access. It’s tempting to slap some Thread.Sleep() calls in there to trigger expiration of cache items, but that will slow down your unit test, and most importantly, it’s not accurate. What if you want to test some edge cases? Like, what happens when you access an item at the exact timeout period?

A few years ago I worked with a brilliant Java architect who simply said: “just mock the time!”. What he meant was that I should create a fake DateTime class which behaves like the real DateTime class with one important difference: YOU control the time, not the system clock.

How is that done?

Simply create an interface with a single getter property of type DateTime:

public interface ITimeProvider
{
   DateTime Now { get; }
}

Then you create 2 classes that implement this interface: one that returns the real time, and one that can be used to control a “fake” time:

public class RealTimeProvider : ITimeProvider
{
    public DateTime Now { get { return DateTime.Now; } }
}

public class MockTimeProvider : ITimeProvider
{
    private DateTime _time;

    public DateTime Now { get { return _time; } set { _time = value; } }
}

Of course the class(es) you want to test should be aware of this. For example, our cache class could look like this:

public class Cache
{
     private ITimeProvider _time = new RealTimeProvider();

     public ITimeProvider TimeProvider { get { return _time; } set { _time = value; } }

     // ... the rest of the class implementation
}

In our class implementation, all calls to DateTime.Now should be replaced by TimeProvider.Now.

And now the fun part, faking the time in our unit tests:

[Test]
public void TestCacheTimeout()
{
    ITimeProvider time = new MockTimeProvider();
    Cache cache = new Cache();

    cache.TimeProvider = time; // Tell our cache class to use our fake time

    cache.Add("A" , 1); // add an item to the cache

    Assert.IsTrue(cache.Contains("A")); // check if it's added

    time.Now += TimeSpan.FromHours(1); // let one hour go by...

    Assert.IsFalse(cache.Contains("A")); // check if it was automatically removed
}

That’s pretty cool and simple, isn’t it? Wouldn’t it be nice if we could do the same in real life? ;-)

Next week I’ll talk a little about unit testing multithreaded concurrency issues…