July 2007 Blog Posts
Working at a VSIP partner has its privileges. I’ll be up in Redmond at the Microsoft Campus for a two day VSIP Partner Meeting on August 5th and August 6th. We’ll be looking at ways to make the Koders Visual Studio plugins provide a great and well integrated experience.
I’m flying into Seattle on that Sunday to spend time with some friends and do a bit of sightseeing (oh look, that’s what rain looks like!). Hopefully my schedule won’t be too full so I can butt my head in a few offices here and there to bother folks and stir up trouble.
This is more of a state of mind than a physical location as I’ll be making an appearance on DotNetRocks! I hope you enjoy it.
October 27th and 28th
I’ll be speaking on Writing Automated Unit Tests for your Website with WATIN at the Silicon Valley Code Camp. This’ll be my first time speaking at a Code Camp so wish me luck. I wanted to give two talks, but decided to take it easy for my first time.
I’ll be in attendance and on two panels at the DotNetNuke OpenForce conference. I’ve mentioned this one already in my blog. I’m pretty excited about this one.
First, let me start off with some praise. I really really like Windows Live Writer. I’ve praised it many times on my blog. However, there is one thing that really annoys me about WLW, it’s utter disregard for web standards and the fact that injects crap I don’t want or need into my content.
Of particular annoyance is the way that WLW adds attributes that are not XHTML compliant. For example, when you use the Insert Tags feature, it creates a div that looks something like:
style="padding-right: 0px; display: inline; padding-left: 0px;
padding-bottom: 0px; margin: 0px; padding-top: 0px">
What’s the problem? Let me explain.
- First of all, the ID is a GUID that starts with a number. Unfortunately XHTML doesn’t allow the id of an element to start with a number.
- The contenteditable attribute is not recognized in XHTML.
- The style tag is superfluous and unnecessary. At the very least, it should have been reduced to style="padding:0; display: inline;"
The purpose of the special class and the contenteditable attribute is to inform WLW that the html tag is editable. In the Web Layout view (F11), you can see a hashed box around the tags like so.
Clicking on the box changes the right menu to let you enter tags.
Because I actually care about web standards and being XHTML compliant and I’m totally anal, I’ve always gone in and manually changed the HTML after the fact.
Today, out of pure laziness and getting fed up with this extra work I have to do, I decided to write an HttpModule to do this repetitive task for me via a Request Filter. A Request Filter modifies the incoming request.
But to make things interesting, I made sure that the HttpModule makes the changes in an intelligent manner so that no information is lost. Rather than simply removing the cruft, I moved the cruft into the class attribute. Thus the HTML I showed above would be transformed into this:
<div class="wlWriterEditableSmartContent id-guid1:guid2
Notice that I simply removed the style tag because I don’t need it.
I also created a Response Filter to modify the outgoing response when the client is Windows Live Writer. That allows the module to convert the above html back into the format that WLW expects. In that manner, I don’t break any WLW functionality.
Other Cool Cleanups
Since I was already writing this module, I decided to make it clean up a few other annoyances.
- Replaces a single between two words with a space. So this is cool gets converted to this is cool.
- Replaces <p> </p> with an empty string.
- Replaces an apostophre within a word with a typoghraphical single quote. So you can’t say that becomes you can’t say that.
- Replaces atomicselection="true"with an empty string. I don’t re-insert this attribute back into the content yet, as I’m not sure if it is even necessary.
Try it out!
This module should work with any ASP.NET blog engine that uses the MetaWeblog API. It only responds to requests made by Windows Live Writer, so it shouldn’t interfere with anything else you may use to post to your blog.
To use it is as easy as dropping the assembly in the bin directory and modifying your web.config to add the following to the httpModules section:
<add type="HtmlScrubber.WLWCleanupModule, HtmlScrubber"
I’m also including the source code and unit tests, so feel free to give it a try. Please understand that this is something I hacked together in a day, so it may be a bit rough around the edges and I give no warranty. Having saidthat, I’m pretty confident it won’t screw up your HTML.
I have plans to add other features and cleanups in the future. For example, it wouldn’t be hard to add a configuration section that allows one to specify other regular expressions and replacement patterns to apply.
If you have any "cleanups" I should include, please let me know. If you’re reading this post, then you know the module worked.
[Download Binaries] [Download Source]
I thought about adding this to CodePlex, but I’m hoping that the next version of Windows Live Writer makes this module irrelevant. I’m not holding my breath on that one though.
A year ago on this day, I wrote a blog post about the demise of NDoc and issued a challenge for users of Open Source Software to contribute to their favorite projects.
So I offer the following challenge. First, ask yourself these two questions:
- How much money do I save because of Open Source Software?
- Considering how many people spend three bucks for a useless ring tone, is a single dollar too much to contribute to a useful Open Source project?
So let’s ban together and declare today, July 26, 2006, Contribute To Open Source Day.
In looking back at my original challenge, I now believe the emphasis I placed on monetary contribution to be slightly misguided. While I agree to that monetary contributions are helpful for infrastructure support costs (hosting websites, build servers etc...), there are many other means of contributing that are even more valuable, if you have the time. Money is just the easiest way to contribute.
Consider the following options...
- Contribute a bug fix
- Help verify bug reports
- Submit a unit test to help provide code coverage
- Write documentation
- Submit feature requests
- Help answer questions in the forums
- Tell the developers how much you appreciate the product
I think #8 is often lost in the shuffle. I’m quick to submit a bug report, but I forget to tell the developers of a fine product such as WinMerge how much I appreciate the product.
There are many projects that could use your help. For example, Andrew Stopford just announced a request for developers willing to help MbUnit out. What a great opportunity to work on some really cool code.
Subtext is always looking for contributors, especially now that my commit frequency is down due to my wonderful newborn son. We could use new blood to help pick up the slack until my son cuts his teeth (once he has them) on C# and ASP.NET (or perhaps IronRuby by then).
So again, please consider contributing to Open Source today in whatever way, shape, or form you see fit. This is not a plea to guilt you into it. Rather, consider this a friendly reminder for those of you who would do so anyways, but forget to due to busyness, like myself.
Microsoft just unveiled a new web property intended to clarify its position on Open Source as well as provide a one-stop location to find out what Microsoft is doing in the Open Source space.
Despite all the (perhaps well deserved) criticism of how Microsoft has not supported Open Source in the past, I think the behemoth is slowly starting to get it. Or at least groups within Microsoft are starting to see that if they don't embrace Open Source, Microsoft will get left behind, much like they did for a while with the web revolution. Embracing Open Source makes good long term business sense for Microsoft.
As a big company, Microsoft moves slowly, but there are concrete signs of progress.
- The Ms-PL License (Microsoft Permissive License)
- The introduction of CodePlex
- Port25, the Open Source Software Lab (ugly site, but chock full of info)
- Sam Ramji, whose official title is Director of Platform Technology Strategy but is for all intents and purposes, the Director of Open Source at Microsoft and heads the Open Source Lab there.
- Garret Serack who holds the title Open Source Community Lead at Microsoft.
- And various informal shows of support.
Sure, there is much more to do and I'm sure many will remain skeptical and wary of Microsoft's slow movement into this area. However, I see the signs of progress and believe there will be bigger things to come.
ELMAH, which stands for Error Logging Modules and Handlers for ASP.NET, is an open source project which makes it easy to log and view unhandled exceptions via its pluggable architecture.
Having been around a while, a lot has already been written on it so I won’t rehash all that information. For more details, you can read the following:
All you need to know for the purposes of this post is that ELMAH is implemented as two key components:
- An HTTP Module Used To Log Exceptions
- An HTTP Handler for viewing Exceptions
In the sample web.config file that is included with the ELMAH download, the HTTP handler is configured like so:
<add verb="POST,GET,HEAD" path="elmah.axd"
type="Elmah.ErrorLogPageFactory, Elmah" />
This allows you to view the error log from the URL http://your-site/elmah.axd. There’s one big problem with this...you do not want to deploy this to your production site.
This would allow any joker with a browser to view your exceptions and potentially gain information that would allow someone to hack your site.
Personally, I think that the sample web.config should have
elmah.axd be secured by default. It’s quite easy to do. Here’s what I did:
First, I changed the HttpHandler section to look like this:
<add verb="POST,GET,HEAD" path="/admin/elmah.axd"
type="Elmah.ErrorLogPageFactory, Elmah" />
Notice that all I did was add admin to the
I then added the following
location element to my
<!-- Deny unauthenticated users to see the elmah.axd -->
IMPORTANT: It’s important to note that I’m securing everything in the admin directory and that I’m making sure that elmah.axd is served from the root /admin URL. If the httpHandler “path” element was just “admin/elmah.axd” or “elmah.axd” I could inadverdently expose Elmah information.
Troy Hunt has a great write-up of the perils of getting ELMAH configuration wrong. In his post he shows a more robust way to secure elmah.axd. Put the httpHandlers section within the location section.
<add verb="POST,GET,HEAD" path="elmah.axd"
type="Elmah.ErrorLogPageFactory, Elmah" />
<allow roles="Admin" />
<deny users="*" />
<add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD"
To demonstrate this in action, I’ve created a solution containing a Web Application project with ELMAH and authentication fully implemented.
The point of this sample app is to demonstrate how to set this all up. So for example, the login page has a button to auto-log you in. In the real world, you’d probably use a real login form. You can also change the authentication from Forms authentication to Windows authentication depending on your needs. That might make sense in many scenarios.
The app demonstrates in principle how to setup and secure the elmah.axd page. If you have SQL Express installed, you should be able to compile and run the demo without any extra steps to see ELMAH in action.
[Download the demo]
A little while back Scott Watermasysk, preparing for the arrival of his first child, asked for advice on finding a really good compact digital camera.
Funny how having a kid turns a geek’s thought to getting that perfect camera to capture the moment. It was exactly what I did (but after Cody was born) when my wife and I purchased a Canon PowerShot SD850 IS Digital ELPH for Father’s day.
Yeah, that’s a bit of a mouthful for a camera name, but the two letters that were important to me were I and S which stands for Image Stabilization.
The SD850 combines that with a sensitivity range up to ISO 1600 for better photos in low light, a real problem area with my previous camera due to its suckiness and my incredibly shaky hands. Seriously, you don’t want me doing surgery on you.
The other key features I was looking for was small in size (3.6 x 1 x 2.2 inches) so I can get all secret agent with it and face detection, for better portraiture.
So far, I’m very happy with it. The pictures have been very sharp with good color. I should have known to stick with the ELPH series as my first ELPH took great photos despite only being 2.2 megapixel.
This one boasts 8 megapixels (really more than I need) and 4x optical zoom. That there on the right is a picture of my son in a Brasil jersey given to him by my wife’s Brazillian coworker. Doesn’t he look sharp?
Now you know why Brazil just beat the heavily favored Argentina in the Copa America. Cody Power!
One surefire way to sound really really smart is to invoke a law or principle named after some long dead guy (an alive guy is acceptable too, but lacks slightly in smart points).
This realization struck me the other day while I was reading a blog post that made a reference to Postel’s law. Immediately I knew the author of this post must be a highly intelligent card carrying member of MENSA. He was probably sporting some geeky XKCD t-shirt with a lame unix joke while writing the post.
Well friends, I admit I had to look that law up, and in the process realized I could sound just as scary smart as that guy if I just made reference to every eponymous (I’ll wait while you look that one up) “law” I could find.
And as a public service, I am going to help all of you appear smart by posting my findings here! Don’t let anyone ever say I don’t try to make my readers look good. If you look good, I look good.
Make sure to invoke one of these in your next blog post and sound scary smart just like me.
The law that inspired this post...
Be conservative in what you send, liberal in what you accept.
Jon Postel originally articulated this as a principle for making TCP implementations robust. This principle is also embodied by HTML which many attribute as a cause of its success and failure, depending on who you ask.
In today’s highly charged political environment, Postel’s law is a uniter.
Otherwise known as the law of bureaucracy, this law states that...
Work expands so as to fill the time available for its completion.
As contrasted to Haack’s Law which states that
Work expands so as to overflow the time available and spill on the floor leaving a very sticky mess.
Also known as the 80-20 rule, the Pareto Principle states...
For many phenomena, 80% of consequences stem from 20% of the causes.
This is the principle behind the painful truth that 80% of the bugs in the code arise from 20% of the code. Likewise, 80% of the work done in a company is performed by 20% of the staff. The problem is you don’t always have a clear idea of which 20%.
The revelation has nothing to do with seafood, as one might be mistaken to believe. Rather, it states that...
Ninety percent of everything is crud.
Sounds like Sturgeon is a conversation killer at parties. Is this a revelation because that number is so small?
The Peter Principle
One of the most depressing laws in this list, if you happen to have first-hand experience with this via working with incompetent managers.
In a hierarchy, every employee tends to rise to his level of incompetence.
Just read Dilbert (or watch The Office) to get some examples of this in action.
This one is great because it is so true. I knew this law and still this post still took longer than I expected.
A task always takes longer than you expect, even when you take into account Hofstadter’s Law.
By the way, you get extra bonus points among your Mensa friends for invoking a self-referential law like this one.
The one we all know and love.
If anything can go wrong, it will.
Speaking of which, wait one second while I backup my computer.
The developer’s response to this law should be defensive programming and the age old boy scout motto, Be Prepared.
Adding manpower to a late software project makes it later.
Named after Fred Brooks, aka, Mr. Mythical Man Month. My favorite corollary to this law is the following...
The bearing of a child takes nine months, no matter how many women are assigned.
Obviously, Brook was not a statistician.
Having nothing to do with country music, this law states...
Any piece of software reflects the organizational structure that produced it
Put another way...
If you have four groups working on a compiler, you’ll get a 4-pass compiler.
How many groups are involved in the software you are building?
This principle is named after a man who must be the only cryptographer ever to have five consecutive consonants in his last name.
In cryptography, a system should be secure even if everything about the system, except for a small piece of information — the key — is public knowledge.
And thus Kerchkhoff raises the banner in the fight against Security through Obscurity. This is the main principle underlying public key cryptography.
Named after Linus Torvalds, the creator of Linux, this law states...
Given enough eyeballs, all bugs are shallow.
Where you store the eyeballs is up to you.
The utility of large networks, particularly social networks, scales exponentially with the size of the network.
Keep repeating that to yourself as you continue to invite anyone and everyone to be your friend in FaceBook.
In network theory, the value of a system grows as approximately the square of the number of users of the system.
I wonder if Reed and Metcalfe hung out at the same pubs.
Probably the most famous law in computing, this law states...
The power of computers per unit cost doubles every 24 month.
The more popular and well known version of Moore’s law states...
The number of transistors on an integrated circuit will double in about 18 months.
And we’ve been racing to keep up ever since.
I was unable to find Paper’s Corollary, nor Scissor’s Lemma, so we’re left with only Rock’s law which states...
The cost of a semiconductor chip fabrication plant doubles every four years.
Buy yours now while prices are still low.
Software gets slower faster than hardware gets faster.
Ha! Take that Moore’s Law!
This law addresses software bloat and states...
Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.
I hear that the next version of calc.exe is going to include the ability to read email. A more modern formulation of this law should replace email with RSS.
This is a law related to usability which states...
Time = a + b log2 ( D / S + 1 )
Or in plain English,
The time to acquire a target is a function of the distance to and the size of the target.
A well known application of this law is placing the Start menu in the bottom left corner, thus making the target very large since the corner is constrained by the left and bottom edges of the screen.
Has nothing to do with people with bad mullets. I swear. Related to Fitt’s law, it states that...
The time to make a decision is a function of the possible choices he or she has.
Or in plain math,
Time = b log2(n + 1)
Seems to me this is also a function of the number of people making the decision, like when you and your coworkers are trying to figure out where to have lunch.
Have you ever wanted to take a look at the internals of the .NET Framework? Sure you can (and should) fire up Reflector and see the Base Class Libraries, but what about the fully commented source code? What about the parts implemented in C++?
A while back, Microsoft released the Shared Source Common Language Infrastructure (aka the SSCLI aka Rotor). This is a fully working implementation of the ECMA CLI standard and ECMA C# language specification. So it's not quite the entire framework, but it is still quite a bit of code.
Traditionally, to look at this code you would download the compressed archive and play around with it locally.
But if you want to just quickly browse the code, you can view all of its nearly three million lines of code on its project page on Koders.com.
Wouldn't it be fun to compare that development cost estimate with the real number? I doubt Microsoft is interested in disclosing that information.
To search within this project, you just need to set the search scope.
For example, here are the search results for DateTime and here is the page with the DateTime implementation complete with comments.
Other Great Projects to Look At
I mentioned a couple of great projects to look at over on the Koders blog, but here are some other great projects of interest to me now included in the Source Code Index.
- DotNetNuke - One of the largest open source projects on the .NET Framework.
- Subsonic - Some think this project should be called Sublime for how it brings fun back to ASP.NET development.
- Subtext - Of course I'm going to mention this!
- PSP Development Tools - Because we all want to write the next great game for the Play Station Portable.
When summer arrives, many like to create a new look via a haircut or new threads. I prefer to change the look of my blog with a new design.
This here design took all of four hours to complete.
Well that’s not exactly true.
It took all of four hours of my time to complete (give or take a few).
You can probably see where I’m going with this if you’re one of the many to have read The 4-Hour Workweek: Escape 9-5, Live Anywhere, and Join the New Rich recently. Wondering what all the buzz was about I decided to go ahead and purchase the book to see for myself.
What I expected was yet another time management book dispensing tired advice on how to get more done in less time. Instead, the focus of this book, written by Tim Ferriss is all about being more effective with your time by cutting out the cruft. Don’t do more in less time, do less (more effectively) in less time.
In many respects, Tim is savage about cutting out time wasters in your life such as email and reading the newspaper. He’s also a big fan of mini-retirements and outsourcing your personal life. This book is not about time management, it’s really about lifestyle management.
The outsourcing theme is one that particularly resonates with me. When I first graduated from college, I used to always take my clothes to a fluff and fold. Some friends told me I should do it myself since it would “build character”. So would milking cows to gather my own milk, but nobody faults me for picking up milk from Trader Joes. I figured I’d rather spend that time playing soccer, so I would drop off the dirty clothes before soccer and pick up the clean, dry, and folded clothes right after. It felt like a perfect trade.
Fast forward and upon reading this book it occurred to me that I spend a lot of time doing things I either don’t like to do, or things I like to do but suck at. For example, I spent a lot of time trying to redesign my blog to create a unique and polished look, only to come up short. I realized I should look around for a designer interested in getting his own name out there that might give me a discount for a design in exchange for the promotion. This would allow me to spend that time building a strength of mine rather than banging my head against a weakness.
So after browsing various blog design sites I happened to stumble upon Scott Carnett over in Abilene, TX. After pitching him the idea, he was on board and excited to work on the design. I only found out after we started that he’s a Java developer by day and design is a little side thing he’s into. I had it in my head that he was full-time freelancer.
Not that any of that matters. I am very pleased with the design he has created and recommend him highly if you’re looking for a bit of design work. He was extremely pleasant to work with and provided a quick turnaround. I have a few other ideas for the future that I may collaborate with him on.
A little while ago I pleaded with my readers to nominate Subtext for a SourceForge Community Choice Award.
The good news is that it worked! Subtext is one of the finalists for a Community Choice Award in two categories:
- Best Project for Communications: The best project for talking to your friends or sharing information. Other nominees include - Miranda, Pidgin, and FileZilla.
- Most Collaborative Project: The project most likely to accept your patches and value your input. Other nominees include - Azureus, XOOPS, and Zimbra.
That’s some heady competition we’re up against.
As far as I know, Subtext is one of only two .NET projects to be nominated overall, the other being a corporate sponsored application (not that there’s anything wrong with that).
Why Am I Politicking This?
So here’s the deal. Competitions like this are not about choosing the actual best project. There’s just no way that there are developers out there who have worked on every project in these categories and knows for a fact that Subtext communicates with its users better than FileZilla (we do).
I am fully aware that this is purely a popularity contest. Heck, I voted for 7-Zip in almost every category because of how useful I find it, not because I know for a fact that it has the Best Technical Design (it probably does).
As I just wrote, I think that despite the short rift that .NET gets in the broader Open Source Community, it is a great platform for Open Source development.
If you agree, please vote for Subtext and spread the word. I think it’d be neat to have a .NET project (especially one that starts with an "S") as a community choice winner. Voting ends on July 20th. Thanks!
I have a confession.
I am an Open Source developer and my platform of choice is the .NET framework by Microsoft. Not only that, I actually believe it is a good thing to support Open Source projects in the Microsoft ecosystem.
Yeah, really. In response to this tidbit, I have heard and am bracing to hear replies such as...
Why would you do that (support Open Source on Microsoft)?
It can’t be Open Source if it’s on the Microsoft platform.
One rationale given is that it ain’t really Open Source unless the entire stack is Open Source. I call this the all or nothing view of Open Source.
For example, one popular stack is the LAMP stack. That typically stands for Linux, Apache, MySql, and PHP, each of which are Open Source systems.
Interestingly enough though, the stack appears to end with the software layer. For example, proprietary hardware running the LAMP stack does not invalidate the Open Sourceness of the stack.
In contrast, I have the vacation view of Open Source. While I would love to be on vacation all the time, I’m pragmatic and I’ll take as much as I can get. Some vacation is better than no vacation.
Think About The Developers
Besides, why should PHP scripters have all the fun? There are legions of developers gainfully and productively employed writing software using .NET. Why shouldn’t they get to experience some of the benefits of using Open Source software?
So what if their stack is proprietary. Is it so wrong that these developers are more productive because of tools like Log4Net? Don’t they deserve a bit of Open Source spice in their lives?
But You Lose Out On Freedom!
There are as many flavors of Open Source as there are “developers!” in a Ballmer speech. But what they all share in common is some level of Freedom. In general, the freedom to view and change the code.
The only difference is really in the level of freedom and how that freedom should apply. I wrote before in my guide to Open Source Licensing that with some licenses such as the GPL, the freedom of access to the code is paramount. Any code that makes use of the GPL must itself be Open Source and licensed in a compatible fashion as the GPL.
Whereas with licenses such as the new BSD or MIT license, the freedom of the user of the code is paramount. There are pretty much no restrictions to using the code, even within proprietary systems.
Despite these philosophical differences, most reasonable people agree that they both constitute subsets of Open Source software.
I Have Freedom Where I Most Need It
The stack that I use with Subtext might be called WISC which consists of Windows, IIS, SQL Server, and C#. It sounds like a board game that Elmer Fudd might play on the weekends. Pretty much every layer of that stack is proprietary software. This is where the vacation view comes into play.
On this stack, I’ll never be able to view the Windows source and recompile it with a bug fix. But in truth, I’ll probably never have the need (nor capability) to do so. Often, the part I do need to change on a day to day basis is much higher up the stack. It’s the stuff that more directly applies to my business needs. It’s software like Lucene.NET that I’m more likely going to tweak and build a business on top of it.
This isn’t to say I wouldn’t mind being able to view the source for Windows, but it’s a balancing act. On the one hand, I like Open Source software. On the other hand, I like to feed my family by being productively employed and the Microsoft platform is great for being employed. Sure there are plenty of PHP and Ruby jobs, but I honestly really like writing C# code and the tools available to do so.
Only A Moron Thinks It’s An OxyMoron
In the end, I hold firmly to the belief that .NET is a viable platform for Open Source software. It might not meet everyone’s expectations for what Open Source is supposed to be, but it’s a good thing to many people and it is here to stay.
If you don’t believe me, just look at the list of projects mentioned in the comments to this CodingHorror post. You’ll see that Open Source in the Microsoft Ecosystem is more than just viable, it’s thriving and deserves to be recognized.
I received an email today informing me that I’ve been awarded the status of Microsoft MVP in the Visual Developer - ASP/ASP.NET category. I was aiming for an MVP for non-visual developers, but my 57 Lynx readers didn’t have enough clout to make that happen.
What does it mean to be a Microsoft MVP? I’m not really fully sure yet. You can read the official blurb about the program here.
In general I think it means I get to use the above logo on my blog and may start blogging about the problems with the MVP program and how the standards aren’t what they used to be now that they let the riff-raff in.
Remember kids. Riff-raff are the people they let into an organization after you’ve been admitted.
In all seriousness though, I appreciate the honor and want to thank Rob Conery for initially nominating me and K. Scott Allen for also nominating me later.