# Sunday, March 16, 2008

silverlightwarning Regular readers of this blog will know that my background is primarily in the Microsoft development world, with the odd foray into Java (and more recently, experiments with Ruby and Processing). So when Microsoft announces some new tool or framework, I'll pay attention and see what's up.

Right now, there's a good deal of hype and excitement around Silverlight... which sounds great to me in theory, but in practice has been largely a disappointment.

And I saw that as a user, not a developer. I can't even think about using it for development at this point because, frankly... it simply doesn't run for me as a casual web user.

Rich Ziade nails some of the issues in his post from Friday, called "Microsoft-Centered Design":

So I'm perusing the various blog posts that have streamed out of the MIX 08 conference and some interesting talks are available online. So I head on over to the MIX 08 site to view some sessions and I run into this:  [image of the "You need Silverlight" placeholder] ..  Yep, I need to download Real Player, I mean Silverlight to watch these videos. Silverlight, for the less enlightened, is Microsoft's foray into streaming video, rich media and rich apps on the Web (aka Microsoft's Flash).

I agree with Rich's premise that Silverlight apps (or at least the demos we've seen so far) don't really provide much reason to use it over Flash -- a time-tested, well-supported platform for rich web apps.

But I find the problem with Silverlight to go even deeper:  For me, it simply doesn't work.

