NVelocity template engine sample

Lately I've grown fond of the NVelocity template engine - useful for things like email templates, more complex user friendly error messages etc. Pretty much anywhere where String.Format and string concatenations seem like not the best way to complete the task at hand.

Due to some lack of samples and not a clear indication in the documentation on how to load and handle templates with NVelocity, I've put toghether this little sample application which coveres most of the methods how to load templates from various resources: embedded resources, files and in memory strings. You can, however, roll out your own implementation of the resource loader, but that is a subject for a future post. In the sample application, the different resource loading methods are implemented in the IMessageBuilder implementations.

NVelocity sample Visual Studio 2008 console application

Peace,
Mihkel

Progress timer

I know - it's been too long since my last post and i feel ashamed. So here goes.

I have put together a neat progress timer class for such occasions when you have a long running process looping over a bunch of items and doing its thing. The timer keeps track of the recent times and remaining time. Enough of the chit-chat - to the code...

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

public class ProgressTimer
{
 private readonly Queue _timeQueue;
 private int _itemsRemaining;
 private int _limit;
 private Stopwatch _stopWatch;

 public ProgressTimer(int historyLimit)
 {
  if(historyLimit <= 0)
   throw new ArgumentOutOfRangeException("historyLimit", "History limit must be greater than 0.");

  _timeQueue = new Queue();
  _stopWatch = new Stopwatch();
  _itemsRemaining = 0;
  _limit = historyLimit;
 }

 public void Initialize(int totalItems)
 {
  _itemsRemaining = totalItems;
  _timeQueue.Clear();
  
  if(_stopWatch.IsRunning)
   _stopWatch.Stop();

  _stopWatch.Reset();
 }

 public void BeginStep()
 {
  ThrowIfStopWatchRunning();

  _itemsRemaining--;
  _stopWatch.Reset();
  _stopWatch.Start();
 }

 public void EndStep()
 {
  _stopWatch.Stop();
  if (_timeQueue.Count >= _limit)
  {
   _timeQueue.Dequeue();
  }

  _timeQueue.Enqueue(TimeSpan.FromMilliseconds(_stopWatch.ElapsedMilliseconds));
 }

 public TimeSpan StepTime
 {
  get
  {
   ThrowIfStopWatchRunning();

   return TimeSpan.FromMilliseconds(_stopWatch.ElapsedMilliseconds);
  }
 }

 public TimeSpan RemainingTime
 {
  get
  {
   ThrowIfStopWatchRunning();

   if (_itemsRemaining <= 0)
    return new TimeSpan(0);

   var averageTimeMilliseconds = _timeQueue.Average(x => x.TotalMilliseconds);
   var totalRemainingMilliseconds = _itemsRemaining * averageTimeMilliseconds;
   return TimeSpan.FromMilliseconds(totalRemainingMilliseconds);
  }
 }

 public int QueuedTimesCount
 {
  get
  {
   return _timeQueue.Count;
  }
 }

 public int ItemsRemaining
 {
  get
  {
   return _itemsRemaining;
  }
 }

 private void ThrowIfStopWatchRunning()
 {
  if (_stopWatch.IsRunning)
   throw new InvalidOperationException("The step is still in progress. End the step by calling EndStep().");
 }
}

And here's a sample of how to put it all to good use...

var timer = new ProgressTimer(2);
timer.Initialize(2);

timer.BeginStep();
// As if real work is happening
Thread.Sleep(3000);
timer.EndStep();

var stepTime = timer.StepTime;
var remainingTime = timer.RemainingTime;

timer.BeginStep();
// As if real work is happening
Thread.Sleep(2000);
timer.EndStep();

stepTime = timer.StepTime;
remainingTime = timer.RemainingTime;

I hope someone out there benefits from this. And as always I'm open for comments to improve the above piece of code.

Peace,
Mihkel

Damerau–Levenshtein distance

Now you'd thing what the hell am I rambling about now, but here's the thing. Reading through my daily dose of programming news in Google Reader I stumbled upon this clever algorithm - the Damerau-Levenshtein distance algorithm. It is used to find the number of steps it would take to transform one string into another using the following operations: insertion, deletion, substitution and trasposition. Or put simply - Damerau-Levenshtein distance is a metric to defining the difference between two strings. The main areas of use are spell-checking (typos etc), DNA difference calculation etc. So I read up on the algorith at the Wiki page and decided to implement it just for the implementation's sake. Having fiddled around with the code for some time it dawned on me - I have this OCD when I perform the exact same operation in my head for two words that have a revelance to whichever situation I happen to be in at a given moment. I also provide a corresponding String extension method. Oh and if anyone hasn't picked it up yet, I mainly write code in C# 3.0 as is the case with this post. So without further ado, I present to you the implementation:

