Monday, May 28, 2007

Pandora's IP Blocking for Canadians isn't 100% Effective

As has been posted widely, Pandora was shut down in Canada due to license restrictions.

But Pandora's IP blocking mechanism isn't 100% - I just tried from my office computere here in Toronto and I could access it without any problems. I'm not sure what their criteria is for blocking but I'm just happy I can get through and still access the service.

Sunday, May 27, 2007

The Best Old Computer Commercials

Here are some great old computer commercials.

One thing that is noting is how amazing sexist they are - Dad always is the one who buys the computer and the Son is always the recipient because he has poor grades. The most Mom ever uses a computer for is to put in a recipe or two and sister is almost never seen. The worst case is the last ADAM commercial below where the sister helps brother get a computer so that she can get a Cabbage Patch Kid - heaven forbid she might want to play Donkey Kong herself!



William Shatner got as fat as bloatware!



Apparently, only boys played with computers in the 80's!



Computers don't lie - they're honest...huh?



Balmer still sounds like that 20 years later...and when did Reversi become a feature?!



I had this computer myself - for the price it was actually a great computer, but it got smoked thanks to poor marketing and support from TI by Commodore in the mid-80s.



I had this computer as well. This was one of the last generation of personal computers before the PC takeover in the mid-80s which accounts for its everything but the kitchen sink approach. It had video games, a super speed tape drive, a daisy wheel printer, a build in word processor, etc. It was an odd computer, and it didn't sell very well. But I had one for about 2-3 years and it worked quite nicely for my needs when I was in junior high school.

Another strange note on the ADAM: the version of BASIC was a complete rip-off of Apple II BASIC. I noticed the syntax similarities when I was over at a friends place and then went to the library and borrowed all the Apple II BASIC programming books I could find and had a blast!

New Feature Request for Facebook - Add Support for Maiden Names

I've been on Facebook for a few months now and am always searching up old colleagues, highschool mates, etc.

But I've found one general problem - searching for people who have changed their last names.

What about supporting searching by maiden names. For those people looking for people they knew when they were much younger, that would help immensely. I've had several people I couldn't track down because they married and changed their name.

Bug of the Week: Blackberry Bug



For those who have Blackerries, Brickerbreaker is the Breakout clone that comes with the Blackberry OS.

In the latest version, I have found a mystery bug - for some reason every once in a while, the ball hits the top of the screen and instead of bouncing downwards, it instantly moves to the bottom corner of the screen and starts going upwards! Its not that common, but given enough play testing you would definately experience it.

The strange thing is that I cannot figure out the pattern as to why it happens - it doesn't seem to be any particular spot, ball position, level, etc. that causes the bug.

Monday, May 21, 2007

Web 2.0 Bug of the Day - Facebook Bugs

I found a couple Facebook bugs today...

1. If you click on "My Friends Posted Items" it should give you an RSS feed. However, instead it prompts you to save a PHP file with the XML inside. MIME type isn't right I'm assuming?

2. The paging in Facebook isn't quite right. For example, if I do a search for classmates from my highschool (Woodlands School, Mississauga, Ontario, 1991 Graduation Year) I get a list of 23 people. If you go to page 2, you get 2 people repeated from the previous page.

3. Facebook security check routinely now returns an image that is unreadable. Sometimes you have to hit the refresh 4-5 times to get it to come up.

New People Search Engine - Zoom Info

I'm always interested in networking sites, especially those with good people search engines. Since I've been on the Internet a very long time (pre-WWW was even invented) I have a very long trail of posts, press articles, and teenage writings from years and years ago.

As I've written before, finding people is not difficult if they have contributed to facebook, MySpace, etc. and there will definitely be a problem in 10 years where people want to remove their facebook pages after they have grown out of their teenage years. See my article on this previously.

