Sunday, February 26, 2012

ASP.NET MVC 4 (Part 1 - Web API)

Since ASP.NET MVC was launched it became my favorite framework for developing web applications. I believe that Microsoft pushed all the right buttons with it: really well conceived, extensible, modular and testable, with every iteration of ASP.NET MVC bringing lots of great improvements.

Now, MVC4 is in beta, and as before many new features have been introduced. The official whitepaper with the release notes may be read here.

One of the new features is called "ASP.NET Web API" which is, according to Microsoft description:

"(...) a new framework for creating HTTP services that can reach a broad range of clients including browsers and mobile devices. ASP.NET Web API is also an ideal platform for building RESTful services."

Thursday, February 23, 2012

Visual Studio 11, .NET 4.5 and MVC 4

I've been wanting to try out the Developer preview of Visual Studio 11 and .NET 4.5 for some time. The problem is that new technologies and products have appeared/evolved at an incredible pace and it's difficult to keep oneself on track with all the novelties, specially when time has become such a limited asset.

Anyway, today is the day. It's .NET day! I've already installed:

  • Visual Studio 11
  • .NET 4.5 (C# 5.0)
  • MVC 4.0
  • SQL Server 2012
There are so many new things to try out, but I'm particularly interested in :

  • the new C# 5.0 features, like the "async" and "await" keywords
  • native WebSockets in .NET
  • The WebAPI in MVC 4.0
  • The new Mobile stuff of MVC 4.0
  • Asynchronous controllers with Tasks and the async keyword (hell yeah)
  • The new spatial features of SQL Server 2012
  • The new distribution features, like packaging javascript files, minification(?), MSBuild 4.5 features
  • etc, etc, etc
I'm not sure where to start, but I would like to do something that I haven't done before: besides doing regular tutorial posts I would like to accompany them with video-tutorials. Not exactly sure what will come out of this but, in the worst case scenario, should be a fun experiment :)

Anyway, gotta hurry, Visual Studio 11 expires in 127 days :P


Tuesday, February 21, 2012

Leaflet and HTML5

When one thinks of web map platforms Google Maps and Bing Maps are the two obvious choices. They're both free as long as you comply with some ground rules (i.e, terms of use) and don't exceed their usage limit. Unfortunately many applications can't adhere to those restrictions, leaving them with two options: purchase a commercial license or use a free alternative.

The most common free alternative is, without a doubt, OpenLayers. It provides an incredibly complete API (much more than Google and Bing) and integration with varied data sources (see examples here). The problem with OpenLayers, in my opinion, is it complexity. I'm also not particularly fond of the map control itself, but that's probably just personal taste.

Anyway, recently appeared a new kid on the block: Leaflet. It is a free lightweight mapping solution that provides a rich and extensible API, very much focused on HTML5. Also, it includes something that a lot of developers are asking for in Bing Maps V7: a client-side canvas layer. In this post I'm going to show how it works and develop a working prototype.

Update (21/01/2013): I've added a working example here

Saturday, February 18, 2012

Bing Maps and HTML5 (Part 4 - Final optimization)


In Part 3 of this "Bing Maps and HTML5" series I optimized the drawing of the Canvas quite a bit. The time taken to draw the canvas with 140.000 points was cut from 800ms to 75ms.

Anyway, and as I said previously, my target was (and is) the 40ms mark (1000/25) for a full canvas render with all the points. Why? Because I want the data to be continuously drawn while the map is zoomed/panned, and it has to be fluid.
After profiling my code, the bottleneck is still the function where wgs84 coordinates are converted to pixel coordinates.

Update 26/07/2012: I've added a working example here. I've also added a zip file with the project here.
I modified the demo so that the data is not fetched from a node.js but from a separate js file instead.

NHibernate Spatial (Part 3)


This is the third part of a series of posts regarding a simple example using NHibernate Spatial.


Actually, the title is kind of misleading as this post is just the wrap-up of the previous one, and I will not do much more regarding NHibernate Spatial (at least on this post). I'll just do the web page for the user interaction.

As I said, I'll create a simple map that, when clicked on  a specific point, paints the district that contains it. Not particularly useful but should be easy enough to understand and adapt to a more realistic scenario.

Thursday, February 16, 2012

NHibernate Spatial (Part 2)


Well, now that we've got a working NHibernate Spatial dll (from my previous post) let's put it to some good use.

I want to create a relatively simple example that uses spatial data with NH Spatial. For this tutorial I'm going to create a SQL Server 2008 database table with all of the Portuguese districts. Each district will have it's area stored in the database.


 There should be 18 polygons which fill the entire country and do not overlap (obviously).



I'll display a Bing map on a webpage. When the user clicks on a point of the map the district that contains that point will be fetched and the polygon will be displayed on the map with a certain color.



All of the queries will be done with NHibernate using NHibernate Spatial for the GIS operations, in this case the intersection between the click-coordinate and the corresponding district area.






Tuesday, February 14, 2012

NHibernate Spatial (Part 1 - Introduction)


NHibernate is a nice, tested and mature ORM. I've used it extensively since version 1.2 and it just keeps getting better and better.
It obviously provides many challenges, most of them regarding it's learning curve and some limitations, like handling spatial data at the database