public static class DamerauLevenshtein
{
 public static int DamerauLevenshteinDistanceTo(this string @string, string targetString)
 {
  return DamerauLevenshteinDistance(@string, targetString);
 }

 public static int DamerauLevenshteinDistance(string string1, string string2)
 {
  if (String.IsNullOrEmpty(string1))
  {
   if (!String.IsNullOrEmpty(string2))
    return string2.Length;

   return 0;
  }

  if (String.IsNullOrEmpty(string2))
  {
   if (!String.IsNullOrEmpty(string1))
    return string1.Length;

   return 0;
  }

  int length1 = string1.Length;
  int length2 = string2.Length;

  int[,] d = new int[length1 + 1, length2 + 1];

  int cost, del, ins, sub;

  for (int i = 0; i <= d.GetUpperBound(0); i++)
   d[i, 0] = i;

  for (int i = 0; i <= d.GetUpperBound(1); i++)
   d[0, i] = i;

  for (int i = 1; i <= d.GetUpperBound(0); i++)
  {
   for (int j = 1; j <= d.GetUpperBound(1); j++)
   {
    if (string1[i - 1] == string2[j - 1])
     cost = 0;
    else
     cost = 1;

    del = d[i - 1, j] + 1;
    ins = d[i, j - 1] + 1;
    sub = d[i - 1, j - 1] + cost;

    d[i, j] = Math.Min(del, Math.Min(ins, sub));

    if (i > 1 && j > 1 && string1[i - 1] == string2[j - 2] && string1[i - 2] == string2[j - 1])
     d[i, j] = Math.Min(d[i, j], d[i - 2, j - 2] + cost);
   }
  }

  return d[d.GetUpperBound(0), d.GetUpperBound(1)];
 }
}

What do you guys think, should the presentation of interesting algorithm finds in my blog become a recurring subject? I think it wouldn't hurt.

Peace out,
Mihkel

The weirdest clouds I've ever seen

Today we had the weirdest type of clouds in the skies above Tallinn. I've never seen anything even remotely resembling something like this. The whole circus lasted for about an hour and was definitely a spectacular display of atmospheric art. If anyone out there knows the type of these clouds please leave a note in the comments section. Here are some quick snaps i took ...


And a panorama
Keeping eyes open towards the sky,
Mihkel

Cloudy Saab photos

On the same awesomely-cloudy day i decided to take some photos of my beloved Saab. Here are the results ...

Saab photographs darn well, doesn't it? :)
Mihkel

Debugging made easy

I know that debugging and how it's done is a very personal thing. Still - I'd like to share some of my experiences and tips I've gathered during my years of programming. Here goes...

The situation: I know a specific line that I'd like to debug to in a file. The solution before: navigate to the line, add a breakpoint, press F5. It's pretty simple in essence but still a bit cumbersome. And what if this breakpoint is a one-timer - you'd have to remove it afterwards. Furthermore, if you forget to remove it, the next time the debugger breaks at the line it ever so rudly interupts your already mentally challenging debugging session. It just so happens to be there's a solution for all this - a command called Run to cursor. I've set it under the F8 key so it's close to all the rest of the debugging keys. What it does is runs the code and breaks the debugger at the line where the caret is positioned - no need for temporary breakpoints etc. Cool, huh? :)

Next on the list - the Debugger.Break() method in the System.Diagnostics namespace. This method signals a breakpoint to an attached debugger. One might wonder - what's the point - I could have just as easily defined a breakpoint myself, why the fuss about defining it in code. A very valid point. Now imagine a case when there is no debugger yet attached or there is no simple way to attach one. If this is the case then calling this method asks the user to select a debugger. This method comes in handy when debugging e.g. windows services and processes than cannot be started out of Visual Studio. Awesome - I know.

Last but not least - DebuggerStepThroughAttribute in the System.Diagnostics namespace. This attribute can be used to decorate a class, struct, method and constructor and tells the debugger to ignore the decorated piece of code and not step into it, although a breakpoint can still be set an be breaked to. The step through attribute can also be defined on a property but has to be declared on the setter and getter individually. Common uses would be e.g. .net base class library extension methods, simple field accessor properties on domain objects etc. Here's a nuisance this attribute helps to overcome: some object properties are passed into a method as parameters and you want the debugger to step into the method withouth having to initially step through all the properties. Once the getters on the properties have the step through attribute on them the debugger can step right into the desired method ignoring the properties.