For those who are in my generation (I'm 33 years old), many never were as adventurous and so finding people becomes a big more difficult, but not impossible. Almost everyone has some kind of Internet presence. Its a matter of digging in the right places to track it down.

A new tool called ZoomInfo helps in this regard. Type in any name and it will find many old press references for that name. What's smart about it is that it seems to be good at parsing out references to relationships between people, companies and other colleagues. It also seems to be able to collate references together into a profile, e.g. it can recognize the same press article in multiple places and summarize them together.

If you look up yourself and find your own profile, you can claim your profile either by verifying against your credit card. They don't charge the card, they just use it to authenticate your name.

My Opinions in the Press - 2000 and Today

I found this article today from 2000 that I did press for when I worked for Chapters Online (the equivalent of Borders/Amazon here in Canada).

I just landed in the press again for a project we did at the Foundation with Microsoft using their new Expression Blend product. In working with Microsoft, I also did some press with them to show our support and extend our partnership with them. You can see the resulting article in the Globe and Mail here.

Friday, May 18, 2007

Finding a Templating Tool for Printing in .NET

We have a pretty basic requirement for printing cards, envelopes, brochures, etc. We want to take requests in for donations and then allow for printing in batches of these orders.

The PrintDocument is the main class in .NET for printing. The sample code shown looks like this:

Private Sub pd_PrintPage(sender As Object, ev As PrintPageEventArgs)
Dim linesPerPage As Single = 0
Dim yPos As Single = 0
Dim count As Integer = 0
Dim leftMargin As Single = ev.MarginBounds.Left
Dim topMargin As Single = ev.MarginBounds.Top
Dim line As String = Nothing

' Calculate the number of lines per page.
linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics)

' Print each line of the file.
While count < linesPerPage line = streamToPrint.ReadLine() If line Is Nothing Then Exit While End If yPos = topMargin + count * printFont.GetHeight(ev.Graphics) ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, New StringFormat()) count += 1 End While ' If more lines exist, print another page. If Not (line Is Nothing) Then ev.HasMorePages = True Else ev.HasMorePages = False End If End Sub


However, this requires you to manually print by drawing through the graphics context. This is not a great solution for something like envelopes, cards, etc. because hard coding a bunch of strings is not really a scalable solution.

What we need is a template engine - something to define a template that can be filled with data and then printed, all through .NET code. In addition, I would like the ability to print the same document to an image file so that I can show the user a print preview through the web.

So what should we use for a template engine? The options we came up with were:

1. Word - using the supplied primary interop assemblies, we could load up a word document, fill out some form fields or do a mail merge programmatically. However, this isn't recommended to be done by server based applications because each time you load up an instance of Word to do the processing.

2. Custom template - we could define our template layout. Given the amount of data we have, it wouldn't be that difficult to define a template that contains a basic background, some text fields with X,Y locations, etc. I'm not exactly a fan of this type of solution because it doesn't scale in terms of functionality - what happens when the user wants rich font support, margins, tables, embedded bitmaps, paragraph formatting, etc. Surely, we shouldn't have to re-invent the wheel here.

3. Printing existing controls. See this article on a basic explanation. This would allow you use a windows form as a template and the print it. This is better than custom coding a template engine, but its not exactly a great solution either - who wants to build a windows form to represent an envelope?

After exploring a few other ideas, we came up with a basic idea - use SQL Server 2005 Reporting Services. After thinking about it, it provides us all the pieces we need in a nice package:

1. Template engine based on XML that can be generated by a relatively non-technical user.
2. Automatic data binding to the data source - simply create a report that represents a card, an envelope, etc.
3. Page sizing and pagination support - we would need this for envelopes and odd sized cards.
4. Rendering to image format - we can use this for preview.
5. Programming model through web services and ability to grab rendered output through web services. So for our preview feature, we can simply call the web service and stream out a rendered image. Alternatively, we can simply point the URL that will supply a rendered image of your report.

So we think we can use SQL Server 2005 Reporting Services as a template engine and embed it into our web application to enable server side printing.

One drawback on this approach - I haven't found anything in the web services API that allows me to render the report directly to the printer. I can see the ReportExecutionService.Render method that can give me back a stream in any format, but then I would need to figure out how send that stream to the printer. The simplest format to handle would be an image - simply then drawing on the graphics object and printing it would then be possible. There is a good post on this type of idea here...

Tuesday, May 15, 2007

8 year olds now have blogs

I thought it was ridiculous when kids got their own cell phones, but now they're starting to have their own blogs as well. See here for details.

At least my traffic numbers are better than the 8 year olds - for now at least!

New Programming Language for Kids


I started programming when I was 5 years old in 1979 on a Commodore PET. In those days, the PET came with BASIC and no software, so my father who had brought one home showed me how to write some basic code.

Typical programs I could write at 5 were:

Print "What is your name?"
Input a$
For i = 1 to 100
Print a$ + " is great!"
Next i