Nowadays several Databases provide spatial extensions. The most notorious are probably PostGIS, Oracle Spatial and more recently SQL Server 2008. NHibernate does not natively handle this type of data but fortunately there's a library that fills this gap quite nicely: NHibernate Spatial Extensions.

In this post (or series of posts) I'm going to do a complete tutorial on setting up a SQL Server 2008 R2 database with spatial columns, mapping the tables to domain objects using NHibernate Spatial and querying them with HQL and QueryOver.

Sunday, February 12, 2012

KineticJS

HTML5 Canvas is freaking awesome and, although HTML5 has many improvements over HTML4, Canvas is probably one of the strongest and my personal favorite.

One of the things that I like about Canvas is that it provides a really nice low-level API, allowing for a great degree of control over the drawing. The problem is that, without using an external library, some simple tasks are a little bit cumbersome and hard to maintain.

For example, let's assume we want to create a simple page like:
          • Two boxes, one red and one blue.
          • Each box will show an alert when clicked upon.








Saturday, February 11, 2012

Bing Maps and HTML5 (Part 3 - Optimizing)


In my previous post I've created an example where about 140.000 points are retrieved from a MongoDB database and drawn on top of a Bing Maps using Html5 canvas.

If you recall, it took about 800+ ms to create and display the canvas above the map when all the points were visible. For the current scenario it's acceptable, as the drawing only occurs after the view changed event has ended. The problem is that I would like to have the drawing being continuously drawn during the view changed events. So, and for the motion to be fluid, each canvas image has to be drawn in less than 40 ms(1000/25).
Obviously it depends on the CPU of the client machine. My laptop is pretty average, so it will be a realistic benchmark. I'll post my attempts to achieve the 40ms target on my computer, starting with the current post, where I try to solve the most problematic operation.

Friday, February 10, 2012

Bing Maps and HTML5 (Part 2 - Canvas)


In my previous post I've created a very simple example of a map that fetches a bunch of coordinates from a Node.js server using HTML5 websockets.

As promised, I'm going to extend that example so that much more coordinates are fetched and displayed.

I've used a MongoDB database and loaded it with most of the Portuguese localities, on a total of 142912 coordinates. As one may suspect, it's impossible to draw so many pushpins on a map without resorting to some type of clustering technique. I won't do the clustering (at least on this post), and will instead draw them using one of the HTML5 goodies: the Canvas element.


Wednesday, February 8, 2012

Bing Maps and HTML5 (Part 1 - Basic)


I've just finished a working prototype of a very basic interaction between Bing Maps and Node.js.

The idea is very simple: open a map, fetch a bunch of coordinates (using websockets) and display them.

The end result should be something like this:



Sunday, February 5, 2012

Fast display of data in a map

Recently the HTML5 bandwagon has gained a lot more traction, and I'm going to develop a prototype for a map with fast client-side drawing on top of it, using some of the goodies that HTML5 provides us.

The basic idea is:
  • Bing Maps or Leaflet mapping-wise
  • Html5 Canvas to draw the data (points, heatmaps, grids, whatever)
  • Html5 websockets to fetch the data
  • NodeJS to create an ultra-fast server to return the data to the client (without HTTP protocol overhead, just a plain TCP socket).
  • MongoDB to handle the data.
Also, I want to be able to handle thousands (if not millions) of coordinates at once.


Saturday, February 4, 2012

Fibonacci

Picking up on my previous post, I mentioned that many attempts were required to get an available url for my blog. While I was searching for the "perfect name" I even attempted some urls just for fun. One of those attempts was:

http://0112358.blogspot.com

As some of the more astute may recognize it's the beginning of the Fibonacci number sequence. It's sort of original but I wasn't too surprised that it was unavailable. Anyway, and as it is an infinite sequence, I tried to find the point on which I had an available url.

My attempts:

http://011235.blogspot.com -> Sorry, this blog address is not available
http://0112358.blogspot.com -> Sorry, this blog address is not available
http://011235813.blogspot.com -> Sorry, this blog address is not available
http://0112358132134.blogspot.com -> Sorry, this blog address is not available
http://011235813213455.blogspot.com -> Sorry, this blog address is not available
http://01123581321345589.blogspot.com -> Sorry, this blog address is not available
http://01123581321345589144.blogspot.com -> Sorry, this blog address is not available
http://01123581321345589144233.blogspot.com -> This blog address is available.

So, only after the 13th fibonacci number (233) you have an available blog.... :|

So, if anyone wants a really nice and user-friendly URL for your blog, here it is :D

Friday, February 3, 2012

Yay

Well, after 20 or so "Sorry, this blog address is not available" here I am: my first "real" blog. I'll be writing my thoughts on technology, particularly on programming.

I've been developing sofware for some time now, but I'm also interested in 2d/3d design, music software and games. I work mostly with Microsoft technologies but I have an open-mind to try out new stuff.

Somethings on which I would like to blog about:

.NET in general

Databases
- ORMs
- NoSQL - MongoDB
- Tuning

GIS / Mapping
- Bing Maps, Leaflet, OpenLayers
- NHibernate Spatial

NodeJS

Game development for iOS
- Cocos2D & Box2D


Well, you get the picture.

This isn't in any way a roadmap or anything, just mumbling (hence the title) :)