Friday, May 29, 2009

Tales of the bizarre

Technorati Tags:
I ran into a interesting problem today, we have a automated process that zips a file then emails it to a customer, sounds easy right we build a wrapper around the ICSharpLib ?

The zip file it created could be unzipped with the lib (using ICSharpZip) or by using 7-zip, winzip, etc. But the built in zip tool in windows couldn't handle it, also out customer is a Java shop and java couldn't unzip it and they running Unix servers and unzip complained saying it needed a newer version of PK zip.

Here is were it gets bizarre, I take the zip wrapper lib and my thinking is I'll create a command line tool so they could unzip the file in there app, I compile the project in mono on my Linux Virtual box and when I run my unit tests the zip file worked now.

My first thought was that it was a problem with being complied on a 64 bit box vs a 32 bit system(the virtual system is a 32 bit system), or something like that. I looked into it a bit further, wrote a small app in java to unzip a file for testing my changes, and what it finally ended up being was ICSharplib was creating a zip64 format vs the standard zip format. The windows explorer zip tool and java.util.zip can't deal with a zip64 file.

My real question is why did mono use the standard zip format vs the zip64 format?

I have updated our wrapper lib to use the standard zip by turning off the zip64 and it now works just fine, Just Bizarre.

A New Look

I decided to go with a slightly new look, I kept the colors the same, but I removed the fixed width of the content to make it easier to display source code and I changed how source code is displayed by adding a border around it and by adding auto scrolling.

Hopefully this will make reading this a little easier.

Sunday, May 17, 2009

Development Heros

I pose the question, who is your development hero? Who has done the most to enlighten and inspire you about software development?

There are many rock star's in our industry Martin Fowler, Uncle Bob Martin, Scott Hanselman, etc. While they write the books and blogs we read and are in the pod casts we listen to and the screen casts we watch, are they truly who inspire us? Or is it closer to home, a mentor or collage professor maybe? For me the answer is simple the person who showed me how to use my first computer 25 years ago. Nine years later he gave me my first programing book (Terbo Pascal 4.5). Since then he has been an endless source in information, a solid sounding board for ideas, and a guild though the world of software design. While we haven't always agrees on everything, see drinking the koolaid, he introduced me to N-tier design, Inversion of control, and why interfaces are so important. While I may have learned more about the specifics from others, it was his guidance that showed me the way. While this may sound like the rantings of a fan boy, I think that it's OK, he may not have been a rock star in our industry, but his simple lessens and guidance let me down the path to good software design, and even at the age of 30 I'm was still inspired by my older brother, may he rest in peace Benjamin Clements 1974 - 2009

Thursday, May 7, 2009

The Provider Factory Pattern

At our weekly tech lunch we watched Jean-Paul Boodhoo on Demystifying Design Patterns Part 1 on dnrtv.com and he showed us how to use the "The Provider Factory Pattern" which is basically using a factory to give a data provider that is completely abstracted away from the database request methods that use it.

This is some very cool stuff basically you have a factory that provides a methods for getting a connection
public IDbConnection GetConnection()
{
IDbConnection connection = _frameworkDBProviderFactory.CreateConnection();
connection.ConnectionString = _authenticationSettings.ConnectionString;
return connection;
}

though an interface so you can call any type of Database who's connection object implements the IDbConnection interface (SQLServer, MySQL, Oracle, etc.) (see full source)

To use this you create a request method
public bool AuthenticateUser(string userName, string password)
{
bool success = false;
DataTable requestTable = new DataTable();
using (IDbConnection conn = UserDataProvider.GetConnection())
{
conn.Open();
IDbCommand cmd = conn.CreateCommand();
cmd.CommandText = "select UserName, Password from users where UserName = @Username and Password = @Password";
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(UserDataProvider.AddParameterWithValue("@UserName",userName));
cmd.Parameters.Add(UserDataProvider.AddParameterWithValue("@Password", password));
IDataReader reader = cmd.ExecuteReader();

using (reader)
{
requestTable.Load(reader);
}
}
if (requestTable.Rows.Count==1 )
{
success = true;
}
requestTable.Dispose();
return success;
}

The request method can open this connection, pass in your ANSI SQL query, parameters, etc. then execute it. (see full source)

The Method doesn't know or care what kind of data base it's talking to, additionally starting in the 2.0 framework you can pull the type of Database from the connection string configuration so all you have to do is have the database client lib included in your project and your good to go.