I sincerely hope any of this is helpful to some of the fellow programmers out there and once again - it wouldn't hurt to hear you, the reade's, handy tips about code debugging in Visual Studio in the comments section.


Debug away...
Mihkel

Some handy String extension methods

Extension methods - don't we all just love them. If you've been out of the .Net 3.5 loop, here's some catching up - Extension Methods (C# Programming Guide). I thought i'd share some handy string extension methods i've come to love during my experience with C# 3.0. I've never been quite fond of the static String.IsNullOrEmpty method, but thanks to extension methods i can now turn it into an instance method as extension methods can be called on null values as well.

public static class StringExtensions
{
 public static string GetValueOrEmpty(this string @string)
 {
  return @string.IsNullOrEmpty() ? String.Empty : @string;
 }

 public static string ToSingleLine(this string @string)
 {
  if(@string.IsNullOrEmpty())
   return String.Empty;

  string singleLineString = @string.Replace(Environment.NewLine, " ");
  return singleLineString;
 }

 public static bool IsNullOrEmpty(this string @string)
 {
  return String.IsNullOrEmpty(@string);
 }
}

If you have any nifty extension methods that you'd be willing to share, let the readers know through the comments.


Peace,
Mihkel

Discovering ReSharper live templates

Let me start this off by saying - ReSharper live templates are what Visual Studio's code snippets should have been all along. Namely ReSharper's live templates allow the programmer to create powerful custom templates for multiple situations - regular, surround and file templates. It's also possible to use variables (%variable_name%) and make them either user editable or assign a macro to it. The word "macro" here is a bit deceiving. The macros used inside live templates aren't regular Visual Studio macros, rather ReSharper's own .Net macro classes implementing the JetBrains.ReSharper.Feature.Services.LiveTemplates.Macros.IMacro interface. To think about it - this allows for much greated capabilities within macros and better packaging.

One might not recognise his or her bad habbits until someone specifically points it out to them. Something like this happened to me regarding the use of a TODO snipper i've been using. The bad habbit - having to type my name and current date every time the snippet is inserted and being completely oblivious to the fact that there are better ways of doing this. As a coworker pointed out that he's using ReSharper's live templates, i started looking into them and it didn't take long to find out there were powerful ways to extend the templates. Long story short - here's my implementation of the TODO snippet - download the template XML.

This template demonstrates quite well how to use three different types of variables: ones which are user editable, ones which have a constant value assigned to them and ones which retrieve their value from a macro. To use this template save the XML above in a .xml file, open the live templates editor from the ReSharper menu and import the XML file.

P.S. - this post was written in Visual Studio 2008 on a Lenovo IdeaPad S10e running Windows 7 (all visual effects enabled) - combined memory consumption - 800 Mb. Let me end this post by saying - Windows 7 is what Vista should have been all along.


Helping a brother out,
Mihkel

3D - a thing of wizardry and black magic

How many times have I had to explain to someone how to create and render 3D imagery? Well - a lot. Luckily I'm not the only one having to do all the explaining. So these guys came up with an ingenious idea of creating a website which gives all the info about taking the first steps in 3D. And this is all done in a very general fashion so that the techiques learned from the videos could be applied to whichever major 3D application (Cinema 4D, Maya, 3D Studio Max, Lightwave, Softimage, Blender etc). Here's the site itself - The Guerrilla CG Project - Computer Graphics Fundamentals. Now, whenever someone asks how this 3D stuff works, I simply send them this link. There - one less thing to worry about :)

kthnxbai,
Mihkel

Modeling a car - a quick run-through

I wrote this little instructional how-to at CGSociety on the topic of modeling a car in a poly-modeling fashion and thought it might be a good idea to make it a blog post. This question get's asked quite ofter - what is your modeling workflow like, so here's how I do it.

First step is to create a splinecage. This consists of setting up the blueprints and getting them aligned on all four planes - side, top, front and back. Then it's just a matter of creating splines where the edges run on the car. For the body panels I draw the spline e.g. for the hood in the top view, then go into side and front view to get the splineS bent exactly how it should be in all three dimensions. But take great care at this step as it is NOT a no-brainer to change splinecage once you start building the mesh on top of it.

