Friday, July 30, 2004  

I attended my second ICCA NYC Chapter meeting last Tuesday. Turn out was not as good as the previous month but that was probably due to the pouring rain. The meeting was about planning for the upcoming year. We talked about the topics that will be presented over the next 12 months and attendees had a chance to vote for topics that he or she was most interested in hearing. Internet marketing and better networking (not the technical kind but the person to person kind) were top on the list with many other exciting topics following. The next 12 months of meetings are shaping up to be interesting and useful.

posted by Kirby Turner | July 30 11:11 AM | comments (0)


Monday, July 26, 2004  

We're back from Vermont. It has only been a couple hours since we got home and I already miss the Green Mountains.

posted by Kirby Turner | July 26 10:00 PM | comments (1)


Friday, July 23, 2004  

Melanie and I will be in Vermont this week. Can't wait. It's been too long since our last visit.

posted by Kirby Turner | July 23 12:06 PM | comments (0)


Thursday, July 22, 2004  

Here's what this blog looks like to Snoop Dogg's Tha Shizzolator. And check out the shizzolated code down below.

posted by Kirby Turner | July 22 02:48 PM | comments (0)


Wednesday, July 21, 2004  

Over the last few years I have watched and learned about building business relationships. I have seen huge mistakes made and I have seen techniques used that lead to great success. However, the key to building a relationship, whether good or bad, is always same...communication. A lack of communication will spell disaster for any relationship while a good amount of communication can spell success.

Good communication does not guarantee success but it eliminates the element of surprise. Most people don't like surprises unless it is for happy moments. Having a surprise birthday party thrown in your honor will make you feel good. We like those types of surprises. However, being told that the project is going to take twice as long to complete and at twice the cost is not the type of surprise you want. It's not a happy moment and the customer does not like those types of surprises.

While we all know no one likes the bad moment surprises, I'm constantly amazed when I see a development team surprise the customer team and project stake holders with bad news. You are not going to be able to prevent bad things from happening within a project, but you can eliminate the element of surprise and it starts with communication.

You can eliminate the element of surprise by communicating with the customer on a regular basis. This communication must include the good, bad and the ugly. The good news is always easy to share, but you also should be willing to share the bad and ugly news even at the risk of having the project canceled. The relationship you are building will only strengthen with your honesty and upfront nature, and this should result in greater awards further down the road.

Frequent, open, and honest communication is a key to building successful relationships. However, one must know how to balance the information communicated. Someone who cries wolf all the time will loss credibility. Likewise the individual who only shares good news is likely to be perceived as hiding information, which can result in a loss of credibility as well. The trick here is to balance the information shared and provide only the information required by your audience to keep them informed and to eliminate surprise.

As an example of this, if your project is showing signs of slippage share this knowledge with your customer, but don't make it sound like a crisis. Just indicate that there are early signs of slippage and outline your plans to counter the affects. This should be done early on instead of waiting until there is major slippage in the project timeline.

If slippage occurs, the customer will not be surprised by the news. If slippage does not occur then the customer will see your were able to mitigate the risks. Either way you were able to eliminate the element of surprise and instilled greater confidence in your abilities with your customer and thus strengthening the business relationship.

Eliminating the element of surprise with regard to unfortunate news will help strengthen your business relationship with your customer and will hopefully result future work with your customer.

posted by Kirby Turner | July 21 08:17 PM | comments (1)
 

I learned that some Dell Latitude D600 configurations will prevent Shift + Arrow key combination from highlighting text within a VMware guest OS.  The problem also prevents selecting multiple list items too.  I found that the problem is caused by the ATI tray icon application.  Disable the ATI tray icon application to get Shift + Arrow key highlighting working again within Windows guest OS'es.


posted by Kirby Turner | July 21 12:34 AM | comments (0)


Tuesday, July 20, 2004  

After playing with Virtual PC off and on for a couple of days, I decided to return to VMWare. There are two main reasons why I decided to go with VMWare over VPC.

Reason one: Network bridging. Simply put, I could not get bridging to work with VPC but it worked flawlessly with VMWare. Overall, I think VMWare does a better job at networking. I especially like having control of the DHPC service settings.