We used to go into the local department store and write the following program and leave it running:

Print "K-Mart sucks!"
Goto 10


The average sales person at the time wouldn't know how to stop the program and have to turn off the computer!

This was cool stuff when I was 5. I started working with LOGO as well at an early age as well, doing lots of interesting things with turtle graphics, geometry, etc.

My daughter is now five, so I've been looking for programming languages to introduce her to programming concepts. The problem is that any programming language simple enough for a 5 year old is very lame by a modern computer's standards. LOGO was a big deal in 1979 because drawing a circle, a line, a square, etc. was pretty cool. When I showed my daughter LOGO this year, her reaction was, "That's all it does? I think I'll just go to a web site instead."

MIT has just published a new programming language that is graphical based, uses draggable commands and is focused on sound, animation, pictures, etc. I tested it out this evening with my daughter and it was a big hit! We created some animations together, did some drawing, added some sounds, etc. and then showed it to mom before bed.



If you have children or are simply interested, you can download the software here.

Wednesday, May 9, 2007

Developing an Analytics Platform for Microsoft .NET

A few weeks ago, I posted an article on a proposed new approach to analytics. I argued that we needed a new paradigm for analytics that goes beyond the static page analysis model found in major engines such as WebTrends, Google Analytics, etc.

So this weekend I started designing one in .NET and now have a pretty decent tracking model. I started with an article I found on .NET and tracking. I took Vikram's basic ideas and expanded them a little bit to add some more general concepts.

The basic architecture looks like this:



The terminology on the diagram comes from Domain Driven Design by Eric Evans.

I've tried developing this as a pretty basic framework and made it as light as possible so that if my site gets a lot it won't take a lot of a) memory or b) load to persist the data. But the architecture achieves what I wanted to achieve, namely it allows me to save event data based on userid, sessionid and affiliate referrer and to specify the nature of those events based on programming events (e.g. a transaction happening in the business domain) instead of simply tracking a logged URL.

Once the data is logged, we will design a data-mart that will suck the data out of the log and process it into some decent OLAP cubes for reporting purposes.

If you want to send me feedback on the ideas, please feel free to leave your comments...

Monday, May 7, 2007

Google Spreadsheets has less features than Excel for Windows 3.1

I was playing with Google Spreadsheets today and I found it lacking in some basic features. There are features that I remember being in Windows 3.1 Excel (Version 2.0?) that are missing in Google:

  • Data extrapolation
  • Double click a column to auto-size it
  • Copying and pasting a column and having it re-size properly
  • If you have a border that is boxed on all sides and then click the left border, it doesn't do anything.
  • Clicking on ctrl to add non-contiguous cells together.
  • Field names
  • Autosorting of data
  • Pivot tables
  • Spell check
  • Validation support
  • Group and Outline
  • Ability to fit print results on a page, see print preview in the spreadsheet

These are basic functions that I use all the time. In addition to these pretty basic features that are missing, the overall feeling of doing data entry is very slow - responsiveness is something that needs to be instant in a spreadsheet and there are too many operations that feel too slow for serious number crunching work.

So while Google Spreadsheet seems like a nice idea, its not something I could ever see replacing Excel.

See also my post previously on these types of "Internet applications" replacing desktop applications - looking at the current crop of examples, even a PocketPC running Windows CE has more application power than what's currently the best of the Internet applications.

The Half Life of a Good Post - About a Week

Last week I went to the MIX07 conference and blogged a lot. I acted like an intrepid reporter, posting up reviews of each session as I went to them. MIX07 became a top ten search term in technorati, so I received quite a bit of traffic to my blog.

So I wanted to find out - what is the half life of a successful blog entry? How much time does a blog entry live?

My conclusion - the half-life of a successful blog entry is about a week. After a week, traffic is almost completely gone from sites such as technorati, shoutwire, digg, etc. In addition, there doesn't seem to be much loyalty factor at least for my small blog - I haven't built enough brand power yet that I'm getting a lot of repeat visitors. Almost 70-80% of my visitors are brand new to my blog.

I'm not sure if this is typical, but it shows that attrition is very high and that bloggers who are not committed to posting every 2-3 days are not going to get any follow through in traffic. Its either post or perish in the blog world!

Wednesday, May 2, 2007

MIX07 72 Hour Conversation Archive

Here is a list of the posts I made throughout the MIX07 conference. These were done in near real time as sessions ended. Enjoy!