I use Firefox as my browser... and despite lots of examples and statements about Silverlight being not only cross-browser, but also cross-platform, I can't get it to run in Firefox. On any machine I've tried. To date, that's five machines. All of them are running similar setups:

  • The most recent production version of Firefox (currently 2.0.0.12), with extensions:
  • del.icio.us Bookmarks (for quick access to my bookmarks)
  • Firebug (for debugging and development)
  • Flashblock  (to block Flash content from loading until/unless I want to see it)
  • Google Toolbar  (because... well... because it's the Google toolbar)
  • Remember the Milk for Gmail   (because seeing my tasks right next to email rocks)
  • Tab Mix Plus  (because I want to choose how/when/where new tabs are opened in Firefox)
  • IE Tab (see below)

Note that what I'm NOT running is the NoScript extension, which reportedly causes problems for Silverlight in Firefox.

I can't tell you how many times on these machines I've gone to download the various versions of Silverlight and see if maybe... just maybe... THIS TIME will be different. So far, no joy.

silverlightsave The issue isn't made any easier by the various versions floating around... Silverlight 1.0, Silverlight 1.1 Alpha, some sort of refresh/CTP version for 1.1, and now Silverlight 2.0 as of Mix08. This thing's been around for just a year now and there are already more SKUs of Silverlight than there are of Windows XP.

Of course, things do appear to work fine in IE7. But I don't want to run IE7 as my browser. I've got Firefox and its extensions tweaked to be exactly the way I like it.

The only way I'm able to get Silverlight content to run inside of a Firefox window currently is via the "IE Tab" extension -- which loads the IE rendering engine inside of a Firefox tab. In doing that, though, I lose the integration with the rest of Firefox. And it's only cosmetically different from having two browsers open to begin with. I don't want that.

I would like this to work. I really would. So far, it seems that the newer Silverlight 2.0 will run inside of Firefox -- however, the vast majority of the Silverlight content out there (which, as Rich points out, could be provided in Flash without losing any functionality) is NOT targeting Silverlight 2.0. It seems to mostly be in 1.0 or 1.1.

So until Microsoft gets this working correctly in Firefox, I find myself having to make a decision every time I come across that drives-me-up-a-wall "Get Microsoft Silverlight" badge -- do I really care enough about this content to deal with the frustration and go outside my normal workflow to view it?

More often than not, the answer is "no," which is a shame because there are some interesting videos out there in Silverlight format (the screenshot above is from Jon Udell's Perspectives video audio interview on MS Robotics).

As a developer, the notion of using XAML to build applications that can be run via Silverlight as well as via a WPF rich client sounds really cool. But how can I get excited about a new developer platform that's completely broken for me as a user?

Update: In the comments, Jon Udell clarified that the Perspectives link above is audio and not video and I've since downloaded the MP3 version. The "Get Silverlight" badge made it look like a video to me and seeing that badge repeatedly without being able to get it working in Firefox prompted the post. Thanks, Jon!


posted on Sunday, March 16, 2008 9:54 PM Mountain Daylight Time  #    Comments [2]
# Saturday, March 01, 2008

ilvdata Data Visualization (or "Infoporn" as I like to call it) has been a passion of mine for many years. Most of my career as both a developer and manager has been in the development of software that visualizes large sets of data. For the most part, my work has been around energy industry data but I'm often up late into the night tinkering with data sets I find online.

Over the last couple of years, the visualization of data has taken off and become much more popular than in the past. What used to be the exclusive domain of formal textbooks and students in specialized design programs has become accessible to a wider audience. As I think about it, I suspect the reason for this growth in popularity is the convergence of several factors:

  • There is a TON of public data available online. Over the years, I've collected a variety interesting large public data sets, such as AOL search data, Enron email messages, and Netflix movie ratings. Peruse the "publicdata" tag on del.icio.us and you'll find more data than you can shake a chart at. In addition, the popularity of web services and public APIs for data has exploded in the last couple of years. These are ideal for fetching current, dynamic data including weather, stock prices, and other financial data. There are also web sites that catalog the wide variety of web service APIs available online. The popularity of online "mashups" (the combining of two or more web services to create something completely new) has grown very quickly, particularly with the arrival of online mapping services like Google Maps and Virtual Earth. These days, popular web sites that don't provide an API for programmatic access quickly catch heat for their omission.
  • Data has become "social" -- though in a "Web 2.0" world, what hasn't? Seriously, there have been some great "social data" sites cropping up over the last couple of years. These sites let anyone upload, visualize, browse, and share their data. Don't like the way some data on these sites is represented? Chart it yourself. The hallmark examples here are Swivel (blog) and Many Eyes (from IBM, also with a blog), though there are other similar sites as well.
  • Visualization tools have become more commonplace. In addition to Microsoft improving the charting tools in each new version of Excel, nearly every programming language out there has 3rd party graphics and charting libraries available for it. For many developers, adding basic charting capability to an application has become a fairly simple, plug-and-play affair. That said, it's still too easy to create charts that are ugly and do a poor job of communicating information. In the same way that the rise of desktop publishing tools in the 80's and 90's made for a lot of horrible newsletters and brochures, the increasing number of charting and visualization tools means we're seeing a lot of really bad data presentations. Go ask Edward Tufte (a "founding father" for modern data visualization) about PowerPoint or Stephen Few about BusinessObjects to see what I mean (Few refers to the charts from one Business Objects product as "data visualization Happy Meals" -- not a compliment). Still... it's an exciting time right now for this field.
  • Development tools have improved greatly in their handling of data. Most development platforms/environments have some sort of abstraction layer or available data-access tools to easy the querying and manipulation of data. For dealing with local data, it's rare to have to write new code from scratch to ingest and parse data -- most tools have libraries for standard formats like XML or CSV, as well as straightforward APIs for working with relational databases. For remote data, there are lots of tools that quickly generate a local proxy or wrapper around standard web services.
  • The development tools for creating and manipulating graphics have similarly improved. Writing code to create on-screen graphics used to be something that an elite few programmers could do -- it typically required very strong C++ skills, in-depth knowledge of complex graphics libraries, and a background in physics and 3D modeling. Now, most modern platforms have relatively approachable APIs for drawing points, lines, regions, and text on screen - as well as simplified APIs for 3D manipulation.
  • visualizingdata Also on the graphics front, there's Processing - a development environment designed and developed specifically for visualization. It's built on top of Java, but its creators (Ben Fry and Casey Reas) and collaborators have done a great job of balancing approachability (for designers or those new to programming) and power (for those who want to create advanced, interactive visualizations). If you're interested in checking out Processing (which is free and open source and a lot of fun and so you totally should), I'd recommend Fry's book, "Visualizing Data" (published last year by O'Reilly)... Jeff Atwood calls Fry "Edward Tufte armed with a compiler" and I've found the book to be an excellent walkthrough for Processing. Additionally, it's good introduction to the thought process involved with creating an effective visualization.
  • Computing power and storage are cheap and plentiful. It takes a lot of processor cycles to render graphics and a lot of storage space to keep all that data. Thankfully, even a "low-end" machine these days has a ridiculous amount of processing power and 250GB hard drives are a common starting point for hard drive sizes. I recently purchased a 750GB drive for my Windows Home Server machine and its cost was roughly $.20 per gigabyte. While marveling about that the other day, it occurred to me that my very first hard drive (a 10MB noisy beast given to me in the late 80s by a generous uncle) would be insufficient to hold even ONE raw photo from my new camera (a 12-megapixel Nikon D300). Insane. Thank you Mr. Moore and Mr. Kryder.

Given all of the above, it's a great time to be a data geek. Even if you're not interested in designing visualizations of your own, there are lots of blogs and sites that catalog the best infoporn from across the web. It's amazing to see so many projects coming out that are both informative and aesthetically pleasing. The thumbnail below is an example from this week - it's essentially an interactive "area chart over a timeline" showing the Box Office Receipts for movies from 1986 to 2007, designed and built by the New York Times data visualization team (they've been doing some amazing stuff recently).

NY Times Infographic In addition to checking out my del.icio.us "infoporn" links, you might want to look over some of the feeds I've subscribed to:

In coming posts, I'll link to some of examples of visualizations that I find to be the most impressive, informative, and even humorous.

posted on Saturday, March 01, 2008 12:35 AM Mountain Standard Time  #    Comments [0]
# Saturday, February 23, 2008

Inspiron 531 Mid-Size Tower A couple weeks ago, I set up Windows Home Server in the house, opting to go the DIY route rather than with an out-of-the-box solution like the HP MediaSmart. I saved a bit of money in the process, though it wasn't without some issues getting started.

For a machine, I turned to the Dell Outlet site, which I've used in the past and haven't had much trouble with. I've purchased a bunch of machines via the Outlet over the years and only one has ever had issues (blogged about last year). Odds are that it would happen at some point with a non-Outlet machine at some point, so I wasn't worried about ordering another box that way.

The machine is an Inspiron 531 desktop, with 2GB of RAM and a 250GB drive in it. It also has a DVD burner, mid-sized tower case, and the standard integrated network and video (the latter isn't needed by WHS). It was $249. Dell had sent me a coupon the week I was watching the Outlet, which basically took care of the shipping and tax. I spent another $150 or so at NewEgg to add a 750GB -- Roughly $400 total for that machine with 1TB of storage. (Note: looks like the only option now is to get a 530 rather than a 531. The difference is that the 530 uses an Intel CPU while the 531 has an AMD processor).

The setup started off fine, but I ran into issues later when I had to put drivers on the machine (after installing WHS). The Inspiron had shipped with Vista Home Premium, which I didn't need, but WHS is based on Windows Server 2003. The drivers that came with the machine (and available via Dell Support) were Vista drivers and didn't fly with WHS. Some Googling and experimentation led to trying the Windows XP drivers, which seem to be working just fine. The main holdup here was the network card's driver... with no network, I had to use sneakernet to get the drivers on to the WHS box.

So I saved money over going with an off-the-shelf Home Server... but paid a DIY tax with an hour or two of setup time and tinkering around with drivers. I'm happy with that.

Once set up, the experience has been awesome. The machine is running "headless" at this point, but the client software is on a few different machines now and works great for managing the server. In a pinch, I've used Remote Desktop a couple times to look at the server's control panel.

The features I like the most:

  • Access to the file shares on the server just plain works. There's no futzing with ACLs, Windows firewall, or anything else. Each user account on the server has its own private share, there's a public share for general use, and dedicated shares for music, photos, videos, and software. An admin account can control access to those in simple fashion -- each user account gets no access, read-only, or read-write. From the client perspective, it's just \\SERVERNAME\SHARENAME and you're good to go.
  • Backup is solid and runs seamlessly... it takes a while when you initially run it (go wired for that first backup!), but after that, the incremental updates aren't really noticeable.
  • There's a Tivo add-in that hooks write into your music, photos, and videos. That adds access to our Tivo Series 2 (Home Media Option), along with the Xbox 360 Media access that just works out of the box with WHS. I don't need to publish photos and music from a spare desktop machine any more. As an added bonus, the machine's faster than that spare was so scrolling through images and music is way fast.
  • Related note... remotely installing an add-in is dead simple. Copy an MSI into a share on the server, run the remote management client, and tell it to run the MSI for the add-in. Removing an add-in later looks just as easy.
  • Remote access to the server over the internet is very cool. The WHS setup process gets you a subdomain under the homeserver.com domain and you can log into the server from any web browser to get at the files stored there. That's already proven handy when I wanted to show someone in the office a photo that we were talking about.

A few things I'd like to see improve or change:

  • I still think that Microsoft needs to make WHS available via MSDN. I've got a few different ideas for add-ins I'd like to develop, but I'm not interested in doing development and debugging on the home server that's actually in "real world" use at the house. Unless they change this decision, it'll mean I need to purchase a separate WHS license if I want to get serious about add-in development. Incidentally, they've received a LOT of feedback on the issue, but currently say it's not available on MSDN due to some "valid logistical issues"... who knows?
  • It doesn't seem like there's a real great solution yet for managing our music via an iTunes library. Aside from WHS add-ins, installing software on a WHS machine is discouraged... so iTunes has to be on a separate machine. But honestly, the only time iTunes gets used is for syncing our iPods (and related playlist management). Playback in the house is done via the Tivo or Xbox 360. So all the music is in two places now -- WHS and that spare desktop machine (with iTunes) that we plug the iPods into. I think (but am not certain) that I could have the iTunes library on that machine simply reference the files on the WHS box -- but haven't tried that route yet (mostly for fear of hosing up the iTunes metadata and "device awareness" for our iPods). Need to do more research here.
  • Obviously a big issue that MUST get addressed soon is the widely-reported corruption problem. Thankfully, we're not editing files directly on the server shares (and won't anytime soon). The editing/manipulation tends to happen on our client machines, with the results being backed-up or simply stored for shared-access on the server.

I suspect that corruption issue is THE top priority for the WHS team in Redmond... once it's resolved, my next hurdle will be to figure out the best way to set up Lightroom catalog(s?) for the 7+ years of photos we have stored. Currently, I use fairly "transient" catalogs with Lightroom since all the photo files (both RAW shots, XMP sidecars, and JPG images) are being stored up on the server. But in doing that, I miss out on many features of having everything in a catalog.

All in all, I'm very happy with the WHS experience thus far. If you can live without the option to remotely edit files (to avoid the corruption problem), I'd recommend it.

Technorati Tags: , , , , ,
posted on Saturday, February 23, 2008 11:40 PM Mountain Standard Time  #    Comments [0]
# Wednesday, January 16, 2008

msdn_masthead_ltr I'm seriously contemplating a Windows Home Server solution and am pretty much at a fork in the road. On the one side is the HP Media Smart Server (which includes hardware and the OS), while the other side is the option to buy an inexpensive machine (perhaps via Dell Outlet) and then buy the OS separately.

No decision yet, but the cost difference is negligible... so it boils down to "Do I want something that works out of the box, or is this something I'd enjoy setting up as a project of my own?" Who knows... I'm also considering just going with a more basic NAS style solution.

There are many things to like about Windows Home Server, but one feature that intrigues me is that it has an SDK for writing add-ins (via .NET). I can think of a few add-in projects that would be fun to build.

Unfortunately, the MSDN Subscriptions blog announced today that WHS will not be available to subscribers. They don't comment on why they opted not to make it available... but it's a disappointing decision regardless.

First of all, I should point out that I'm wearing two hats here... The first is as a consumer who will likely be purchasing a WHS license for use in my home (unless I go the pure-NAS route). Because MSDN makes licenses available for development purposes only, I'd be buying a WHS license either way (separately or with the HP server). The second hat is as a developer with an MSDN Subscription who appreciates that the subscription gives me access to the licenses I need to build solutions on Microsoft's platform.

I've seen arguments in MSDN forums that "home" products aren't available via MSDN Subscription. However, I can have a Vista Home or Home Premium install up and running in a couple hours or so using media and/or downloads from MSDN. So there are "home" products on MSDN.

Another argument might be that that it's not technically aimed at developers... sure, but neither is Office, Exchange, or Project -- and each of those is available because developers can build tools that supplement and enrich those products. Home Server doesn't seem any different in this regard with its much publicized add-in model.

Clearly, Microsoft's success over the years is based on the popularity of its platform with 3rd-party developers. Without a rich ecosystem of 3rd party applications and tools, particularly in the business world, would Windows have become the dominant desktop OS? With many agreeing that is the first product aimed at a potentially huge and largely untapped market (small, wireless home networks), why treat Home Server differently in this regard?

In some ways, Home Server is a solution to a problem that many of its target customers don't know they have -- lots of people have small networks at home but no idea that they should be looking into automated backups, remote access to their files, and shared storage for their growing libraries of music, photos, and other data. It's certainly possible that a 3rd-party add-in to Home Server could become the "killer app" that convinces people that it's a "must have" solution.

But if developers on the Microsoft platform don't have access to WHS in the same place they get their other development, testing, and deployment tools, why would they bother?

I must be missing something... what's the downside to Microsoft including Home Server in MSDN?

Technorati Tags: , , ,
posted on Wednesday, January 16, 2008 11:43 PM Mountain Standard Time  #    Comments [0]

Whats It Worth? Eric Sink has a blog post about his experience in trying to get pricing information out of a vendor whose products he was looking into. Their prices weren't listed on the web site (strike 1), so he had to fill out a web form to request a price. The response he got back was a request for his phone number so that a salesperson could call him (strike 2). Specifically, they wanted to talk about his application and how he planned to use their product (strike 3).

I've run into this several times with development tools and components and it typically tells me one key thing about the vendor involved... you want to jack up the price based on my ability to pay. More succinctly, you want to find out my "price sensitivity" which is just a fancy way of saying, "What it's worth to you?"

That tells me the vendor isn't sure what their product is worth in the market. And that they don't think my time is worth much either (not to be an ass, but I'd like to avoid 30-minute phone calls when the topic could be covered in a 3-sentence email). Finally, it says that you (the vendor) want to dictate to me (the customer) the nature of our relationship.

"How I plan to use your product?" -- What if I'm a rich, whacked out philanthropist who buys software component licenses, reads the Quick-Start Guides to my kids at night, and wants to use your install media as the basis for my Chinese throwing star? What's the price then?

My experience with this is typically in dealing with the vendors that make UI components and other development tools. Doesn't matter if you're talking about Java, .NET, or anything else. One vendor I dealt with recently didn't have any pricing on their web site. Instead, you have to contact a salesperson via email and request a price. The response back was along the lines of this (paraphrased, but not by much):

Before I can give you a price, I really need to find out more about your product and your company. We like to look at ourselves as not just a tools vendor, but also as a partner in your business. Knowing more about the pricing of your products and services will help us craft a relationship that benefits you and ensures that you get the most out of our product.

Pretty amazing, huh? In truth, the conversation was more about him asking me questions than me asking him about licensing their product. He wanted to know how many licenses to our products are sold each year. How many end-users does that represent? What's the pricing of our product? What do our sales forecasts look like?

It's probably worth noting here that the vendor I'm referring to makes exactly one development tool -- a UI component for .NET. And I tried to explain it as simply as I could -- "Look, we already license UI tools from companies X, Y, and Z. I can go to their web site and immediately see how much I have to pay per-developer for their tools, and what the deployment licensing is for those tools (royalty-free distribution, named users, etc)."

But trying to get that information from this vendor was nearly impossible. In the end, I ended up on the phone with the president of their North American business, playing a game of 20-Questions. All so he can make an educated guess at how much I might be willing to pay for the use of his product.

By the way, when I finally got a proposed price (after multiple emails and a long phone call), it was about 8-10x what we were willing to pay to license the component. So much for the analysis of our price sensitivity... We went another direction.

Now, I don't even bother. If I go to a site and can't find any sort of pricing information, I move on.

posted on Wednesday, January 16, 2008 3:24 PM Mountain Standard Time  #    Comments [0]
# Wednesday, October 10, 2007

Sara Ford (from the Visual Studio team) has been running an awesome series of daily tips for Visual Studio tweaking. The series started off as the "Visual Studio 2008 Tip of the Day," but many (most?) of her tips apply to VS.NET 2005 as well. Most of the tips explain tweaks that can be made via the Tools->Options dialog.

11pt text and 14pt members! Her tip for today is about increasing the font size in the Statement Completion window... which is the little panel that opens when you invoke Intellisense in the VS.NET code editor (either by hitting "." on a reference to get its members or via CTRL+SPACE or CTRL+J -- another recent tip).

The change is made via the "Show settings for" list in the "Fonts and Colors" portion of the Options dialog. While I'd been in there before to set my Output and Command window preferences (green on black, yo), I'd never noticed Statement Completion (and probably wouldn't have recognized it as the Intellisense members list in any case).

Very slick and I can see this making it a lot easier to find things in the list... it really makes it stand out in front of the code that's being edited.

Nice tip, Sara! Now I need to go back into that portion of Tools->Options and check out some of the other UI elements that can be tweaked in that "Show settings for" list...

posted on Wednesday, October 10, 2007 10:45 PM Mountain Daylight Time  #    Comments [1]
# Saturday, July 28, 2007

recycle A chain of blog posts came through my reader this week that discussed the value, or lack thereof, in "code reuse" for most development teams. First, some background...

It looks like the original article was "Internal Code Reuse Considered Dangerous" by Dennis Forbes (great blog, btw). That article was then referenced by Carl G Lewis (cysquatch), who largely agrees with the sentiment in his "Is Your Code Worthless" post. Finally, Scott Reynolds referenced Carl's blog post in a follow-up the other day, wherein Scott suggests that "Code Reuse Is Not the Villain".

Still with me? Good.

As I worked my way back in time (Dennis' original post is from 2005), it occurred to me that this line of trackbacks is a bit like the "telephone game" that we played as kids. As each person responded to the previous person, the meaning of the story changed in subtle (but important) ways.

In deciphering this, I hope it goes without saying that "code reuse" as a practice is a worthwhile goal to keep in mind. It's not always achievable, nor even desirable, but certainly it's something that good developers keep in mind as they work.

That said, Dennis begins by arguing against the management notion that code reuse saves money by "codifying the abilities of the team" -- thereby making the team easier to replace or downsize. Ouch.

Code in the library is considered an asset, and managers and owners like the idea that, while developing product A, as a side effect they're accumulating this great repository of generalized code which they'll be able to use for a completely different product - let's call it product B. Soon the domain knowledge of their developers won't matter (and thus they'll be expendable), because everything is encapsulated in common code: They've codified the abilities of their team.

I'm not sure how any worthwhile manager could get from Point A (the practice of "accumulating [a] great repository") to that particular Point B (where the "domain knowledge of their developers won't matter"). And in fact, Dennis' rebuttal to this point is that the opposite happens -- the more you grow internal frameworks and libraries, the more you depend on your developers. New developers, regardless of previous experience, have a substantial learning curve in front of them with any of your internal code.

And in that, I completely agree. Where I got lost in Dennis' argument was in the next portion where he appears to argue that code has no value beyond the developers writing it and the project they're writing it for. [emphasis mine]

The question every organization needs to ask itself, then, is what value they could sell their "reusable code" for - what, realistically, would competitors and new entrants in the field offer for it? The answer, in almost every case, is $0, and they wouldn't want it even at that price. There is extraordinarily little code theft in this industry (even though we're in the era of burnable DVDs and USB keys) because most code - above and beyond the industry-wide frameworks and libraries - has no value at all outside of a specific project with a specific group of developers. Trying to use it for other projects is often worse than starting with nothing at all.

This is the part that loses me completely, for two reasons:

  1. It assumes that the value of reusable code is measured by what an external entity would pay for it. I'd argue that it should be measured by its value to the company that owns it. Not just in that it saves time for the team that wrote it... but that it reduces bugs by ensuring that a bug fixed in one location is fixed for all locations. A user interface metaphor or workflow used in one place is used in multiple places. Blah, blah, blah, the usual examples... Reusing code in the correct way increases the value of a product in the eyes of customers and prospects and this has very direct value for the company's bottom line.
  2. That argument also ignores technology acquisitions. The value of Visio's code when Microsoft bought Shapeware was something (much) greater than $0. It's not as if Microsoft needed the customer base or the market share. Similarly when Google purchased Writely or when Yahoo bought del.icio.us. In each case, the acquisition was a technology purchase -- the acquirer was infinitely larger than the company being bought and wasn't already in competition with them. The purchase wasn't just for the customer list.

I actually think Dennis' point is best made in a bullet point later in the post. And the point is that code reuse merely for the purpose of code reuse is a waste of time and money. [original emphasis]

Internal code reuse for niche industries and domain specific problems can be very valuable, but code for generalized, industry-wide problems are seldom valuable unless you're truly developing it for industry-wide consumption (e.g. the .NET Framework is tremendously valuable code reuse). I have seen too many examples of large internal libraries that are largely duplications of vastly superior functionality existing in the .NET Framework or C++ Standard Template Library, or which could be better served by available professional or open source libraries. If your problem isn't domain or niche specific, but rather is industry wide, it is extremely likely that either a library encompassing it exists, or that it isn't a problem that is worthwhile generalizing

And here's where I'd agree... I, too, have seen many examples where companies simply reinvent the wheel in the name of "reuse". Hey, if it's ours then we can change it, fix it, and reuse it -- right? It's really a buy-versus-build debate. If your team is writing things like data access layers, UI controls, or validation tools in the name of "reuse", then you may as well go out to your parking lot and just light some cash on fire. At least it'd be quicker and you'll get the momentary heat and entertainment.

The above quote is what Carl's response (from last month) is based on... and while the post's title ("Is Your Code Worthless?") is plenty controversial, his purpose was really more to tell a story -- and a funny one at that. It's the story of a client company who felt that their internal code was so proprietary and so valuable that they couldn't possibly let a contractor look at it offsite. Instead, they had Carl travel 8000km to work on it at their location -- only to discover that the code was a complete disaster. What a great line...

I sat down and fired up Vim to start looking at their code and was INSTANTANEOUSLY BLINDED by the reeking bile that was pouring across my monitor.

Hilarious.

Lastly, it's worthwhile, I think, to differentiate between the development of internal business applications and developing commercial products. If you're building internal applications (e.g., payroll, HR, accounting types of systems), then managing reuse across multiple applications is probably not as important. There's still value in reuse for you, but your company doesn't lose customers if the display grid in Application A is different from the display grid in Application B. The tolerance for error is higher. With commercial products, though, it's a different story. It would be silly for the Word, Excel, and Powerpoint teams to all go create their own base UI libraries or text-formatting behavior. And the consequences of a mistake are greater and more easily measured.

I guess the point is to not get carried away with a "reuse is worthless" meme and suggest turning away from it altogether. In 16 years, I've worked on several product lines that made extensive use of shared/common libraries, to great effect and to great value for the company. Bottom line - the key is to pay attention to where building your own libraries for reuse makes sense and where you should simply reuse existing, proven libraries.

In either case, recycle the good stuff... future generations thank you. ;)

posted on Saturday, July 28, 2007 10:24 PM Mountain Daylight Time  #    Comments [0]
# Monday, July 23, 2007

Every developer, or at least those who really love what they do, has a few side projects to work on. They're the palate-cleansers you turn to when you want to sink your coding teeth into a different problem for a while... they're your sorbet projects. 

itunesexportsolution Well, one of the side projects I've worked on this year has been iTunesExport - a .NET app that can export playlists from your iTunes library. It exports them in a variety of formats (M3U, EXT, WPL), can copy tracks to a new location, and has both GUI and command-line interfaces. I got involved earlier this year when I wanted to export playlists in a file format that it didn't yet support. I contacted Eric Daugherty, who owns and hosts the project's site, and jumped in to add the additional export type. Since then, I've added additional features and tweaks and it's been a pretty fun project to work on.

Yesterday, productivity blog LifeHacker did (another) post on it with some examples for using it. It was a cool surprise as LifeHacker is one of the feeds I subscribe to, so I came across their post randomly in my feed reading.

I added a comment to that post, but since it was my first comment to LifeHacker my registration is sitting in an approval queue somewhere and the comment's not yet visible. The other comments on that post had a number of questions about iTunesExport and I wanted to answer those and/or clarify what the tool does.

First, iTunesExport does NOT modify your tracks in any way, shape, or form. It won't convert to or from any file format and it won't strip DRM from purchased tracks. The only time it does anything with actual song bits is when you choose to copy tracks to a new location for your exported playlist(s)... and in that case, it's just doing a straight, bit-for-bit file copy.

Second, the purpose of iTunesExport is simply to let you export playlists OUT of iTunes and into a file format that can be read by another player (WinAmp, Windows Media Player, etc). In my case, I use it to make my iTunes Smart Playlists available through the Tivo Home Media interface on our television. With this in mind, we're very careful to NOT modify the iTunes library XML file. We're simply reading the playlists/songs out of it and then writing another file in the format you want. So the exporter doesn't do anything to play count, last played, or any other data in the iTunes library.

Finally, Eric and I are always interested in hearing suggestions and feedback for the app. Some of the recent changes/fixes, especially around internationalization and Unicode,  have come via testing and feedback from others.  Those are always the things that are most fun to work on because you know someone can use it right away. So while I've got a few ideas for things I'd like to add (including saving/restoring your settings, improved documentation, and some better reporting/feedback on what was exported), we'd love to hear other ideas for things the tool might do... so please send those along via the project's site or through SourceForge.

posted on Monday, July 23, 2007 12:41 AM Mountain Daylight Time  #    Comments [0]
# Sunday, July 22, 2007

I'm not much into the Harry Potter phenomenon, but I am in the middle of trying to learn WPF (Windows Presentation Foundation). I'm currently tackling WPF via Adam Nathan's "WPF Unleashed" book and plan to read the Petzold WPF book next (followed, perhaps, by the Sells/Griffiths book). WPF is conceptually very different from Winforms or other UI technologies that I've used, which makes the learning curve steeper than would be normal for "just another platform update". Anyway, you may be wondering what Harry Potter has to do with WPF...

blackfamilytree Well, a month or two ago, the folks at Vertigo Software released a WPF reference sample application called Family.Show. The application is a genealogy tool that let's you manage a family tree, along with information and photos about the people in the tree. It's since been updated with more features and it's simply a great-looking application. If, like me, you're trying to learn WPF then the coolest part of Family.Show is that they've made the source available for download. Sweet.

Earlier today, Liam Molloy (of Vertigo) published a post about a family tree he created for the "Black family" from the Harry Potter series. Using Wikipedia, Liam was able to piece together a fairly large family tree for Sirius Black, including photos (of the actors/actresses from the films) and the background stories for many of the characters.

You can download Liam's data files for this family tree, load them up on your machine, and go to town with the info-browsing. Note Liam's warning at the bottom of his post -- while he made an effort to remove any spoilers for the just-released book, he says it's possible that there's still one or two in there. Not having read any of the books, I wouldn't know either way... I just think this was a very cool thing to do from a data visualization perspective.

So... whether you're into WPF or Harry Potter (or both?), you've got a reason to go check it out.

(Side Note: The only drawback I've found with the app Vertigo built for Microsoft is that the background whitepaper for it was published in the XPS file format... and even though I've got Office 2007 installed, I still had to download a separate "essentials pack" to view it. What's wrong with a simple PDF?)

posted on Sunday, July 22, 2007 10:55 PM Mountain Daylight Time  #    Comments [0]
# Thursday, July 19, 2007

The last DasBlog release under ASP.NET 1.1 went out a couple of weeks ago, so I decided to give that a run. It all seemed to go well when running it locally, which was a good sign... and seems to be the standard for the last few updates I've done. Once I have it running locally, it's just a few config changes to get it going on the server. This one was just slightly different because there were some script files moved around and I initially had it running under ASP.NET 2 on my local machine. In any case, the site's using it now and no hassles.

I've been lurking on the DasBlog developer mailing list for a couple months now and there's a good deal of activity. Currently, the project's dev team is working on the initial ASP.NET 2.0 release, including support for Medium Trust. As I mentioned previously, there's also a theme contest going which should yield some cool new looks for folks to use.

I keep meaning to check out some of the "open source template" sites out there, but then I get sidetracked with other things... with this update, I'm settling for a few new navigation links and an updated blogroll.

Technorati tags: , ,
posted on Thursday, July 19, 2007 11:06 PM Mountain Daylight Time  #    Comments [0]
# Wednesday, July 11, 2007

usestairwell Christopher Hawkins has a post from last Friday wherein he describes his "dream" software projects. The funny thing is that he refers to them as "silly", but they seem like pretty real and useful projects to me. The film production system, in particular, sounds like a fun project to work on.

While I wouldn't say that mine are quite "dream" projects, there are a couple of systems I've always thought would be a lot of fun to work on.

Poker Machines for Casinos -- Partially because I enjoy playing some poker myself and partly because I think there would be some interesting problems to solve. There have been a number of products announced that bring the "automated" world of online poker into casinos, bars, or other hangouts.

Note that this is NOT video poker of the "Jacks or better" variety. In some cases, the game is still "regular" poker, but everyone around the table plays the hand via a touchscreen and there's no dealer. In other cases, it might be a small table where two people can play heads-up while they wait for a seat at a regular table or while hanging out at a bar and watching a game. There are enough differences between these "electronic tables" and regular online poker software to make it pretty interesting.

Elevator Control Systems (for high-rises) -- This is the one that usually gets a laugh when I tell people about it. But if you imagine a tall building with multiple tenant types (retail, offices, or residential apartments, etc), then there are some intriguing things to consider. How do you optimize the flow and availability of a car at any given time? If an car's at rest, do you send it to a certain floor to wait for a call? During the morning, you have one type of flow (from the ground floors up to the offices) and in the late afternoon it's the opposite. What about lunch hours? How do you handle things like redundancy or failover if a car has to be taken out of service for repair? What can you provide facilities and security with in the way of monitoring and management?

Both of these seem interesting to me as intellectual projects... but I think what intrigues me is that they both offer a lot of opportunity for data visualization and some infoporn. In both cases, you can imagine administrative/monitoring interfaces that provide all sorts of interesting views of data (historic poker hands) and state (elevator state).

I'm interested in reading what sort of "dream" projects others write about.

  Technorati: , , ,
posted on Wednesday, July 11, 2007 11:07 PM Mountain Daylight Time  #    Comments [0]
# Sunday, July 08, 2007

Ben Scheirman is running a themes design contest to get some new looks in the themes list for DasBlog. To encourage designers to submit their original designs, he and Scott Hanselman are putting up a $100 gift certificate for Amazon.com.

While I "know what I like" when it comes to design, I've got virtually no talent for creating a web theme from scratch... This could be a good opportunity for someone with talent, though, and a hundred bucks at Amazon.com? As I've said since we signed for Amazon Prime, "If I can't get it at Amazon using Prime, it's probably not worth buying..."

Speaking of DasBlog, the last ASP.NET 1.1 update went up a couple weeks ago. I'm running it on my local machine and it seems to be fine... so I'll update the server soon. On the other hand, an ASP.NET 2.0 version that supports Medium Trust is in the works. Maybe it's worth waiting... either way, I'm stoked to see all the renewed activity on the dev mailing list (where I've just lurked for a few months now).

  Technorati: , , ,
posted on Sunday, July 08, 2007 10:50 PM Mountain Daylight Time  #    Comments [0]
# Sunday, April 29, 2007

This post from Phil Haack points to Charles Petzold's concern that "prose is dead" in technical books. The concern was based on Jeff Atwood's comparison of two different WPF development books. Wow, how's that for name dropping? Three names in two sentences. I ought to point out that I have a great deal of respect for Charles, Jeff, and Phil and all three write blogs that are in my must-read list.

As shown in Jeff's comparison, one book (Petzold's) has large blocks of uninterrupted text and appears to be entirely monochrome, while the other book (by Adam Nathan) has smaller blocks of text and makes liberal use of color and visuals.

I agree with Phil's commentary about "visual learning," and his pointer to the excellent "Head First" books is spot-on, but I actually think there's an even more important thing to consider here. That's the subject matter... in this case, the topic of both books is the new Windows Presentation Foundation API that's a part of the .NET 3.0 release. I find Petzold's statements that "Powerpoint has won" and the "battle for the future of written communication is over" to be a bit unfair. It implies that readers are looking for visuals alone or that well-written communication is no longer important.

Anyone who has seen a WPF sample application knows that this is not the same ol' Win32 GUI toolset. In the hands of a talented designer, it's shiny. It's pretty. It glows. It makes you want to look at it... is it unreasonable to prefer a book that conveys the same feeling?

It's also worth noting that the bar for information presentation has been raised over the past few years. As computer users become more familiar with different types of data visualization, and as flashy UIs like Vista's Aero take hold, expectations for UI are higher. Even in a typical "line of business" application, it may not be enough any more to use the same old Windows UI toolkit. You could certainly argue that it's possible to build an efficient, intuitive, and fast application using the same Windows UI tools we've used for nearly 15 years. No question. But few applications compete only in their specific market or product area. Most are competing for attention with other applications on the user's machine. Or with a massive web designed, in many cases, by some very talented designers. If you want customers to enjoy using your application, as opposed to feeling like it's drudgery, spending some time (and money) on its appearance and visualization is critical.

Now replace "using your application" with "reading your book". 

I've not read either book yet (though I plan to do so shortly, thanks to the O'Reilly Safari Library subscription -- highly recommended), but I don't think it's unreasonable that Jeff (or anyone else) prefers the book that has more visuals. A book whose purpose is to introduce a "Presentation" framework probably ought to have the presentation of its content made a higher priority than would a book discussing some "under the hood" technology (say, the Windows Communication Foundation, or WCF). In a book that covers UI controls, gradients, and different layout options, I'd probably like to see... UI controls, gradients, and different layout options.

That's NOT to say that the communication of ideas and information aren't the highest priority. No amount of visual flash will makes up for poorly-written, poorly-edited, or poorly-communicated content (and that's the true evil of Powerpoint). And few are as well-regarded as Petzold when it comes to communicating difficult technical content in a way that's easy to understand and put into practice. An entire generation of Windows programmers, including myself, was "raised" on his Programming Windows titles. I'm certain that I'll find his book well-written and that it'll provide useful information on WPF.

But it's not hard to see why some would prefer a book that presents a presentation framework in a presentable way... is it?

posted on Sunday, April 29, 2007 10:47 PM Mountain Daylight Time  #    Comments [0]
# Tuesday, January 23, 2007

I've got an open position on my team for an experienced ASP.NET/C# developer in Boulder, Colorado... if you've got experience building production-quality, commercial web applications, get in touch with us. Even better if you share our interest in data visualization and analysis. So on the off chance someone sees this in an aggregated feed or via Technorati, here's the ad:
--------------------------

Title: Software Engineer
Business Unit: Global Energy Intelligence
Reports To: Vice President, Engineering
Location: Boulder, CO

Global Energy Intelligence, a leading provider of energy information solutions, is seeking an experienced Software Engineer to join our commercial development team and be a part of our aggressive growth.

The ideal candidate:

  • is a C#/.NET developer with proven experience building production, commercial-quality applications.
  • is comfortable with advanced SQL syntax and SQL Server.
  • has a thorough understanding of OOA/OOD concepts.
  • is flexible and open to new ideas or change.
  • has some passion and drive to excel in their career.
  • has strong development experience building dynamic, data-driven ASP.NET web applications (though Winforms experience is a plus).
  • is self-directed, organized, and extremely attentive to details.
  • recognizes the value in agile, iterative development processes.
  • communicates well with technical and non-technical peers alike.

Global Energy Intelligence is made up of experienced professionals whose sole focus is making a positive impact in the energy intelligence and information solutions industry. We pride ourselves on getting the job done for our customers and using the latest technology to do it. We strive to build software in a way that's delivered quickly, highly-reusable, and low-maintenance. We have a generous benefits package, including company-subsidized medical/dental coverage, flexible spending accounts, and a 401k plan. We also offer a casual work environment and a flexible paid-time-off structure.

 

If you're an experienced developer looking for new challenges and the above qualifications align with your skills, we want to hear from you. If you know the difference between a 'programmer' and a 'software developer', we want to hear from you. If you're in the top 20% of your current team and you're tired of carrying the other 80%, we want to hear from you. If you learn new things, build new software, write quality code, and constantly refactor for improvement, all because you HAVE to -- because you can't NOT spend time on those things -- then we want to hear from you.

 

We're building an all-star team. Lazy, uninspired, dead-weight developers need not apply.

 

This is a full-time employment position. Local candidates are preferred. No relocation is provided. No contractors. No agencies. No recruiters. No phone calls. No lightweights. No exceptions.

 

To apply for this position, please send your resume via email to jobs@globalenergy.com with "Boulder SW Engineer" in the subject.

 

Technorati tags: , , ,
posted on Tuesday, January 23, 2007 8:08 AM Mountain Standard Time  #    Comments [0]
# Wednesday, November 22, 2006

As I mentioned over the weekend, I've transitioned over to Office 2007 and am mostly pretty happy with it. I like the Outlook To-Do Bar more and more each day.

However, I ran into a problem yesterday that I couldn't find any resolution for online and I figured it'd be worth archiving here so the Google tubes can find it later.

Basically, I opened up VS.NET 2003 yesterday and got errors from two of my add-ins. These were CodeRush (the DXCore, to be specific) and the VSWindowManager PowerToy. Both of the error messages indicated that there was a FileNotFoundException being thrown while they tried to add items to the Visual Studio menus. Only the CodeRush exception told me which file was missing and it simply said 'Office'.

Now, I had used VS.NET 2003 last Friday (our desktop product is in 1.1 for now, but our newer web product is in 2.0) and it worked fine. The file name in the exception reminded me of pretty much the only thing that had changed on the machine since then -- the Office 2007 install.

I thought it was odd that VS.NET, which doesn't require Office to be installed, would be freaked out by an Office upgrade. In any case, I fired up the VS.NET 2003 installer and chose the Repair option. It's worth noting here that the Visual Studio 2003 installer is quite possibly the slowest-running install in the history of computing. Go get lunch while it runs... when you're back, grab a book, take a walk, or paint your house. Choosing the Repair option in the installer doesn't appear to be any faster than a first-time install.

Once that was done, I reinstalled CodeRush/Refactor and the VS Window Manager just to be safe... and all is well. Since then, I heard back from the DevExpress support folks (who rock) that they've seen this issue before. The problem occurs when the Office.dll and Extensibility.dll files are removed from the machine's Global Assembly Cache (GAC). Those files are needed by Visual Studio add-ins that want to hook into the IDE.

My best guess is that the uninstall of Office 2003 removes those files from the GAC (though they may still be around somewhere else on the machine) and they're not re-registered by the Office 2007 installer. The Office 2007 install does give you the option to uninstall 2003, or you can leave it there... and I did opt to have it uninstall.

Hopefully, anyone who suddenly finds that their VS.NET 2003 install isn't loading add-ins will Google for "Visual Studio 2003 add-ins loading exceptions Office" and come across this post at some point.

posted on Wednesday, November 22, 2006 11:25 AM Mountain Standard Time  #    Comments [1]
# Sunday, October 01, 2006

I just finished upgrading to the latest release of DasBlog and all seems well. The upgrade process itself could hardly be smoother. There were just a few steps involved...

  1. Downloaded the Content, SiteConfig, and Logs folders and placed them into the local web directories.
  2. Ran the DasBlog Updater utility to cleanup the Content folder.
  3. Ran a diff on the new and old config files... moved the stuff I cared about.
  4. Pushed the new web directories up to the server.

Done in under a half hour. It went very smooth and my hats off to Scott, Omar, and the rest of the DasBlog team.

So then I went cruising around to check out some of the new stuff Scott mentioned in his release announcement. One of the things I really like is the ability to disable comments on a post older than a specified number of days. I don't get many comments and most of what does come in is comment-spam on older posts. Hopefully that setting improves things.

There are also a few more themes available than in previous versions. One of these, called Project84Grass, was designed by Jacob Hodges. I liked the general style, but opted to darken it up a bit and add my own header image. It was the first time I've gone into the DasBlog template mechanism and it was much easier than I expected. Swapped out a few images, changed up the stylesheet, and modified a manifest -- and DasBlog picked it up on refresh.

Thanks!

posted on Sunday, October 01, 2006 11:35 PM Mountain Daylight Time  #    Comments [0]
# Sunday, July 23, 2006

One of things we spent a good deal of time on Friday in the Tufte seminar was his concept of “Sparklines”. Tufte describes them as “Intense, Simple, Word-Sized Graphics”. The idea is that a small (very small) chart of information can be provided in-line with text and serve to illustrate the data behind the text. In the space consumed by just a few words, hundreds (even thousands, with sufficient resolution) of data points can be used to form a chart.

In explaining Sparklines in Beautiful Evidence, Tufte uses several examples. One of these is medical reports that typically provide a test name and then the result value as a number. What this loses, however, is the context for the measurement — is this result high or low relative to the patient’s history? Relative to the normal range?

SparklinesThe image at right shows several examples. First is the typical display for a glucose test’s result (128). The second is a sparkline example that shows the patient’s results over time. In this context, it’s clear that the result of 128 is low relative to many of the patient’s previous results. The third example places a red dot at the point of 128 (the most recent result) and then displays the result value text in red, instantly drawing a correlation between the point on the chart and the value at that point. The bottom example combines a light gray band representing the normal range. The result is a graphic that quickly provides context and history for a test result, using much less space than the text “relatively low for this patient and within normal range” would require.

So can we use Sparklines in applications? First, we certainly are allowed to use this concept. Tufte himself referred to it as an “open-source idea to be freely used”. Next, the question is, how do we use this in our applications?

In searching around for software implementations of Sparklines, I found several. There are implementations for PHP, Java, Ruby, Python, MS Office, and others. Note that the Python implementation, written by Joe Gregorio, is provided online as a “Sparkline Generator Web Application”. It’s a slick interface that lets you fill out a form to set some properties and values, and then provides the URL that would return the resulting Sparkline.

I also found a .NET implementation from Eric Bachtal. He implemented it last year as an HTTPHandler for ASP.NET applications. The results look great on a web page and the code is provided with a license to freely use, copy, modify, and so on. 

For me, I’d like the ability to use this in a couple other ways. First, I’d like a general object API that lets me set some properties (style, colors, size, etc), provide the data, and then get an Image type in return. From there, I’d like to see a control that can be used in a Winforms application — either directly on a form or within a data grid, with the ability to resize and adjust like any other UI control. While the license indicates that it’s fine, I plan to contact Eric to see if he minds me using his work to get a leg up on that effort. I’ll report back here when/if I make progress.

Definitely check out the various examples and libraries above. Each appears to be free for personal use and all but one makes the source available in some form. The MS Office product from Nicolas Bissantz requires purchasing a license for commercial use and no source is provided, but it’s also the most friendly to non-developers and several Sparklines-inspired products are available (including a cool ticker).

posted on Sunday, July 23, 2006 9:22 PM Mountain Daylight Time  #    Comments [1]
# Tuesday, June 27, 2006

A couple years ago, Ted Neward compared the state of ORM tools and technologies in computer science to the Vietnam conflict. It was distasteful then, but I suppose it had the intended effect of most provacative statements – it got attention.

Given the distastefulness of the analogy, I’d hoped it would go away but Ted has now decided to update it and give a history lesson of the Vietnam conflict along the way.

Turns out that elucidation doesn’t change anything… it’s still distasteful.

Exactly how many lives have been lost and/or forever altered by Object/Relational Mapping?

posted on Tuesday, June 27, 2006 11:40 AM Mountain Daylight Time  #    Comments [0]
# Thursday, April 06, 2006

The New York Times had an article yesterday entitled “Software Out There,” which discussed the whole “programmable web” movement that’s sprung up over the last couple of years. The author says that the internet is entering its “Lego” era.

It was actually a semi-interesting article, but I wish I could read an article in a major paper just once without cringing at the leaps of faith and hyperbole made by the author. Is it so hard to get an expert to look over an article before publication? The key example from this NYT article is this section (mid-way through Page 2):

Mr. Ozzie, who used the Firefox browser (an open-source rival to Internet Explorer) during his demonstration, said, "I'm pretty pumped up with the potential for R.S.S. to be the DNA for wiring the Web."

He was referring to Really Simple Syndication, an increasingly popular, free standard used for Internet publishing. Mr. Ozzie's statement was remarkable for a chief technical officer whose company has just spent years and hundreds of millions of dollars investing in a proprietary alternative referred to as .Net.

At what point did .NET become a “proprietary alternative” to RSS or any other “standard for internet publishing”? Or vice versa?

But hey, why pass up the opportunity to put out something that seems semi-scandalous (“Imagine, a CTO for Microsoft using Firefox! Suggesting RSS as an alternative to .NET!”).

posted on Thursday, April 06, 2006 8:02 AM Mountain Daylight Time  #    Comments [0]
# Sunday, February 19, 2006
I just came across this in the .NET blog world… looks like a CodeCamp is being planned for the Denver area. I’ll have to keep an eye on the site and hope that the scheduling works out for me.
posted on Sunday, February 19, 2006 10:47 PM Mountain Standard Time  #    Comments [0]
# Sunday, November 27, 2005

So the conversion from .Text .09x to DasBlog seems to be complete. First, I started with the most recent version available on the SourceForge project site (currently 1.8.5223.2).  The conversion of posts mostly went just fine. To create the DasBlog content files, I used the RSStoDasBlog.zip project from Scott Hanselman’s site. After downloading the old site’s feed as XML, this utility went through and created all the dayentry.xml files that DasBlog needs. The trickier parts were in the details:

  • I switched over to using FeedBurner to handle the aggregator feeds. It’s free, provides some good stats, and was an easy switch to make. DasBlog’s configuration allows you to specify a FeedBurner URL and will automatically serve that up whenever a request is made for the site’s feed. This was super-easy. You can subscribe to the feed with feed://feeds.feedburner.com/JeffDonnici Subscribe!.
  • I created a new file at http://jeff.donnici.com/Rss.aspx, which was .Text’s old feed URL. The new file, simply provides an HTTP 301 redirect to the new Feedburner feed. This will ensure that any feed aggregator’s subscribed to the old .Text feed get updated to the new feed. This was also very easy.
  • Then it became a manual thing… the conversion process doesn’t do anything with post categories. I actually like DasBlog’s handling of categories in that you can easily create them on the fly (as opposed to having to go to a separate Categories management page in the admin site). Unfortunately, the only way I saw around this was to go through old posts manually and apply the appropriate categories. I’m sure there’s a way to do this en masse, but it’s a one-time thing and writing up a script or utility to do it would have taken longer than the manual route.
  • The next manual part involved going through any old posts that referenced other posts. In cases where I had a post that referred to an older one, I updated the URL for that reference to use the new DasBlog permalink. I also updated the few posts that had images or downloadable files on my server… under DasBlog, I wanted to use its content/binary folder so that backups of all content are a single-step. Here again, I’m sure there’s a better way to do it, but it didn’t take long and is a one-time thing.
  • That brings me to external links… Google, other blogs, and various wikis have links to the old .Text archives, which are now gone. I’m not sure what (if anything) that can be done to handle those… short of some sort of hard-coded 404 error page that has all the old URLs and their new URL and then handles the redirection. I know Google will update over time, but it’d be great if there was a clean way to handle the redirection automatically. I’ll probably slap together a custom 404 page so that visitors don’t get a generic IE/ASP.NET error page, but it’d be cool to have them just move on to the new address. Any ideas on that?
  • I updated BlogJet with the new DasBlog settings… it has a built-in profile for DasBlog, so this was actually pretty easy. If you do this, don’t let the default profile’s use of /blogger.aspx throw you off — it works fine under the hood. I haven’t looked at the source, but it seems DasBlog’s HTTP handler catches that URL request and handles the web service calls automatically. I was pleased with BlogJet in the .Text days and it handled converting to the new system without a hitch. Very slick.
  • DasBlog has a CAPTCHA system for discouraging blog spammers, as well as a “Blacklist” feature. I haven’t found any docs on how to use that Blacklist feature (looks like it used to be automated, but there were some problems with that), but hopefully a quick forum post will clear it up. I’m also surprised not to see an option to moderate comments.

I’m sure I’ll be tweaking settings over time as I learn my way around, but so far it seems good. I really like what I’ve seen so far of the DasBlog internals and it fits my needs great. Adding my own theme is the next step and hopefully the CAPTCHA system for comments will keep the spammers at bay.

posted on Sunday, November 27, 2005 7:00 PM Mountain Standard Time  #    Comments [1]

I finally settled on dasBlog for the new blog engine and this will be my last post using the older .Text. I spent time with both dasBlog and Community Server, but in the end dasBlog won out. Some of my thoughts on the decision were:

  • dasBlog is much easier to get up and running quickly.
  • Getting Community Server running for a basic, one-person site seemed more of a hassle than it needs to be… rather than having it be an option during the install, you have to go through a bunch of config files and modify the HTTP handlers to redirect requests to the single-person blog. For someone who just wants to have a basic personal site and not spend a bunch of time doing web development and/or site administration, it just seemed too arduous.
  • I liked that Community Server included photo galleries, but there are lots of other options for this, including NGallery (on which the CS Galleries are built). Plus, it didn’t seem clear to me that the galleries and the blog could appear to be different sites (e.g. each on a different subdomain).
  • dasBlog seemed to have much better performance (both were tested on the same machine). While I didn’t dig into the code to see why this was, my assumption is that CS just has a lot more plumbing underneath it.
  • Surprisingly, I found converting existing .Text posts to dasBlog to be easier and more straightforward than converting them to Community Server. The nice thing about dasBlog is that its native storage is XML files, so re-recreating the archive is pretty easy.

So now I’ve got it up and running on my local machine and need to start the process of going to the server. So far, it looks like this involves:

  • Getting it up on a temporary subdomain so I can make sure I set remote permissions correctly.
  • Transferring all current posts.
  • Changing dasBlog to use a FeedBurner feed instead of its local feed. Also make sure that the old .Text feed URL is redirected with 301 to the FeedBurner feed.
  • Archive the old site.
  • Move the new site to the old site’s subdomain.
  • The only other thing remaining that I see will be to find a way to correctly redirect URLs for old posts to their new URLs under dasBlog. Not sure how to do that yet, or even if it can be done in a straightforward way (e.g. without hand-redirecting each URL). I’m open to suggestions on this one.
  • Figure out dasBlog’s themes and templates so I can do something original (though the canned themes are actually pretty nice).

So… here goes.

posted on Sunday, November 27, 2005 5:11 AM Mountain Standard Time  #    Comments [0]
# Saturday, November 26, 2005

I got around to installing the latest CodeRush and Refactor Pro this morning and was pleasantly surprised… the install recognizes that I had both VS.NET 2003 and VS.NET 2005 installed and offers to register the add-ins with both IDEs. I was expecting to need two installs, each specific to a different version of the IDE (seems most control libraries are going this route right now).

Even cooler was that the settings and preferences I set in 2005 were used for the 2003 install as well. Given the ton of options CR and R! make available, it was nice not to have to wade through all the preferences twice! Well done, DevExpress!

 

posted on Saturday, November 26, 2005 8:15 AM Mountain Standard Time  #    Comments [0]
# Saturday, November 19, 2005

As mentioned a couple of weeks ago, it's time to make a change to the blog. It’s running on an older .Text build, but starting to show some age… mostly in being able to prevent comment spam.

Part of the reason I want to blog regularly (and am still trying to “make it a habit”) is for the comment feedback. Many of the entries I’ve made have lead to people contacting me directly to respond or give feedback and advice. It’s great to get that feedback, but not if I have to delete a bunch of spam links each day.

So now I have to decide if I want to go with Community Server or DasBlog. Community Server has the advantage of including a photo gallery and seeming to be more flexible. I also like that it stores all content and settings in SQL Server. On the other hand, DasBlog seems to be faster to get up and running and has some cool features of its own. That simplicity extends to its storage mechansim, which is XML files for content and .config for settings and security.

I’ve read up on both, but it’s time to get hands on. I’m gonna just get both up and running locally, convert my existing .Text entries, and see what I think of each. I’m happy to hear from anyone who’s made the switch from .Text to either CS or DasBlog. Since I’ve turned off comments, you can just use the Contact page.

posted on Saturday, November 19, 2005 3:02 PM Mountain Standard Time  #    Comments [0]
# Thursday, October 27, 2005

Looks like the RTM bits for Visual Studio 2005 and SQL Server 2005 (Dev Edition) are up on MSDN now… time to fire up the downloaders.

We’ve got a number of MSDN Universal subscriptions and its now going to be “decision” time. In some cases, the Developer edition of Team System is fine… in others, Architect make sense. For still others, Test could be useful. I’m inclined to go the “Suite” route so we don’t have to decide at all, but it’s not clear yet to me what that’ll run us and what the process for making that upgrade looks like. We shall see.

But we’ve got a new ASP.NET project starting up so, in the meantime, we can run that version in “Trial Mode”… I’m not sure how it’s limited other than expiring at some point (180 days, I think) and the MSDN download page doesn’t seem to indicate what other constraints there may be.

As long as this new version runs painlessly side by side with VS 2003 for our existing stuff, it should be pretty easy to get this transition started.

posted on Thursday, October 27, 2005 5:35 AM Mountain Daylight Time  #    Comments [0]
# Wednesday, October 12, 2005

Jeff Atwood put together a VS.NET macro that spills out all your VS.NET keyboard shortcuts as an HTML document. Very slick and the rendered “key caps” are a nice touch.

I put a shortcut to the doc it produced on my Firefox toolbar… combined with Firefox’s “Find As You Type” feature, it’s a very fast way to look up that one keyboard shortcut you can never seem to remember (Run To Cursor for me). Jeff also has a great (older) post on the whole “speed == keyboard” view that many developers (myself included) share.

The more shortcuts, the better!

posted on Wednesday, October 12, 2005 2:27 PM Mountain Daylight Time  #    Comments [0]
# Sunday, February 27, 2005

Don Box is getting the itch to write another book. Some of his previous books are considered must-haves for their subjects. He’s not sure which type of book he wants to write next, but is soliciting opinions on his blog.

My vote would be “B” without the COM pieces. Given that we’re just now learning more about Indigo, and that there’s a lot of “what is it and why do I need it” type of curiosity around it, the timing would seem to be perfect for a definitive Indigo text. And who better to write it?

COM’s not dead, but neither is it on an upward trend.

posted on Sunday, February 27, 2005 9:40 AM Mountain Standard Time  #    Comments [0]
# Sunday, January 09, 2005

Glad to hear that all is well with Justin Rogers. He hadn’t blogged or been in touch with anyone since mid-November, so Darren Neimke tracked him down. Justin’s been one of the more prolific bloggers that I read regularly and is the only .NET blogger whose name is a folder of its own in my Firefox bookmarks (too hard to categorize his articles!).

Anyway, I’m glad that all’s well and I hope Justin will be blogging again soon.

posted on Sunday, January 09, 2005 10:45 AM Mountain Standard Time  #    Comments [0]
# Tuesday, October 19, 2004

With last week's announcement that Edit and Continue would be supported for C# in VS 2005, there was an initial cry of 'hallelujah' from many developer blogs. I've opted not to link to any for fear of having someone feel singled out, but in my aggregator this past weekend, I must have browsed past a couple dozen posts about how great this announcement was.

Now that a few days have passed, reality sets in and a few different voices have stepped up to suggest that E&C isn't a silver bullet for developers. It's interesting to watch the reactions play out in the blog posts, which usually go like this:

.NET VoR (Voice of Reason): Edit and Continue makes it to easy to screw things up and get sloppy with your development. You should be taking a reasoned approach to your debugging, use unit tests to confirm your approach, and not fix bugs based on a specific condition that exists at that particular runtime.

.NET E&CE (Edit & Continue Evangelist): Just because it's possible to screw up with E&C doesn't mean it should be pulled out! Would you also suggest that [insert analogy of tool mis-use here]?!

I guess what I find interesting about it is that the E&C evangelist types seem to think it's an all or nothing proposition. Unless I've missed it, none of the people arguing against E&C are suggesting that it should completely be removed from the product. Rather, they're suggesting that it should be used with great care because of the ability to fix bugs with small, one-off fixes in code instead of shutting down the debugger and fully thinking through the problem.

I recall Juval Lowy talking about this on .NET Rocks at some point last year (probably around the PDC when it was announced for VB.NET). His comment was along the lines of E&C being somewhat incompatible with the "C# personality". That personality, which often comes to C# via C++ or Java and tends to be component-focused, is different than the VB.NET personality, which comes from a more RAD place and tends to be more app-focused. As he put it, when the C# personality is faced with a bug, (paraphrasing) "they lean back in their chair, stare at the ceiling, go get some coffee, ponder a solution, and THEN they lean forward to hit F10 and move to the next line." :) For those people, E&C isn't as attractive as other features that focus more on code quality, profiling, performance, and so on.

Sure, it's great that you can fix things like a typo in a string literal or some other no-brainer quick fix. But bugs that involve an application's logic or workflow aren't the type of thing that should be fixed while sitting on a breakpoint at runtime.

It's also worth noting that the inclusion of E&C is a good example of Microsoft's newfound community awareness and desire to work closely with its developer customers. No question -- it shows responsiveness.

I guess the two thoughts that come to mind for me in all of this are:

  • E&C can be handy in some scenarios -- but it's not a panacea, it can be easily misused, and I think few would argue that its use is a "best practice" for professional developers. My hope is that the .NET developer community comes up with some collective guidelines or general agreement on where/how it makes sense to use or avoid E&C.
  • I also hope that many of the other things that are being worked on for the 2005 release aren't scaled back because of the work on E&C. Even Microsoft has limited resources and time when it comes to development. Sam Gentile's post about refactorings being missing is a good point -- let's hope that the inclusion of E&C doesn't come at the expense of refactorings or other features that do promote best practices.

 

posted on Tuesday, October 19, 2004 5:11 AM Mountain Daylight Time  #    Comments [0]
# Saturday, October 09, 2004
The MSDN Webcasts team is coming out with another big series of webcasts, this time focused on ASP.NET. My current gig is pretty much Winforms (with some web-services work), but we've got more ASP.NET coming down the pipe. The timing of this webcast series is great! Hopefully it's of the same high quality we've been seeing with the Winforms series.
posted on Saturday, October 09, 2004 12:58 PM Mountain Daylight Time  #    Comments [0]
Jeff Key, the guy who gave the world SnippetCompiler, just put up a cool looking NCover analysis tool. I've just started toying with NCover within the last few days and this looks like a slick way to make sense of the results. He also has a ton of other .NET related tools and sample code. Thanks, Jeff!
posted on Saturday, October 09, 2004 11:17 AM Mountain Daylight Time  #    Comments [0]
# Monday, October 04, 2004

Eric Sink's blog has a new entry discussing the planned features for Vault 3.0. There are a few things on this list that I really like:

  • Email notifications
  • Improvements to DiffMerge
  • Integration with their "new bug-tracking product, Dragnet".

... I like how he slipped that last one in the list. Given how happy we've been with Vault at work, I'd love to get some details on "Dragnet". Nothing of substance has been mentioned in their support forums, so I guess we wait.

We're currently using the open-source BugTracker.NET, which isn't bad... but having true source-control/issue-tracking integration would rock.

posted on Monday, October 04, 2004 11:43 AM Mountain Daylight Time  #    Comments [0]

Search away! After doing a bunch of searching on CodeProject, I decided to see if there was a search plugin for Firefox that worked on that site. I couldn't find it, so I figured "how hard can it be?" and created my own. I'm not completely certain that it's as great as it could be, but for a first effort it seems to be working just fine.

To use it, download this file and then place the codeproject.* files into your "searchplugins" directory (under the Firefox program directory). Once you do, you should have "CodeProject" listed in your search engines, along with the little CodeProject mascot.

I'll submit it to the Mozilla project before long, but figured it can't hurt to get it out there and get some feedback. On this page, they mention that their turnaround time for making these available is sometimes a few weeks.

You can edit the .src file in a text editor to change the options used by CodeProject when you search. Let me know if you find any improvements or problems... enjoy!

posted on Monday, October 04, 2004 6:13 AM Mountain Daylight Time  #    Comments [0]
# Sunday, October 03, 2004

Darrell Norton posted this snippet for Firefox on his blog and it works like a champ. MSDN pages that list code used to look like this in Firefox:

Oh yea... useful.

After adding the snippet below to userContent.css, it looks like this:

Ah, much better.

Here's the snippet to add to userContent.css. As Darrell mentions, using ChromeEdit is by far the best way to customize the Firefox customization files. Even finding them can be a trick at first...

/* Microsoft MSDN code stylesheet */
pre
{
   white-space: pre !important;
}

Sweet tip... thanks, Darrell!

posted on Sunday, October 03, 2004 12:03 PM Mountain Daylight Time  #    Comments [0]
# Wednesday, September 22, 2004

Rob Howard's company, Telligent Systems, is looking for a professional services automation solution.

Scratch one vendor from the list.

Darwin in the business world... the response from the vendor is condescending, spelling/grammar errors, and vehemently anti-Microsoft. The latter point may not be a big deal by itself, but you'd think a Director of Sales would look up a prospect's web site... and maybe look at the "About" page. The first sentence:

Telligent is a solutions company with unique expertise and knowledge of the Microsoft Platform.

 

 

 

Update: Looks like Rob has since removed the post containing the email he got from the vendor.
posted on Wednesday, September 22, 2004 4:10 AM Mountain Daylight Time  #    Comments [0]
# Sunday, September 19, 2004

I've listened in on parts of the new Windows Forms series of webcasts, called "Soup to Nuts". They're well presented and the whole webcast deliver They've been fairly basic so far, but the sessions are organized to get more advanced as the series progresses. It seems that the .NET world was initially so focused on ASP.NET and web services, while good Winforms resources were relatively scarce. That's definitely changed, but a strong tutorial series like this is a welcome addition to the resource pool.

As an aside, the whole "webcast" experience has really improved over the last year or two. With the current MSFT webcasts, the streaming seems very stable and it's becoming less of a one-way experience -- you can respond to questions/polls from the presenter, submit questions for the presenter, send requests to speed up/slow down, and so on. Pretty cool.

posted on Sunday, September 19, 2004 3:42 PM Mountain Daylight Time  #    Comments [0]
# Tuesday, September 07, 2004

I've decided that Justin Rogers is a .NET rock star. His blog posts are math-intensive, but he gets the fact that not all developers interested in math and physics are already proficient at a PhD level. He explains things so well and demonstrates the points with code. Highlights for me were the first "physics installment" (covering collisions) and first "math installment" (on image layouts)... but the poker series is what first got me turned on to his blog.

I had originally started bookmarking the poker entries under a .NET->Poker folder... but when the math/physics started coming, I just renamed the Poker folder to "Justin Rogers" - making him the first blogger to qualify as a category of his own in my bookmarks.

Thanks, Justin, for the time you spend on those articles.

posted on Tuesday, September 07, 2004 9:08 AM Mountain Daylight Time  #    Comments [0]
# Saturday, August 28, 2004

So Microsoft announced yesterday that some pieces associated with Longhorn (Indigo and Avalon) would be made available to Windows XP prior to Longhorn shipping. Also that WinFS would show up after the initial release of Longhorn.

Within 24 hours, the Channel 9 crew get Jim Allchin to sit down for a video interview. Ok, so it shouldn't be rocket science to get a Microsoft exec to sit for Channel 9... but the thing that I appreciate is that you wouldn't have seen this a year or two ago. There'd have been the announcement, a few spokesperson quotes in the trade press, and then a whole lot of speculation and whining. I much prefer the new transparency.

As for developer reaction on the delay itself... I don't see cause for concern. Had anyone in their right mind been working on any sort of production system that relied on Longhorn? I'd question that judgment. I think getting Indigo for WinXP (which has been planned and announced) will be great. Ditto for Avalon. But as nice as all that is, it's a ways off... and if you're delivering any sort of meaningful application any time soon, and you're a Microsoft shop, you're working with .NET 1.1. Even if you we knew exactly when these new subsystems would ship, it's worth being cautious before jumping in with both feet on a major new system.

I do think that knowing about this stuff sooner rather than later is a big plus, though I'm sure it means heartburn and tough questions for the evangelist types.

posted on Saturday, August 28, 2004 9:59 AM Mountain Daylight Time  #    Comments [0]
# Sunday, August 22, 2004

Finally catching up with the last couple of DotNetRocks shows and I just listened to last week's DotNetNuke show. I definitely need to check this out. In a past life, I looked at PHPNuke but found it to be (at the time) a bit convoluted to customize or build modules for. It sounds like Shaun (Walker, DotNetNuke's architect and chief developer... sorry, Shaun, I couldn't find a blog!) took a very flexible approach with it and getting a modular, skinnable site up and running quickly could be useful for some internal projects.

Plus, most of my .NET work thus far has been in the Winforms world, so just going through the project code could be a good education all by itself.

Now to find the time...

 

posted on Sunday, August 22, 2004 4:59 PM Mountain Daylight Time  #    Comments [0]
# Sunday, August 15, 2004

In my opinion, there are a couple of things that combine in the current .NET Framework to form a void (wait, can two things combine to form a void)? Those two things are the strong preference for .config files over registry storage (a preference I agree with), and the lack of API support for writing config files.

The ConfigurationSettings class is great for reading your app.config or web.config file... but that file is specific to an application and not to a user. So while it's useful for storing things that are typically app-wide (database connection details, logging levels, etc), it's pretty much useless for storing user preferences. These usually include things like remembering a user's window size/positions, preferred file locations, or other user-specific settings.

There are lots of articles and samples online that suggest options for getting around these limitations. My opinion is that most of them fall just short of being complete solutions, though, and the reasons tend to be along these lines:

They don't allow for strongly-typed access to the preferences. To be really useful, reading and writing preferences should be idiot-level simple for the developer. If the dev has to write several lines of code to cast preference values to/from a string for storage, they're gonna skip it. The result is an app that's less flexible for the user than it could be. Another benefit of strongly typing the preferences API is that Intellisense helps the dev access the settings without having to remember key names.

They use INI files or the registry. Since the release of .NET 1.0, MS has steered developers away from using the registry. The registry is generally recognized to be a system that's prone to corruption and using this approach makes XCopy deployment a real pain. INI files are a fairly simple way to go, but they don't allow for a nested hierarchy and you end up dealing with a lot of parsing code. You also can't easily define metadata about each setting. .NET gives us a fairly rich set of APIs for XML, so why not use them?

They provide write-access to app.config. There are some articles that provide a wrapper for the app.config so that the developer can read and write to the file. There are a couple of problems with this -- first is that it's an app-wide file so all the user profiles on a shared machine will have the same settings. Second, app.config is in the application's startup directory, which is usually under \Program Files\. Standard user accounts under Windows don't have the ability to modify program files, so this option only works for Admin or Power User accounts. A better solution is to store preference files under a user's profile (\Document and Settings\[user]\Application Data\) -- even better is IsolatedStorage.

They use lots of files. Many articles and samples use XML serialization as a way to read/write preferences. It works well, but the suggestion is often to have a base Settings class and then many component-specific subclasses. Each component manages its own settings class, reading and writing as needed and then calling inherited members to serialize and deserialize the object. Maybe this isn't much of a problem, but for some reason it seems less elegant to me. The apps I work on tend to be large, modular Winforms apps -- lots of individual components, in which case I'd end up with a lots of files on the user's machine. Also in this scenario, components actually have to be aware of two types of settings -- their own settings and the app-wide settings that the user specifies. It gets worse if you have components that want to share some types of settings.

So do I have a solution for all this? Not yet. But I am reading as many articles and samples as I can find, making lots of notes, and trying to form a clear picture of what I think would be the "mother of all settings APIs". Admittedly, this would be with a bias toward Winforms apps. So far, there are two recent articles that are along the lines of what I'm thinking. These are Building a Better Configuration Settings Class (by Rick Strahl) and Manage Users Settings in Your .NET App with Custom Preferences API (Ray Djajadinata in July's MSDN Mag). Both of them offer good, complete coverage of the issues associated with a settings API.

At work last year, I built a fairly basic XML-based API that stores user preferences but it does suffer from a couple of the problems above -- most notable is that it's not strongly-typed. So... my current plan is to spend some off-hours going through the two articles above, continue to make note of the various ideas that are brewing, and then coming up with a new design that incorporates the pieces and parts that I think are important.

So with all that... am I missing any other key needs from a preferences API?

posted on Sunday, August 15, 2004 8:09 AM Mountain Daylight Time  #    Comments [0]
# Saturday, July 31, 2004

Last week's .NET Rocks show with Jeff Richter was a great one. I always find it interesting to hear about the types of things that went (and are still going) into the design/implementation of the CLR. During the show, Jeff mentioned a couple of tips for helping the garbage collector be more efficient.

Keep object lifetimes as short as possible. I think this is essentially the same advice that's usually given for dealing with unmanaged resources (file streams, database connections, etc) -- get it late, release it early. It also tells me that I need to do some more reading up on WHY this is the case in the GC. My assumption is that it has to do with objects getting promoted through various levels of the GC and how often it runs through to free up memory. Definitely need to get a good book on the CLR guts. Suggestions?

Keep the call stack as short as possible. Again, I'm not sure why this is and plan to read up on it in more detail. But it does seem at odds with the common design/implementation goals of loose coupling and short methods. Usually, you want lots of small, cohesive objects that work together to form a larger component. Within those objects, you want relatively short methods that can use one another to perform an operation (do one thing, do it well, and do only that). The side effect of that approach is that the call stack gets fairly deep in short order. It may be that 95% of me experience in .NET  has been in the Winforms world -- wherein applications typically (and as was mentioned on the show) are going to have deeper call stacks than ASP.NET applications.

Anyway, interesting stuff... now off to find some good under-the-hood GC resources.

posted on Saturday, July 31, 2004 4:47 AM Mountain Daylight Time  #    Comments [0]
# Wednesday, June 02, 2004
This little utility lets you paste a code snippet into an editor and it generates the HTML to display that code in roughly the same way as VS.NET. Don't like the default styles? Well, the download includes source! (Note: LGPL license)
posted on Wednesday, June 02, 2004 4:20 PM Mountain Daylight Time  #    Comments [0]
# Friday, May 28, 2004

Whoa, I nearly missed this... Mike Schinkel, who runs Xtras.NET is offering a free XDN membership to .NET bloggers during this month! He posted the offer on his personal blog, so get on over there if you're blogging about .NET development.

While you're there, check out Xtras.NET -- I just found out about it through Mike Gunderloy's site. Holy smokes, there's a lot of info there. They carry a ton of .NET components and tools, with lots of information about each -- and the prices look very competitive as well. The thing I really like, though, is the user-reviews. That's the toughest thing about buying components -- you can read all the marketing stuff, even try the evals for a few days... but nothing beats hearing about it from someone who's worked with a tool for months, day in and day out.

And a printed catalog? Sign me up!

posted on Friday, May 28, 2004 10:21 AM Mountain Daylight Time  #    Comments [0]

Scott Hanselman has been posting recently about his love for CodeRush. I couldn't agree more.

For nearly a year, I'd been using a combination of Visual Assist and C# Refactory. Both are useful, though sometimes rough around the edges tools, and I loved the productivity they added. An evening spent customizing VA's code expansions paid big dividends.

Then CodeRush shipped and I figured I'd give it a go. It came as a part of the DevExpress .NET subscription, so it was there for the installing. I installed the initial release build, played with it for an evening, and then uninstalled it. It was feature-rich, had a million settings in its Options dialog, and would clearly take some time to get productive with.

But I kept an eye out and read the CR group in the DevExpress newsgroups. About 6 weeks or so ago, I decided to give it another shot, based on all the excitement I was reading in the newsgroups. I figured I'd force myself to use it for a week, during which I'd shut down VA and C# Refactory, and then make a decision. At first I was slowed down and had to check the built-in User's Guide regularly. By the end of the week, though, it was clear I wasn't going back.

While many tools provide templates/code expansion, I've yet to find one that does all that CR does. For starters, it's templates are context aware. They behave differently depending on what you're doing, what's selected, etc. The 'r' key for example, has these expansions:

  • In an empty method, hit 'r' and space and you get return;
  • In a method/accessor that contains code, it looks at local variables, finds one that matches the type to be returned, and provides that:  return localVar;
  • If I select a number of lines of code and hit 'r', it's completely different -- the selected code gets #region/#endregion tags and the cursor is in place to name the new region. This doesn't fall into the "templates" category, but gives you an idea of how context-aware CR is.

Now imagine that for most keys and key-combinations on the keyboard.

Beyond templates, there are things like visualization tools -- each return statement has an arrow that you can hover over and it animates an arrow to the end of the code block you'll return from. Ditto for all other flow-control statements -- throw, break, continue, and so on. Regions get painted with lines that run the width of the editor to make it easy to see the blocks. And it's all very polished looking.

As you type, CR provides suggestions via "Intellassist", meaning you only type variable/member names once and it gets suggested as you type later on. Think "in-line Intellisense".

Then there's "Smart Paste" when you paste something into the editor, CR looks at what it's pasting and can paste something else altogether (all regex driven). While I haven't dug too deeply into this yet, it's clearly a powerful capability. The one I have used is with this scenario: Create a private field in your code (private int _someValue;) and copy it to the clipboard. Move down a line and paste it. You get:

public int SomeValue
{
    get { return _someValue
; }
    set { _someValue = value
; }
}

(note: I've customized this layout slightly from the default)

There's a configurable QuickNavigation window you get with CTRL+. -- you tell it what to show (based on members, types, and access/scope), how widely to look (solution, project, namespace, file, etc), and then start typing characters -- as you type, the matching symbols are displayed. You can use the arrows to select candidates (or keep typing) and ENTER takes you to the selected symbol. Very fast.

Smart Brackets/Parens auto-closes opening brackets and parens for you. If you're inside parens, it can optionally ignore additional closing parens... it has a "smart" semi-colon feature that recognizes that you're inside the parens and puts the semi-colon on the right of the closing paren. Even works with embedded parens.

Markers are VS.NET Bookmarks on steroids. Drop them wherever you want and ESC will take you to them in the order you dropped them. As it jumps you to a marker, you get a cool "targeting" visualization that draws your eye right to the correct place. Most of the templates/expansions CR provides have markers embedded in them... as an example, the 'tc' expansion creates a try{} -catch{} blocks, puts your cursor at the correct place for the first line of 'try' code, and each block has a marker. Enter your 'try' code, hit ESC, and you jump right to the correct place in the catch block to provide that code.

Even further, it has a CRAZY-RICH plugin architecture that lets you dive in and create your own CodeRush plugins to do virtually whatever you want with code. I've not touched that at all (yet), but I'm hoping for some cool stuff down the road. I imagine we'll see lots of refactoring plugins before long.

Despite the goodness, there are a few things I wish for:

I don't care for the Help/Online Doc they provide -- the content itself is great, but the format doesn't work for me. It's basically a custom VS.NET tool window that provides a treeview for the contents (including search) and then the contents themselves in another pane. I think they did it because it lets them provide links from the doc right to the CR user interface, but I'd still prefer it built into the standard "MSDN Docs" library (which the DevExpress UI components actually do). I also wish there was a PDF of the user's guide so I could print it and flip through it without having the guide window taking up screen space.

The auto-complete/template stuff doesn't work quite the way Visual Assist did -- basically, VA looks at everything in the current context and provided an intellisense-like listbox that narrowed as you type. The CR approach is to provide an in-line suggestion that changes as subsequent characters rule out other suggestions -- the point being you only see one suggestion at a time.

Also, VA displayed tooltips near the cursor when something you typed matched the macro that would expand a code block. For example, if you type 'if' with VA running, you get a tooltip that shows an if{} block nearby. You can continue typing to ignore it or hit ENTER to have it expand and create the full block for you. With CR, I haven't found a way to have it tell me when I've typed a template shortcut, so I have to guess. I often typed 'pu' and + SPACE, expecting it to expand to 'public', and instead I get:

private uint _propertyName;
public uint PropertyName
{
  get
  }
    return _propertyName;
  }
  set
  {
    _propertyName = value;
  }
}

CTRL+Z/Undo takes care of this and then I remembered that it's 'pub' that creates 'public' (it's now habit). And in fairness, it's all totally configurable so you don't have to get an unexpected expansion more than once. Still, it'd be cool if there was an indicator somewhere that let you know what a template would expand to -- or maybe a mini-guide window somewhere that could serve as a quick reference. Currently, you have to go into the Options dialog and search the hierarchy of templates. Do-able, but it's an extra step.

These are all small nits and the configuration options let you get around most very easily... so the features and productivity gain FAR outweigh any downside. In fact, the only REAL downside here is the learning curve. You just have to spend time trying things in the Options dialog, going back to the editor to check it out, and so on. Spending time in the online doc helps a lot as well, though I did wish for a 1-2 page quick-start guide that provided the basic features or the most common template shortcuts. Force yourself to really use this for a day, though, and you'll see some gains... the cool thing is that you'll "discover" new features for a long time to come.

Anyway, they have an evaluation download so you don't need me to babble on any longer. Go get it and see what you think.

posted on Friday, May 28, 2004 10:10 AM Mountain Daylight Time  #    Comments [0]

Some cool new add-ins being bounced around the .NET world this week...

Alex Papadimoulis has a "SmartPaste" add-in that adds the ability to paste text from the clipboard as a region, a string, into comments, etc.

Gaston Milano added some new options to the context menu in VS.NET's file tabs.

Other stuff I've got running:

VSMouseBindings -- Surfing code with the trackbal's back/forward buttons. Solves the problem I posted about last week...

VS Window Manager -- Save/Restore your various window layouts. Especially useful if you go from dual displays to single displays with a laptop.

CodeRush -- It's been a couple of weeks now, but this one deserves its own post.

posted on Friday, May 28, 2004 9:09 AM Mountain Daylight Time  #    Comments [0]
# Saturday, May 22, 2004

So it looks like MSFT has decided not to include the ObjectSpaces O/R technology in Whidbey (just can't call it VS.NET 2005 yet). Note: at the time of this entry, it's also mentioned on the main MSFT Data site.

Does that suck? Maybe if you're the guy who was responsible for getting it done, but I don't see a reason to worry about it. In fact, I see a few reasons to feel pretty OK with it:

  • There are plenty of third-party tools out there that do this already. We've been using Olero's ORM.NET product and it's been great for us. There are even some open-source O/R tools that get pretty high marks.
  • Maybe by binding ObjectSpaces to WinFS, they're looking past just mapping a relational database to objects. Maybe they're looking at an O/S (Object/Storage) implementation that's not just hooked into SQL Server, but is also aware of the common entity types being talked about with WinFS (person, company, document, etc). Or maybe not. But given the dramatic changes to storage for Longhorn, there's no question that they have to be looking at a OO interfaces for that storage today.
  • Many of the people complaining now about the schedule slip would be similarly complaining if it DID ship with Whidbey and sucked. I'd rather have it late and stable than sooner and not production-ready.
posted on Saturday, May 22, 2004 8:27 AM Mountain Daylight Time  #    Comments [0]
# Friday, May 21, 2004

Gerrard Lindsay posted a request for browser-style navigation through code in VS.NET 2003. I tried to use the Comments functionality there, but it didn't want to work for me.

Anyway, I think we've got this now with the "Navigate Forward" and "Navigate Backward" options under the View menu. I'm not sure if it's the default mapping or not, but my machine has them assigned to CTRL+- (backward) and CTRL+SHIFT+- (forward).

Here's the thing that's bugging me... it seems like the back/forward buttons on my trackball no longer do the same thing. They used to, but I'm not sure if that was because an add-in provided it (I recently moved from Visual Assist to CodeRush which came with our DevExpress subscription). I haven't looked into it yet, but I should see if I can get those buttons working with VS.NET again.

posted on Friday, May 21, 2004 10:48 AM Mountain Daylight Time  #    Comments [0]
# Thursday, May 06, 2004

Why wait for Whidbey? Gaston Milano created an add-in that includes some useful IDE shortcuts.

http://weblogs.asp.net/gmilano/archive/2004/05/05/126491.aspx

posted on Thursday, May 06, 2004 5:32 AM Mountain Daylight Time  #    Comments [0]