Reason two: UNC support to the host. This feature seems to only exist in VMWare. \\.host\Shared Folders\ gives you access to VMWare shares defined in the host OS. I could not find an equivalent feature in VPC.

posted by Kirby Turner | July 20 02:54 PM | comments (0)
 

It seems that a binding formatter is called twice when a user leaves a textbox control. As the user leaves the control the Leave event for the control is fired followed by the binding format event. The setter method of the bounded property is called next followed by the getter method then finally the binding format event is called again.

This should not be a concern for applications that use binding formatters but the developer should know it will be called twice.

Here is sample code that illustrates the behavior:


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Diagnostics;

namespace SampleWindowsApp
{
///
/// Summary description for Form1.
///

public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button1;
private MyClass _dataSource = new MyClass();

///
/// Required designer variable.
///

private System.ComponentModel.Container components = null;

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
}

///
/// Clean up any resources being used.
///

protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///

private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(56, 32);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 0;
this.textBox1.Text = "textBox1";
this.textBox1.Leave += new System.EventHandler(this.textBox1_Leave);
//
// button1
//
this.button1.Location = new System.Drawing.Point(72, 120);
this.button1.Name = "button1";
this.button1.TabIndex = 1;
this.button1.Text = "button1";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.button1);
this.Controls.Add(this.textBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);

}
#endregion

///
/// The main entry point for the application.
///

[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void Form1_Load(object sender, System.EventArgs e)
{
Binding binding = new Binding( "Text", _dataSource, "Value" );
binding.Format += new ConvertEventHandler(binding_Format);

textBox1.DataBindings.Add( binding );
}

private void binding_Format(object sender, ConvertEventArgs e)
{
Debug.WriteLine( "Format" );
}

private void textBox1_Leave(object sender, System.EventArgs e)
{
Debug.WriteLine( "Leave" );

}
}

class MyClass
{
private string _value = "Default value.";
public string Value
{
get
{
Debug.WriteLine( "MyClass.Value getter" );
return _value;
}
set
{
Debug.WriteLine( "MyClass.Value setter" );
_value = value;
}
}
}
}

posted by Kirby Turner | July 20 09:31 AM | comments (0)
 

