Life has been getting harder for owners of small mail servers on the internet.  Costly software upgrades and restrictive anti-spam policies at the major servers have made running your own mail server a very expensive proposition.  Yes, there are many companies providing outsourced e-mail services, but they are either expensive or very limited.  Then, along comes Google for Domains!  Free & feature rich, it makes you wonder why you bothering with the hassle of maintaining your own server.  Key features that we needed in order to switch:

  • The maximum file attachment size is 10Gb
  • Reliable spam filtering
  • Nicknames or aliases for each account name
  • Domain aliases (e.g, harriergrp.com can be aliased to harriergroup.com)
  • 2 GB mailbox limit
  • Access from Outlook via POP3/SMTP
  • Web based accesss
  • Option to include all domain users in mail address book
  • Import/export contract lists into web tool
  • Personal lists in web tool
  • Mail lists
  • Virus scanning


  • Personalized startup page makes it easy to set up an quick intranet
  • Shared calendars (browser managed)

The only question is who to contact when (if?) you have problems.  It is nice to go onto your own server and see exactly what happened to a message.  Then again, we may never have that need again!


Live Africa Video

A friend recently passed on a link to a live video/audio stream from a South African watering hole.   I have seen all kinds of animals in the last few days and have become addicted to the relaxing sounds of birds and bugs.  The best time to watch is early morning (which is 10 pm – 2 am EST) and late afternoon (which is 6 am – 10 am EST).  During the day, there is often someone monitoring the camera and zooming in on the interesting critters.  The feed is also available at night.


The cam is located at Nkorho Bush Lodge in the prestigious Sabi Sands Game Reserve, bordering the Kruger National Park, in South Africa. The Sabi Sands Game Reserve is named after two rivers that cut through this area, namely the Sabie and Sand River systems. The area is renowned for its wildlife and in particular the big five, lion, leopard, elephant, rhino and buffalo. It is rated as one of the best reserves in Africa to see these large animals in there natural habitat and in particular leopard. Its not all about the big animals and the Sabi Sands has plenty of other smaller animals that call this place there home.

Nkoro pan is located in the North Eastern corner of the Sabi Sands Game Reserve, and about 1km (0.62 miles) from the unfenced boundary with the Kruger National Park. The Pan is situated at the bottom of an open plain, about 250m from Nkoro Bush Lodge and is frequented by a number of resident animals, in particular is the resident herd of wildebeest and impala and a family of warthogs that can often been seen drinking and wallowing in the mud at the pan. The camera is located on top of a termite mound on the Eastern side of the pan and looks Westerly when viewing the pan.

Some people have taken snapshots from the video feed and uploaded them to flickr.  Amazing!  If you do the same, please tag them with “nkhoro”.

Unlike stored procedures, one cannot simply omit a parameter (with a default) to a Sql Server 2000/2005 user-defined function.  For example, if you had a function such as:

    create function fn_just_do_it(@a varchar(10), @b varchar(10) = ‘xyzzy’)

You would not call it like this:

    select dbo.fn_just_do_it(‘Hi mom’)

Instead, insert the word DEFAULT as a placeholder:

      select dbo.fn_just_do_it(‘Hi mom’, DEFAULT)

From Sql Help:

When a parameter of the function has a default value, the keyword DEFAULT must be specified when calling the function to retrieve the default value. This behavior is different from using parameters with default values in stored procedures in which omitting the parameter also implies the default value.

I just received my regular weekly e-mail from Art Morris with a link to an impressive nature photography show by Frans Lanting.   The show is a wonderful collection of nature pictures and music arranged according to the timeline of evolution.   Don’t miss it:  http://www.lifethroughtime.com.

We recently needed to add an option to an “extract report” to shift the values on a per row basis depending on criteria within the row.  The report displays remaining payment streams for equipment leases where RP1 represents the next payment owed by the customer.

  Contract #   RP1   RP2   RP3 … RP120

In the current version of the report, RP1 represents the next amount owed on a lease regardless of when it was due.   Our customer wanted to optionally have RP1 represent the same month for all leases.   This requires us to shift each row a certain number of months to the right and have RP1 represent the earliest possible month in the data set. Initially, we considered creating another table in the data warehouse to hold the shift payment streams until we discovered that we could handle the shifting in the actual report using the following function:

Public Function GetValue(allFields as Fields, reportType as string, index as integer) as string
    Dim offset as integer

    offset = 0
    if reportType <> “Standard” then offset = allFields!DueDateOffset.Value    GetValue = “”
    if (index + offset) <= 120 then GetValue = allFields(“RP” + CStr(index + offset)).Value
End Function


The function is called from each the report textboxes:

    =Code.GetValue(Fields, Parameters!ReportType.Value, 5)

The key learning was that the collection of fields can be passed as a parameter and then accessed as an array using the column name as a string index.


I just downloaded a copy of the new Windows Live Writer beta program because I have not been that happy with the simple HTML editor provided by WordPress.  I have been spending more time than should be necessary to edit posts with sample code snippets in them such as this:

private void Page_Load(object sender, System.EventArgs e)
if (!IsPostBack)

“return confirm(\”Are you sure you want to delete?\”);”);

“return confirm(\”Are you sure you want to cancel?\”);”);

While Windows Live Writer seems to be less glitchy than the WordPress editor, Live Writer also lost my tab indentations when I posted in the text.  Unfortunately, I still need to manually insert the proper indenation (or replace the tabs with spaces before inserting).

Another minor ASP.NET 2.0 porting issue.  In 1.1, ASP.NET will not generate a style attribute for an <asp:image> control unless you override one of the default style attributes.  In 2.0, the <asp:image> control will always insert a style element:

    <img id=”i” src=”/p000681.jpg” mce_src=”/p000681.jpg” style=”border-width:0px;” />

This, of course, takes precedence over any settings in your style sheet preventing you from controlling border width formatting using CSS.  

A couple of solutions:

  1. Use a placeholder instead of the <asp:image> control and insert your own IMG html on the fly.
  2. Create your own class which inherits from the WebControls.Image class and eliminates the offending style attribute from the generated html. 

  using System;
  using System.IO;
  using System.Text;
  using System.Web.UI; 
  public class ImagePlus : System.Web.UI.WebControls.Image
    protected override void Render(HtmlTextWriter writer)
      StringWriter sw = new StringWriter();
      HtmlTextWriter localWriter = new HtmlTextWriter(sw);
      string output = sw.ToString();
      output = output.Replace(“style=\”border-width:0px;\””, string.Empty);

You then need to change your ASPX page to use your custom control instead:

<%@ Register TagPrefix=”hgp” Namespace=”…” Assembly=”…” %>

<hgp:ImagePlus id=”imgX” runat=”server”></hgp:ImagePlus>

Any other ideas for working around this issue?