Second step is not always that straight forward. I now have a spline cage in place which I can use for points snapping when creating plygons. Sometimes to understand the mesh flow better, I do some wireframe paintovers on some reference photos in photoshop with my wacom. But do remember that this step cannot be taught in my opinion, this can only be learned through practice. Then I create a single polygon which basically covers the particular area in the most simplistic fashion. e.g. for the door panel I just create a simple quad which stretches out into all the corners of the door panel. Then comes the cutting and finetuning. I then do the cuts in the polygon where they're necessary e.g. the crease in the door, more edges to achieve the curvature etc. Never manually place the points on the edges of panels, only use snapping to the splinecage!!!

At this point you should have the main body panels created, but without the bevel on the edges, which gives a nice thick feel to the body panels. This totally boils down to the tools that your particular applican offers. The end result for the panel edges and corners should look something like this:

There's one row of polygons going inwards and there are two rows of polygons on the surface edge of the body plate. The two polygon rows have a total width of about 2,5-3,5 mm. To produce the edge bevels in Cinema 4D I use the following steps:

  • select all polygons
  • clone
  • extrude inward or do a negative smooth shift of about 1,5mm
  • delete the cloned polygons
  • optimize to weld overlaping points at the newly created crease
  • the outer facing polygons I extrude inner for two steps, 1-1,5mm each
  • add the necessary cuts at the corners to crea a sharp corner

As for all the rest of the points on the bodyplate that aren't exactly on the splinecage, there I use the brush tool in smear mode with very low strength to give minute adjustments where necessary. This is the most time consuming part of the whole process as one change needs to be view at and adjusted from all the angles. It's also possible to use the iron tool or the brush tool in the smooth mode to achieve some inital smoothing from which to work onwards.

I hope this gives a little more insight into the way I model. Look forward for more modeling tutorials covering some very specific subjects like proper edge beveling, sharp corner modeling etc. And don't think this tutorial applies to only cars - the described process can be used to produce almost any hard surface(non-organic) object.

kthnxbai,
Mihkel

New FeedBurner feed

I have transfered my blog's feed over to FeedBurner. The current feed redirects all already subscribed users to the new feed. Here's the link - http://feeds2.feedburner.com/MihkelsBlog

Discovering the blogosphere,
Mihkel

Need more brains!!!

There's this subject that i find utterly fascinating lately - brain studies. The way neuroscientists study the jelly in our heads is by analyzing patients with very a specific kind of brain damage. They can then understand and locate which part of the brain is responsible for what behaviours.

One of the leading neurologists and my personal favourite in this field is Vilayanur Ramachandran. I've included a bunch of videos of him below. Some keywords of his work - phantom limbs, synesthesia, capgras delusion etc.

I'd like to point out one of these phenomenons - synesthesia. This is something that almost everyone of us possess but are unaware of until someone specifically mentions of its existance. When someone is any type of a synesthete (a person who has synesthesia), their brain has formed connections between seemingly unrelated subjects. For example - i have grapheme a.k.a color synesthesia for numbers and colors. The way this phenomenon manifests itself is when i think of a number i get a sensation of a specific color. Some numbers have very distinct colors while others have rather dull or faded, sometimes even undistinguishable tones.

On a more general term synesthesia allows us to engage in metaphorical thinking. Take for example a statement - "that's a blazin' car". Normal people wouldn't automatically assume that the car is on flames, rather that the car is nice looking. It'd be nice to hear from you, the readers, about your relationship with synesthesia, so feel free to leave a comment.

I've gathered together a portion of videos and articles that do quite well at explaining the peculiarities in our heads. The audio on "Phantoms In The Brain" is a bit off sync, no need to be put off by this.

I guess what i'm trying to achieve with this post is to create some interest in people in how the mysterious thing called brain functions. Far too often do we see people who carry symptoms of abnormal brain behaviour get ridiculed and called names by others who lack the knowledge of what's really going on in someone's head. So don't be too quick to judge and jump to conclusions - be open minded, learn and if possible offer some guidance and assistance.


Keeping my mind open,
Mihkel

Modeling away...

So there are still two topics yet uncovered - 3D and Saabs. Why not kill two birds with one stone. Here are some links to my never-ending 3D projects:

It's also quite rewarding to have my Milla model featured at the 3D Buzz website's weekly news feature :)

Trying to stay atop all things interesting,
Mihkel

DIY ringflash adapter

Here's another DIY project i undertook - an Orbis style ringflash adapter.

Dimensions

  • inner diameter - 85 mm
  • outer diameter - 235 mm
  • depth - 60 mm
  • neck length - 95 mm
  • ventilation pipe - 110 x 55 mm