Minor Bugs in Major Web Sites

Here are two basic bugs that I would love to see fixed:

1. On Technorati, the Next button doesn't go past page 2!
2. On Digg and Shoutwire, their buttons (e.g. the Digg This) don't cooperate nicely together thanks to some funky CSS. In addition, they don't play nicely with blogger either - I end up having to add a couple BR tags in order to avoid overlapping the next article.

Can someone please fix these problems?!

MIX07 Update: The Impact of Bloggers on Public Relations

CIO.com reports that there was a disappointing talk at the MIX07 conference on "digital entertainment". I didn't attend they keynote (preferring to take the time to put up some blog posts instead) but the immediate reaction shows the power of bloggers controlling news.

Before even the talk was concluded, people were blogging about how poor the talk was in near real time. It shows how important the blogging community has become in the following ways:

1. News is released in real time by thousands of bloggers. MIX07 and Silverlight both made the top ten searches in Technorati. Managing this spin cycle in real time becomes increasingly important for any PR department or agency.

2. The news dies quickly. I was blogging every 3-4 hours, and my the time my post was up on Technorati, the last one was already buried off the first couple pages. The best thing you can do from a PR perspective is to flood the network with news - this helps to bump older content down the list and traffic to those news items dies as a result. I have personally seen a massive drop-off even with my own posts after about 24 hours in traffic coming from news search engines such as Digg, Shoutwire, Technorati, etc.

3. Reading is happenning in real time as well. I was blogging throughout the MIX07 and I could see through analytics each post was getting traffic within minutes of being posted. Its hard to tell whether these readers are people at the conference or those simply visiting from the outside and experiencing it vicariously, but if you can generate enough awareness there will be a large amount of readers who will grab your message in near real time.

4. Its a bit hard to understand the impact of blogging on conference goers themselves. For example, did enough people start reading blog entries or news sitting in the talk that they got the message to walk out? Given the number of blackberries and wireless laptops in the room, its a possibility.

Tuesday, May 1, 2007

MIX07 Update: The Future of N-Tier Architectures

As a Director of IT, one of my principle jobs is to recruit talent. During our interview process, we start by asking a candidate about a project they designed, coded and deployed and we present them this picture:



The interview discussion focuses on answering what replaces the question mark - what is the appropriate N-Tier Architecture for their application. You can use this question for any developer because its open to multiple solutions - the junior developer might answer that there is an ASP.NET page that connects using the supplied wizards to an ADO.NET connection that then talks to the database. For a more seasoned architect, they should answer with a much richer domain model, database access layer, proxies for web service or other distributed calls, monitoring and configuration management layers, class factories, etc.

That's why the question is an interesting question for interviewers - it forces the discussion to question design decisions. Why did they use ADO.NET? Why did they choose web services instead of remoting? Why did they choose to keep code in separate objects instead of in the code-behind files? Why did they choose particular design patterns, etc.?

As web technologies have evolved is that they have focused on adding maturity in the tiers. A classic ASP site with some ASP page code, some VB 6.0 objects and a connection to the database through ODBC is now an ASP.NET page, a code-behind file, some domain model objects, some ADO datasets, web service proxy classes, etc. Now there are dozens of options on implementation of that middle-tier and the role of the architect is to decide amongst a selection of options which is appropriate for the particular application being built.

What has happened as these technologies have evolved is an explosion of tiers. In the last enterprise application I managed, we had the following tiers: 1) reverse proxy; 2) HTTP handlers/modules; 3) ASP.NET page; 4) code-behind files; 5) value objects or business entities; 6) web service client stub classes; 7) web service handler classes; 8) data access layer objects; 9) Microsoft Enterprise Library; 10) the Database!

At least it was still easier than using classical J2EE! :)

What seems to be happening as Microsoft technologies evolve is a resolving of this tier explosion through a few different strategies:

1. Use of LINQ to simplify data access and consolidate the data tier into some SQL like statements.

2. Code generation techniques for automating plumbing code (the LINQ designer for example will build your domain model simply by pointing at a schema).

3. Smarter web controls that require less code - Dynamic Data Controls for example.

4. Integration of .NET into Silverlight to put more smarts into the client instead of requiring web service calls for every function.

5. Greater focus on Plain Old .NET Objects - LINQ in particular moves from the heavy Dataset based approach that ADO.NET uses as value objects and can instead populate simple lightweight classes that the developer can design as required.