Looking for a particular regular expression? Check out the Regular Expression Library (http://regexplib.com/).

posted by Kirby Turner | July 20 08:41 AM | comments (1)


Friday, July 16, 2004  

Melanie and I were planning to fly into Manchester, NH next week and drive to Vermont for a break from NYC.  However confusion set in when we started checking the fly availability and car rentals.  Flights into Manchester are filling up and car rentals are sold out.  What gives?
 
Duh!  The Democratic Convention 2004 starts on Sunday, July 26 in Boston.  No wonder Manchester is so busy that weekend.  Needless to say, Melanie and I are breaking convention (no pun intended) and driving up from NYC to avoid the Boston/Manchester madness.

posted by Kirby Turner | July 16 09:51 PM | comments (0)


Thursday, July 15, 2004  

I had a lengthy discussion with another developer today regarding data binding in .NET.  I started thinking about this more after the conversation ended and I realized there are some who think data binding should always be used in Windows based .NET applications.  The conversation today brought back memories of how developers overused data binding when VB 3.0 was released into the wild.

Data binding in .NET is a vast improvement over past attempts at providing a data binding feature in a programming language.  I for one love the fact that I can data bind to different data structures and that I am not limited to binding to ADO.NET datasets only.  I often use data binding in my ASP.NET applications that use a repeater.  This feature alone has helped me build web pages faster, but I do not believe data binding is the silver bullet for all cases of moving data between structure and presentation.

Consider a case where you are developing a Windows application and the presentation tier works with custom data structures only, no dataset.  The window must allow the user to edit values stored within the data structure.  One easy way to do this is to bind the data structure to the window elements.  Changes in the data will immediately be reflected in the data structure.  Now assume that the user wishes to cancel the data changes.  Unfortunately the data structure has already been updated with the changes.  How do you reset the data structure?

There are probably 101 ways to solve this problem.  One approach that works well and does not use data binding is to copy data from the data structure into the window elements for display and copy the data back from the window elements to the data structure for persistence.  This is accomplished by writing two private methods, one to copy from the data structure to the window elements and the other to copy from the window elements to the data structure.  The on change event from each editable window element can be wired to a single event handler that sets a flag that indicates data has changed, i.e., IsDirty.

Within the form load event of the window, the private method to copy data from the structure to the window elements is called.  Within the form close event or some other event indicating a desire to save the data, the private method to copy the data from the window elements to the data structure is called.  The flag indicating data has changed can be used here to avoid copying data when no changes exist.  In other words, only copy the data from the window elements if the IsDirty flag is true; otherwise do not copy the values.

This approach does require the developer to write code.  Data binding would of course eliminate the need to write the code but in doing so you give up some flexibility in what you can and cannot do.  In many more complex solutions, giving up that flexibility can lead to more costly problem solving approaches such as writing code for workarounds to problems caused by the loss of flexibility.  This can be true when data binding is used. 

I have seen projects that use data binding go down the path of writing various parsers, formatters, utility helper classes, implementing interfaces such as IEditableObject on data structures, and so on just to overcome limitations imposed by the use of data binding.  In the attempt to avoid writing code that follows a straight forward pattern of moving data from a structure to window elements and back, the project developers have made life much harder for themselves.  Design meetings, whiteboard sessions, and developer time are wasted on producing these workarounds just to eliminate the need to write simple snippets of clean code within the window.

Data bind has its place in the application development world, but do not assume it is the only approach to use within your applications.  Don't be afraid to write code.  You might be surprised at how easy it is to maintain, enhance, and most importantly improve the richness of your applications when you don't use concepts like data binding.  And when you do use data binding use it wisely.

posted by Kirby Turner | July 15 07:22 PM | comments (1)


Monday, July 12, 2004  

Hernan Di Pietro has done a nice job of comparing the performance between Virtual PC and VMWare. I think I will start with VPC as I begin setting up the new laptop.

http://usuarios.lycos.es/hernandp/articles/vpcvsII.html

posted by Kirby Turner | July 12 09:48 PM | comments (0)
 

I received my new Dell Latitude 600 today. Sweet machine but now it's time to set it up to my liking. My plan going into it is to setup the host OS with the general tools I need each day such as Eudora Pro, Office 2003, iTunes, and so on. I will use either VMWare or Virtual PC to host guest OS for my development environments. I plan to setup the primary user account for each OS with minimum privileges to force me to become even more security minded.

I'm still not convinced that hosting my development environment in a guest OS is the right choice but I do like the idea of creating a new development environment in a matter of minutes instead of hours. The big decision I have to make though is whether to use VMWare or Virtual PC. I have been a VMWare user for some time now but there are some cost benefits for using Virtual PC. Post a reply if you have an opinion on VMWare versus Virtual. Meanwhile I'll post more about my setup and configuration experience as I go through the process.

posted by Kirby Turner | July 12 08:59 PM | comments (2)
 

American Ski Company finally gets it. They are offering low cost season passes for those people who wish to buy their passes early. These are All for One passes with access to Killington, Pico, Mount Snow, Sugarloaf, Sunday River, and Attitash Bear Peak for as low as $349. Quantities are limited so act now.

posted by Kirby Turner | July 12 08:23 AM | comments (0)
 

It's official. Over the next few weeks I will be transitioning my day time job from Avanade to my own company White Peak Software Inc and I will be 100% focused on White Peak starting Monday, August 16. This is a very exciting time for me as I move to the world of independent consulting and it is something I could not do without the love and support of my wonderful wife Melanie.

posted by Kirby Turner | July 12 07:04 AM | comments (1)


Friday, July 02, 2004  

Reported by the The New York Times, "Delta Air Lines said yesterday that it planned to use disposable radio tags to track all luggage it handles at domestic airports."

posted by Kirby Turner | July 2 10:27 AM | comments (0)
Copyright © 1999-2008 Kirby Turner.
Site software written by White Peak Software Inc, a provider of custom software and software development coaching.