Materials used:

  • a rectangular ventilation pipe for the neck
  • a flower pot for the inner surface
  • a fruit bowl for the outer surface
  • Rosco white diffusion filter
  • aluminium foil tape
  • black ducktape
  • white tape for covering the inner surface
  • wire for tying the parts together

Tips:

  • use of a dremel type of mini drill strongly suggested
  • tying the pieces together makes the final product more rigid than one where glue or tape was used
  • apply 2-3 layers of filter near the adapter neck area as this gets illuminated much brighter than the rest of the diffusion area
  • cover the exterior with black tape for a more professional look :)
  • make four plastic flaps on each side of the neck and add a rubber band around it to make the adapter fit flash heads of various sizes

A minidrill comes in very handy when cutting out the tricky sufaces - WEAR SAFETY GOGGLES AT ALL TIMES!!! The drill pictured above is produced by VELLMAN and costs around $45 (in Estonia). People on the other side of the pond should look for Dremel products. It's an all-around great investmen.

Light distribution test in a 3D software package using GI (global illumination)

Cut the top off the vase which forms the inner surface of the ringflash adapter.

The wire connections are hidden under the tape

Apply aluminium foil tape to allow light to spread out more from the neck

Rosco filter applied. Rubber band around the neck allows attatchment of flashes of various sizes. BEAWARE: flash might drop out if not held firmly enough!!!

Back side of the adapter covered with black duck tape

Notice the double layered filter near the neck area. It has the same arched shape at the ends as did the bright light on the 3D light distribution test image. Orbis incorporates the same feature.

Ringflash adapter in action - attached is a Sunpak PZ-5000AF - a fairly powerful strobe light in manual mode. I'm pretty satisfied with how the project turned out.
Til next time,
Mihkel

LuxuriaMusic

You know what i've been hooked on for the past 4 months or so? You guessed it - LuxuriaMusic - a listener supported internet radio. It plays the bestest kind of music - jazz, bossa, funk from the 50's, 60's and the 70's. And you've gotta love their catchy punchlines presented by a smoot-talkin baritone male voiceover actor:

  • LuxuriaMusic - it's the kind of music that brings back no memories what so ever
  • LuxuriaMusic - it's the kind of music that your parents wanted you to listen to
  • LuxuriaMusic - sex
  • ... and the list goes on

Funny stuff right there. And not only do they play great music - the station actually has dedicated dj-s and hosts who really know their subject. So if you're into this kind of stuff, check them out at http://www.luxuriamusic.com/.

peace,
Mihkel

DIY softbox

Here's a DIY i was working on the last weekend - a softbox for my Sunpak PZ-5000AF strobe. Diffusion area dimensions are 20 x 16 cm and it could be fit on any similarly sized flash. Thickness when folded flat is about 8mm.

Materials used:

  • light, strong cardboard
  • ducktape - black
  • aluminium foil tape (a truly awesome piece of material for photography DIY-ers)
  • Rosco white diffusion filter
  • black rubber hair band


Aluminium foil tape

Tips:

  • all the hinged parts are made with ducktape to protect them from wear'n'tear.
  • make a small trame around the diffusion area, but make sure to cover the corners with ducktape to protect from wear'n'tear.
  • inside of the softbox is largely covered with foil tape to allow light to spread

And some images of the final product:

Folded flat

Folded flat

Even coverage

Inside covered with aluminium foil tape

Notice the folds made of ducktape
Coming up next - DIY ringflash.

Stay tuned.
Mihkel

Search selection gesture for firefox

This is my "Hello world" of blog posts. I have now taken the dark path of blogging. And ain't nothing better to kick things off with a little snippet of javascript that helped me solve a big problem - how to do a search on selected text with a mouse gesture.

I've been using Mouse Gestures Redox for over a year now and am very pleased with it. A few days ago i thought to myself - wouldn't it be great if i could selected some text and with the same continuous movement perform a search on it? Mouse Gestures Redox allows custom javascript to be run as a gesture and here's what i wrote:

// Get selected text from the HTML DOM
var selectedText = window._content.document.getSelection();
if(!selectedText)
 return;

// Get the searchbar element from the Firefox UI XUL DOM
var searchbar = document.getElementById('searchbar');
if (!searchbar)
 return;

// Perform search
searchbar.value = selectedText;
searchbar.handleSearchCommand();

I have assigned this script to a gesture "R" meaning dragging to the right - really convenient. I'm sure this script is not only applicable for Mouse Gestures Redox but to other gestures add-ons as well.

Helping a brother out,
Mihkel