6. Greater focus on declarative languages - LINQ and also use of IronPython and PHP for example. Instead of focusing on imperative languages that specify the algorithms on how to do instructions, a declarative language allows the developer to focus on business rule declaration and specify what is required and delegate implementation to the framework.

7. On the client side, dramatic improvements in rendering in Silverlight especially in 3D based applications.

All these developments are promising. If the technology works as advertised then development of basic plumbing operations such as CRUD operations with a database, web service calls, etc. should be dramatically easier to code and maintain.

However, "works as advertised" is always the challenge. Developers who have worked with O/R mappers for years have experience with frameworks that claim to hide away details but then also hide away performance bottlenecks, poor implementation strategies and developers are increasingly dependent on the framework to work in the background.

And from what I have seen at the conference so far, its really too early to tell - we're still at the "Just use the wizard" stage where Microsoft demos a cool technology by running a dinky unrealistc demo. Don't be the fool to take the sample code and consider it ready for production without some serious design review!

MIX07 Update: Silverlight 1.1 and .NET Development

I went to a session this morning on Silverlight 1.1 Alpha which is the next version of the product. It features a number of interesting features:

1. Complete CLR .NET based framework - write your Silverlight applications in VB.NET, C#, IronPython, etc. using standard .NET classes. What ships with Silverlight is a stripped down version of the .NET framework in order to shrink the plug in size. For example, XML document reading is included, but XSD validation and XPATH are not included.

2. Silverlight runs 100% client side all the managed code runs within the plug in and will run the same on a Macintosh as it does on the PC (although I have heard this before with Java applets and it never quite worked 100%).

3. Serving Silverlight apps can be done any web server that can serve files. So if you want to deploy your apps to an Apache server, no problem.

4. If you choose to serve your Silverlight apps from ASP.NET you get some advantages and tight integration with your ASP.NET page.

5. Debugging support is built in, including debugging via a proxy client on a Macintosh. Debugging is standard Visual Studio debugging with breakpoints, stepping through, etc.

6. LINQ for objects is supported with LINQ for databases (DLINQ) and LINQ for XML (XLINQ) on the road map.

7. There is the ability to interop between HTML and Silverlight. You can access the HTML DOM from Silverlight, and you can expose your objects in Silverlight to javascript by using a simple [Scriptable] attribute.

8. Web services support is very strong with wizards for generating all the stub code including support for Windows Communication Foundation (WCF).

In general, I was pretty impressed and the 1.1 version is the obvious target for traditional .NET developers. From my perspective, the killer application for Silverlight isn't the animation sitting on web page that makes some animation go in as static content. Where its going to pulverize Flash is where you have .NET application developers who want a rich user experience without having to learn an entirely new programming language in ActionScript. Even in 1.1, the CLR in Silverlight seems much more robust than typical ActionScript code and more importantly for .NET developers is familiar territory.

Silverlight and MIX07 Are Now in the Top 10 Searches in Technorati



The traffic coming from the MIX07 conference is having an impact on the blogosphere.

Mix07 currently sits at #3 and Silverlight sits at #5. Silverlight is now officially more hyped than Paris Hilton - congratulations, Microsoft! :)

MIX07 Update: Evolution of Declarative Programming in .NET

One of the key messages from the MIX 2007 conference is the evolution of the .NET framework to support a much more declarative programming style.

Anders Hejlsberg made the claim that the potential productivity improvements from imperative programming are limited - we've essentially already invented all the major programming constructs and he doesn't see much more productivity improvements - we're not going to invent the equivalent of a new type of FOR LOOP - we've got them all.

Declarative programming paradigms have some significant room to improve developer productivity by simply changing the game - instead of making developers focus on statements that construct the logic on how something gets done, declarative programming frameworks can allow programmers to focus on focusing on domain level concerns.

An example of this is LINQ - instead of writing a data access layer for every table, with LINQ you can simply write declarative SQL like syntax. The data access layer is automatically generated for you. In addition, the power you get in the LINQ for declarative SQL like logic means that you can do all sorts of database operations in code that would have taken tonnes of imperative style coding previously:

var wordGroups =
from w in words
group w by w[0] into g
select new { FirstLetter = g.Key, Words = g };


Just imagine the amount of plumbing code you would need to do this in today's .NET or Java frameworks - this is the power of declarative programming styles.

