Sunday, March 30, 2008

The Valley vs. The Emerald City

I don't know, how about we call this one an opinion piece. So the New York Times published an article about how Seattle is becoming the next Silicon Valley. Glenn Kelman of Redfin then commented on it favorably. Then TechCrunch's Michael Arrington disagreed. And now the rest of the world is throwing in their two cents. So I thought, why shouldn't I add my thoughts to the ether.

I spent the better part of the last 5 years working in Seattle as a software developer. In August I transfered to our San Francisco office for a change of scenery. I can't claim any real insight from a start-up perspective. I have friends who have done start-ups, I've consulted for start-ups, but I've never been a part of starting my own, and I may never, who knows.

I have a hard time believing that your likelihood of success can so be so heavily weighted by your location. Sure, being in Silicon Valley, amidst all the others can have its advantages, especially when it comes time to start raising money or recruiting new talent. But good ideas can come from anywhere, be it Stanford or rural Saskatchewan.

If you take a look at my Shelfari reading list on the right (a Seattle based start-up that one of my good friend's from college help found) you'll see I am in the middle of reading "Founders at Work". I find this book to be pretty interesting, and one of the most interesting things I have pulled from it is that you don't have to be in Silicon Valley to succeed. Sure a lot of the companies profiled are based in the valley, but certainly not all of them, and the ones that weren't don't seem to have been at a disadvantage because of it. Their keys to success are having a good idea and having smart, motivated people making that idea reality.

You can live in San Francisco and try to start as many Twitter and Digg clones as you like, good luck with that. But its the next big thing that matters, and that can come from anywhere.

Saturday, March 22, 2008

Learning Cocoa

With the recent release of the iPhone SDK I've gotten pretty excited about trying my hand at building some custom iPhone applications. Since I pay the bills writing software using Microsoft technologies I rarely write anything that isn't in C# these days. I took plenty of C and C++ centric courses in college, but frankly I've gotten rusty.

Coding for the Mac and the iPhone means working with Apple's Cocoa libraries which is done in Objective-C, a language I have never spent any time with, in Xcode, an IDE I've probably opened a handful of times but never built anything in.

So in the last week or so I've been doing a lot of reading on both of these subjects. Like most things there is a wealth of information out there that can be found with a simple Google search. In my hunting I've found a couple of resources for Cocoa, Objective-C and Xcode that I found to be the most helpful:

Programming Mac OS X with Cocoa for beginners

Programming Mac OS X with Cocoa for beginners is a book I found on Wikibooks. This source does a good job of explaining what Cocoa and Objective-C are and especially does a good job explaining some of the unique syntax of Objective-C that at first glance might make someone who is familiar with C, C++ or C# rub their eyes in an comically exaggerated manor indicating bewilderment.

Long Pointers - Xcode 3.0 Tutorial

The Xcode 3.0 tutorial on the Long Pointers blog does a great job of walking you through how you would build a windowed application in Cocoa with the Xcode tool. It is specifically very good at outlining how you build the interface in Interface Builder and wire it up to your controller code.

I am still early in my journey to become a Mac developer, but these resources definitely helped me feel like I am moving forward as I learn more. I'm sure there are more Mac and iPhone development posts coming in the future.

Friday, March 14, 2008

What is ALT.Net

One of the bloggers I follow regularly in the .Net community is Jeremy D. Miller. I have used his post on the model view presenter as a reference many times when explaining the pattern to developers who have not yet been exposed to it.

Jeremy has an article on the back page of March's MSDN magazine explaining what ALT.Net is. It's a very concise and informative explanation. The tenets of being an ALT.Net developer that he digs into more detail are:

  1. You're the type of developer who uses whatever works while keeping an eye out for a better way.
  2. You reach outside the mainstream to adopt the best of any community.
  3. You're not content with the status quo.
  4. You realize that tools are great, but they only take you so far.

After just getting back from Mix '08 it is really encouraging to see Microsoft begin to embrace the ALT.Net community by doing things like hiring Scott Hanselman and creating the ASP.Net MVC framework.

My IDataRecord Extension Methods

I decided it was high time I did a post with some actual code samples in it, so here we go.

I am really enjoying some of the new C# 3.0 language features, one in particular is extensions methods. If you are not yet familiar with extension methods, ScottGu has a good overview. I want to highlight some specific extension methods I've created for IDataRecord that I think are extremely handy, especially when you spend a lot of time working in the data layer with DataReaders like I do. I feel like I've written variations on the same data layer 100 times. Every time it evolves, when I went from .Net 1.1 to 2.0 I took heavy advantage of generics. Now in .Net 3.5 I am simplifying it even more with extensions.

When working with DataReaders you might often have a ton of code that looks like this:


string myString = record.GetString(record.GetOrdinal("MyField"));


Where record is an IDataRecord coming from a SqlDataReader or something similar. Now that's not a terrible line of code, but it gets pretty annoying typing record.GetOrdinal all the time. So to save me that annoyance I've added the following to my IDataRecordExtensions class:


public static long GetString(this IDataRecord record, string field)
{
return record.GetString(record.GetOrdinal(field));
}


An now all I have to call in my record handling code is this:


string myString = record.GetString("MyField");


Not ground-breaking, but better, and you can write an extension for all the types you are getting data for. Here's a better example of how extension methods for your IDataRecord can be more useful. Sometimes you might be dealing with a nullable type, IDataRecord doesn't handle this too gracefully, you end up having to write code that looks something like this:


string myString = null;
int ordinal = record.GetOrdinal("MyField");

if(!record.IsDBNull(ordinal))
{
myString = record.GetString(ordinal);
}


Again, not a ton of code, but if you have to do this hundreds of times it's going to get annoying and you are going to make mistakes. Now check this out, in my IDataRecordExtensions class I add the following two methods:


private static T GetNullable<T>(IDataRecord record, string field, Func<int, T> func)
{
T result = default(T);
int ordinal = record.GetOrdinal(field);

if (!record.IsDBNull(ordinal))
{
result = func(ordinal);
}

return result;
}

public static String GetNullableString(this IDataRecord record, string field)
{
return GetNullable<string>(record, field, x => record.GetString(x));
}


OK, what the heck is going on here. Lets look at GetNullableString first. This is an extension method for an IDataRecord that takes a field name and then calls this private GetNullable method. Check out that third argument though. In GetNullable its defined as Func<int, T> func. What we are doing is taking advantage of lambda support in C# 3.0 and we are saying, pass me a function that takes an int and returns me a generic T, and in this case T is a string. x => record.GetString(x) is saying passing the record's GetString method as that parameter. Now in our data handling code we can just write:


string myString = record.GetNullableString("MyField");


Nice. What's even better, is now we can easily add other extensions for other more interesting nullable types, such as double by adding code like this to the IDataRecordExtensions class:

public static double? GetNullableDouble(this IDataRecord record, string field)
{
return GetNullable<double?>(record, field, x => record.GetDouble(x));
}


So there you go. Hopefully my experiences with extension methods and IDataRecord are helpful to others.

One a Week Challenge

Joel and I were talking about ways to give ourselves more incentive to blog more. We decided on a friendly challenge that would require us to both post at least once a week. You can read Joel's post for this week highlighting Silverlight 2 from our recent trip to Mix '08. Don't worry Joel, I'm not counting this as my post for this week, check back later for my "real" post.

Sunday, March 9, 2008

Back from Mix '08

I attended the Mix '08 conference in lovely Las Vegas last week. Mix is Microsoft's conference for discussing and launching web technologies held at the Venician Hotel and Casino.

The opening keynote by Scott Guthrie (who's blog I recommend subscribing to) was pretty good. There were two primary announcements:

Silverlight 2

At Mix '07 Microsoft launched Silverlight, their competitive technology to Adobe's Flash. This year they launched Sliverlight 2 Beta 1 during the keynote. Not having ever worked with Silverlight 1 I cannot speak with much authority on the subject. I can say that the demos were impressive, especially the Hard Rock Memorabilia Deep Zoom demo. In addition, my colleague Than, who has been working with Silverlight 1 for the last year, informs me that the 2.0 release is an enormous improvement on the prior version.

Internet Explorer 8

Also during the keynote Microsoft launched Internet Explorer 8 beta. I did not expect to care much about this announcement considering my primary browser has been Firefox for years now, even before I made the move to the Mac. However, my tune quickly changed as they demoed the new version. Having been a web developer for many years now, I have come to accept the constant battle with browser compatibility. I was not prepared for their first demo to involve a basic CSS styled site, being shown in Firefox. The site looked fine, and then the speaker switched to Safari and again, it looked just fine. Then he switched to IE 7, and a giant red square appeared on the page, obviously highlighting a standards compatibility issue that IE has had for ages. And finally, he switch to IE 8, and the sight looked just like it did in Firefox and Safari. I am truly impressed with Microsoft's acceptance of the fact that yes, they are not standards compliant, and one of their major goals in IE 8 is to fix that. This feels like a complete 180 from the Microsoft of the past, and it is a welcome change in my opinion. The rest of the IE 8 demo was pretty good as well. They showed off built in development tools that should make anyone's life much easier as we all continue to build sites that must work across various browsers.

I attended a couple of session that I found to surprising as well.

Developing Data Driven Web Applications Using ASP.Net Dynamic Data

I walked into this session not really knowing what I was about to see. The presentation was about how Dynamic Data allows you to generate a UI scaffolding based on your data model for instant CRUD based UIs, sound familiar? It should, this is clearly Microsoft's answer to Ruby on Rails, or at least part of it. What they demoed was fairly good and comprehensive, and moreover, it wasn't being pushed as the end-all-be-all of frameworks as MS is known to do, but rather as yet another option in your ASP.Net arsenal. This again, is not not something I would have expected to hear out of the Microsoft of the past.

The ASP.Net MVC Framework

By far my favorite presentation was Scott Hanselman's session on the new MVC framework for ASP.Net. This was true for a couple of reasons, the first being that Scott is a truly engaging and entertaining speaker, which is a pretty impressive feat when you consider the content and audience. Secondly I enjoyed it because again, this framework was not being pushed as a replacement of anything, but rather another alternative. MVC makes up the second piece of competing with the Ruby on Rails framework, with the model-view-controller architecture becoming baked into the tools. It is still in its early stages, but looks very promising. I have been doing a lot of iPhone web application development lately, and one of my biggest issues is keeping may page size small. Due to the MVC framework's natural lack of your standard viewstate/postback architecture, it seems to me that the views you generate can be much more easily optimized for a device like the iPhone that can handle full HTML, but may sometimes be limited by bandwidth.

Overall I had a blast at Mix. Thanks Microsoft for hosting the party at Tao in the Venician, I can't imagine what the bar bill looked like for that.

The NGChart Project

In a previous post I mentioned that I was beginning work on a .Net library for wrapping the new Google Chart API. As it turns out, a couple of other people had the same idea. Today I joined the NGChart project on Google Code in order to help enhance this existing library. I was able to easily integrate it into my current project, I urge you to check it out if you need a simple way to add basic charts to your web projects.