The same is true on the interface side - the power of languages such as HTML, CSS, PHP, Python, etc. are declarative languages that allow the user to use a declarative programming style instead of an imperative set of instructions.

In HTML, the imperative version would be what we used to do with old CGI or classic ASP applications to generate HTML programmatically. It would look something like this:


Response.Write("<html>")
Response.Write("<body>")
' build a table with n rows and m cols
Response.Write("<table>")
for i = 1 to n
Response.Write("<tr>")
for j = 1 to m
Response.Write("<td>")
Response.Write("</td>")
next j
Response.Write("</tr>")
next i
Response.Write("</table>")
etc.

This type of programmatic approach to HTML generation has almost entirely disappeared as declarative programming styles have now allowed interface developers to simply write HTML directly.

Expect more of this declarative style in deeper layers of the architecture and for the syntax of the declarative constructs to support more complicated and domain driven programming patterns. This will hopefully have an impact on the amount of plumbing code required for core business logic domain problems such as O/R mapping, value object design, web services coding, security/user/authentication problems, profile mapping, configuration management, etc.

In addition, one of the key frustrations with declarative programming for me has always been the sacrificing of strong types, IDE integration, compile time checking, object oriented principles (try doing inheritance or encapsulation with HTML!), etc. But with technologies such as LINQ we may be at the stage where we don't have to make such a sacrifice and integration of declarative and imperative programming styles can happen in the same environment allowing for both styles to work where appropriate.

MIX07 Update: LINQ finally brings OR Mapping to .NET

I mentioned in my last post that the recommendation for dynamic data controls was to use the LINQ data source, and that it had better be good in order to handle all the different types of data sources, object collections and heterogeneous data objects we as developers might want to use.

The good news is that the last session I saw today was on LINQ and in general I was very impressed. It's exactly what .NET developers have been missing since ADO.NET came out ages ago. Java has had decent (if not perfect) O/R mapping libraries for years both in commercial products (TopLink for example) and open-source (Hibernate for example). In the .NET world, there have been some modest attempts at open-source O/R mapping layers (NHiperbate, Gentle.NET, etc.) but because ADO had such a stranglehold on the developer culture they never have flourished. ADO.NET as an O/R mapping layer has been very weak since day one - its more of a basic table gateway pattern than a full O/R mapping layer.

Enter LINQ to the rescue. Here is what I saw demonstrated today:

1. In C# 3.0 or VB 9.0 (shouldn't they reconcile these version numbers at some point), declarative SQL like commands are embedded into the language allowing for strongly typed variables, mapped objects and a SQL query type language.

2. LINQ can currently map to objects, SQL Server, and XML. This might be limiting for the non-Microsoft databases (Oracle, ODBC, Sybase, etc.) but I would expect these to be vendor provided at some point in the future.

3. Based on what I saw, performance looks pretty good in terms of the SQL produced by the layer. One of the smart things that the code does is that it doesn't actually execute until the list of objects is iterated allowing for the combination of queries, filters, etc. that doesn't actually hit the database until you grab the final result set. This allows LINQ to optimize joins, sorts, group by, etc. based on all the combined SQL queries you join together. In addition, parent/child relationships and how they are loaded is configurable based on the context, so you can decide whether it makes sense to lazy load or pre-load your child objects based on your performance needs.

4. Object mapping is done as pure value objects which allows for good separation between the data layer and your domain. So for example, you can define an order object which has nothing but properties and then use either XML, SQL or any IEnumerable collection to load a list of those objects.

5. There is an included designer which allows for code generated classes from existing stored procedures, tables, views and functions. Stored procedures can be assigned for selection, inserts, updates and deletes. If a stored procedure isn't specified, then LINQ will generate the SQL for CRUD operations dynamically. From what I could see in the log, the generated SQL was as it would be expected.

The bad news - LINQ is just in Beta 1 and isn't arriving in final until the next version of Studio 2005 (2007? 2008?) In addition, using LINQ will require at least .NET 3.0 and maybe 3.5, so it will require a framework upgrade to use it.

In general, I was pretty impressed - if Microsoft had this type of technology a few years ago then they would have smoked J2EE before it even got started. In general, they have recognized that the road to developer productivity is to simplify the middle tier. LINQ looks to go a long ways to reduce the amount of basic plumbing required to persist data whether its to an object collection, XML file or SQL database.