A pedant that hangs out in the dark corner-cases of the web.

Wednesday, December 19, 2007


So, when exporting or importing a list of feeds, why are we using OPML, when any feed reader already has an Atom and/or RSS parser? It seems like those formats would work as well for a list of links.

Wednesday, December 05, 2007

configSource: "It must refer to a file in the same directory or in a subdirectory as the configuration file."

Since the configSource attribute, to include .NET config file sections from external files, only allows relative paths and no parent paths, it severely limits the ability to centralize configuration settings for multiple config files.

Unless you use NTFS hard links or junction points, of course.

For example, if you have a ConnectionStrings.config file that you want to reference from your .NET 2.0 machine.config and your .NET 3.5 machine.config, you can create a directory within the .NET 2.0 CONFIG directory called ConnectionStrings, then create a hard link (for files, using fsutil hardlink) or junction point (for an entiry directory, using junction) with the same name within the .NET 3.5 CONFIG directory. When you put the ConnectionStrings.config in either directory, it will exist in both, so you can point to ConnectionStrings\ConnectionStrings.config with a configSource attribute in both machine.config files, and still only have a single file to maintain.

Wednesday, September 26, 2007

Globbing (using filename wildcard patterns) in C#

The Directory.GetFiles() method in the .NET CLR is unsatisfying for anyone that just wants to use simple filename wildcard patterns. Before you can even call GetFiles(), there are several steps you have to perform manually. Minimally, you have to split the directory from the filename pattern, then you have to convert the directory to an absolute path. If you want to process an array of delimited pattern lists, there are even more steps. Here's a simple recipe:

public static class Glob
static public string[] GetFiles(string[] patterns)
List<string> filelist= new List<string>();
foreach(string pattern in patterns)
string[] files= new string[filelist.Count];
return files;

static public string[] GetFiles(string patternlist)
List<string> filelist= new List<string>();
foreach(string pattern in
string dir= Path.GetDirectoryName(pattern);
if(String.IsNullOrEmpty(dir)) dir=
string [] files= new string[filelist.Count];
return files;

This only resolves patterns in filenames, not paths, but may serve the needs for this common task for most uses, and provides a starting point for something more comprehensive.

Wednesday, June 13, 2007

Media Queries: Opera and Safari

For about a year now, both Opera and Safari have supported CSS3 Media Queries, which allow separate CSS rules based on screen or window (viewport) size, color/grayscale depth, aspect ratio, resolution, tv progressive/interlaced, or grid devices (like dumb terminals or other tty-style devices).

This allows a number of capabilities:

  • More layout columns for the growing audience of 30-inch monitors and widescreen laptops.
  • Single-column layout when only a small or narrow view of the page is available (maybe due to a handheld device, a cheap video card, or an older computer).
  • Less graphically intense layout for "grid" devices (such as telnet sessions or e-book devices).
  • Different backgrounds for browsers with serious color limitations, or black and white displays (maybe for color-blind or low-vision users).
  • Different layout for pivoted monitors or other displays that are taller than they are wide.

Firefox and Internet Explorer need to get on board before this is widely useful, but now that Safari is available for Windows, it may add just a little bit more pressure.

Thursday, May 17, 2007

Here's how to Team Build a Web Application Project

Update: Aaron Hallberg : Team Build and Web Deployment Projects

  1. First, create a Web Deployment Project for your Web Application Project. (If you have a Web Site Project, you will need to convert the Web Site Project to a Web Application Project before continuing.)
  2. Set the Output Folder to the destination UNC for the Debug and Release build types.
  3. Set any other WDP properties appropriate to your environment, such as Web.config file section replacement.
  4. Make sure your build server has VisualStudio and VS SP1 installed. If the server does not have the C:\Program Files\MSBuild\Microsoft\WebDeployment\ folder, you may need to install Web Deployment Projects as well.
  5. Create fixup.TeamWebDeployment.targets (see below) in C:\Program Files\MSBuild\. Normally, the Team Build drop location overrides the Output Folder, so this file adds a second compile task to put the web app where you wanted it to go in the first place.
  6. Add an import directive for $(MSBuildExtensionsPath)\fixup.TeamWebDeployment.targets.
  7. Create the team build, choosing your solution and build type, but you MUST choose Mixed Platforms as the Platform, or things will go very badly for you.
  8. Cross your fingers and run the build.
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AfterBuild" Condition="$(OutputPath) != $(WDTargetDir)">
<RemoveDir Condition="'$(DeleteAppDataFolder)' == 'true'" Directories="$(OutputPath)\App_Data"/>

Also, I have to ask any MS folks out there: Why C:\Program Files\MSBuild\ ? Why not C:\Program Files\Common Files\MSBuild\ or C:\Documents and Settings\<current/all user(s)>\Application Settings\Microsoft\MSBuild\ ? This adds yet another customizable location that needs to be backed up.

Monday, May 14, 2007

VS TFS Build: Another day completely wasted

I've been trying to set up a Team Build for a simple web application for about a week now, and I just don't see the point anymore.

Sure, it integrates into Visual Studio, but that represents ROI for Microsoft, not me.

I've come from scheduling build scripts (.cmd -fu), with some Ant/nAnt experience to the nightmare world of the overdesigned MSBuild, which is just completely opaque. With a syntax that makes a simple tag reference impossible (properties are assigned by the tag name), too much confounding magic (this property or item or target has a special name that is used somewhere deep within the Web Deployment target file, and good luck finding a simple reference for that), and a completely impenetrable variable syntax ( @(FilesToCopy –> '$(MSBuildProjectDirectory)\Bin\%(Filename)%(Extension)') ? Are you kidding me?), and the ever-human-readable GUIDs (also impossible to find a quickref for) sprinkled throughout.

I've found exactly one book, published last year (not even by MS Press), on MSBuild. Other books may provide an appendix or something, but I haven't found anything helpful.

Today I finally got my Web Deployment Project to build successfully as a Team Build, but nothing showed up in the WDP Output Directory. Great, so it isn't working, and there is no error message to tell me why. WTF?

Side topic: What are the intended purposes of Web Sites, Web Application Projects, and Web Deployment Projects? How do they compare? Why do all three exist? Am I using the wrong thing?

Why am I doing this? Because it's the Microsoft direction? What do I gain? As far as I can tell, the primary differences are some better reporting and auditing, integration with the VS Team Process Template (once we decide to try customizing that again), and that our QA staff will now need to open VS to start a test build, where they could just open \\<server>\admin$\Tasks before.

In the meantime, I am hemorrhaging hours, and seriously wondering...why?

Monday, April 30, 2007

MIX07: Embarrasing Moments for Microsoft

Update: Another really good one.

When we arrived at the Las Vegas airport, one of the baggage carousels had a monitor displaying a Windows error report.

When we got to the hotel, we passed a monitor with a BSOD.

This morning, on the way to the keynote, we passed several monitors that indicated each room's schedule. One had a BSOD, another was flickering the old "You have unused icons on your desktop" tooltray balloon.

Monday, April 16, 2007

A simple copyright question

I'm probably missing something obvious, but can someone explain to me why a still image recording of someone is the property of the person performing the recording (the photographer), and an audio recording of someone is the property of the subject of the recording (the musician)?

Monday, April 09, 2007

Logitech 3Dconnexion = Cyberman2 ?

I am always excited by new input devices, so I'm intrigued by the Logitech 3Dconnexion, though I have to say it bears more than a passing resemblance to the disappointing Cyberman2 [2].

Tuesday, April 03, 2007

Easy XML serialization of complex objects with C#

If you've got complex, XML-serializable objects you'd like to trace easily, such as SOAP objects, here's a handy way to dump their contents to an XML string:

using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

public class XmlExporter
/// <summary>
/// Serialize an object as an XML string.
/// </summary>
/// <param name="o">The object to serialize.</param>
/// <returns>The object, serialized as an XML string.</returns>
public static string ToString(object o)
if (o == null) return "<NULL />";
string str;
Encoding utf8 = new UTF8Encoding();
XmlTypeAttribute xmlatt = (XmlTypeAttribute)Attribute.
GetCustomAttribute(o.GetType(), typeof(XmlTypeAttribute));
using (MemoryStream ms = new MemoryStream())
XmlTextWriter x = new XmlTextWriter(ms, utf8);
x.Formatting = Formatting.Indented;
XmlSerializer xs = xmlatt == null ? new XmlSerializer(o.GetType()) :
new XmlSerializer(o.GetType(), xmlatt.Namespace);
xs.Serialize(x, o);
str = utf8.GetString(ms.GetBuffer(), 0, (int)ms.Length);
return str;

Monday, April 02, 2007

Is Microsoft run by dilettantes?

The standard .NET class library cannot natively:

  • work with shorcut (.lnk) files
  • modify configuration settings
  • parse command-line options
  • enumerate ODBC DSNs
  • determine the data type of a stream by magic number

Sunday, April 01, 2007

MythTV config breakthroughs

At Re: Help Fixing overscan on HDTV, I finally found precisely what I needed to get the correct 1366×768 resolution to my Westinghouse W4207:


Re: Help Fixing overscan on HDTV


I have found to get the native resolution for my monitor is to have it probed by nvidia. This setup works best so far across many debian setups I have tried. I have a westinghouse 42" lcd native 1366 x 768 and the best I can get is 1360 x 765. I will use the prior posted xorg.conf file as an example

Section "Monitor"
Identifier "SONY TV"
#HorizSync 15.0 - 46.0
#VertRefresh 59.0 - 61.0
#Option "DPMS"
#Option "IgnoreEDID"
Option "UseEDID" "True"
#DisplaySize 720 405
#ModeLine "1280x720@60" 74.48 1280 1336 1472 1664 720 721 724 746 -hsync +vsync
#ModeLine "1216x648@60" 74.48 1216 1272 1400 1664 684 685 688 746 -hsync +vsync

Section "Device"
Identifier "NVIDIA Corporation NV18 [GeForce4 MX 440 AGP 8x]"
Driver "nvidia"

Section "Screen"
Identifier "Default Screen"
Device "NVIDIA Corporation NV18 [GeForce4 MX 440 AGP 8x]"
Monitor "SONY TV"
#Option "FlatPanelProperties" "scaling = centered"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "nvidia-auto-select"

Let me know how it works out.


Also, I successfully put my network script in /etc/init.d/bootmisc.sh:

iwconfig ath0 essid Springfield rate auto
ifconfig ath0 down
ifconfig ath0 up
dhclient ath0
/etc/init.d/ntp stop
/etc/init.d/ntp start

Wednesday, March 28, 2007

When to buy Vista

Warning: this article includes dangerous levels of sarcasm, and should not be read by young children or pregnant women.

Vista supports an expensive (for you) increase in DRM [1] [2] [3] [4] [5] [6] [7] [8] [9] [A] [B] [C]. Buy it only if you support your digital rights being "managed". Video drivers that check the "integrity" of their connections over 30 times a second can't be that much slower, right? Having your video driver "revoked" out from under you is a small price to pay in order to add several layers of new things you've gotta check when things go wrong.

Maybe you just like to drop $250-$400 on improvements that even supporters characterize as "incremental" [1] [2] [3] [4] [5], or have trouble understanding. That sidebar will certainly not represent a distraction that will get old inside a few months, or be disabled by your network admin sooner.

Or maybe you appreciate the fact that, to reinstall the upgrade edition, you have to install XP first [1]. Every time.

You probably are excited about the Aero Glass interface, if you haven't seen any of the videos of Beryl on youtube or Google Video or Metacafe.

The security enhancements may help protect you, once they release the latest round of fixes [1] [2] [3] [4] [5] [6]. You are running the 64-bit edition, right? [1] [2]

Anyway, be sure you've spent enough money on hardware. [$] [$] [$] [$] [$] [$] [$] [$] [$] [$] [$]

Thursday, March 15, 2007


2007-09-12 Update: ASP.NET Resources - Download "ASP.NET AJAX Client Life-Cycle Events" Cheat Sheet

2007-08-27 Update: Some more references at: Software Development in the Real World: Ultimate Web Development Cheat Sheet Guide

2007-03-15 Update: There is another great reference roundup at: Our Favorite Cheat Sheets - a definition from Whatis.com. Another good source is the "cheat sheets" tag at Lifehacker.

I've been vastly outdone by stark's list at The Developer Cheat Sheet Compilation by Fuzzy Future (mirrored below}.

Command Line

  1. Windows NT/XP Command Line Reference
  2. Bash Command Line Reference
  3. Bash Command Line Programming Reference
  4. DOS Commands


  1. Firebird SQL Cheat Sheet
  2. MySQL Cheat Sheet
  3. MySQL Reference List
  4. Oracle Cheat Sheet
  5. Oracle PL/SQL Cheat Sheet
  6. Oracle 9i Server Reference (PDF)
  7. Oracle 9i Command Reference
  8. PostgreSQL Cheat Sheet
  9. PostgreSQL Cheat Sheet List
  10. SQL Cheat Sheet
  11. SQL Server 2005 Commands


  1. Ada Syntax Card (PDF)
  2. ASP/VBScript Cheat Sheet
  3. C++ Language Summary
  4. C++ Reference Sheet (PDF)
  5. C++ Containers Cheat Sheet
  6. C# Language Reference
  7. C# Programmer’s Reference Sheet
  8. Delphi Technical Reference Card (PDF)
  9. Java Syntax Cheat Sheet
  10. Java Quick Reference (PDF)
  11. Java Reference for C++
  12. JSP 2.0 Syntax Reference Sheet (PDF)
  13. LaTeX Reference Card (PDF)
  14. .NET Cheat Sheets
  15. Perl Cheat Sheet
  16. Perl Reference Card (PDF)
  17. Perl Regular Expression Quick Reference (PDF)
  18. Perl Reference Guide
  19. PHP Cheat Sheet
  20. PHP Developer Cheat Sheet
  21. Python 101 Cheat Sheet
  22. Python 2.5 Quick Reference
  23. Python Cheat Sheet
  24. Python Quick Reference (PDF)
  25. Ruby Cheat Sheet (PDF)
  26. Ruby on Rails Cheat Sheet Collectors Edition
  27. Ruby Reference
  28. Ruby on Rails Reference Sheet


  1. Debian Linux Reference Guide (PDF)
  2. Linux Shortcuts and Commands
  3. One Page Linux Manual (PDF)
  4. TCP Ports List
  5. Treebeard’s Unix Cheat Sheet
  6. Unix Command Line Tips

Web Development

  1. Actionscript 2.0 Cheat Sheet (PDF)
  2. Actionscript 3.0 Cheat Sheet (PDF)
  3. Cold Fusion Cheat Sheet
  4. CSS Cheat Sheet
  5. CSS 2 Reference Card (PDF)
  6. CSS Reference Sheet
  7. CSS Shorthand Guide
  8. CSS Useful Properties
  9. Drupal 4.7 Cheat Sheet
  10. .htaccess Cheat Sheet
  11. HTML Cheat Sheet
  12. HTML Dom Quick Reference Card (PDF)
  13. Javascript Cheat Sheet
  14. Javascript Quick Reference
  15. Javascript Reference Page * No Longer Available
  16. JQuery Cheat Sheet (PDF) 
  17. JQuery Reference (PDF)
  18. JQuery Visual Map
  19. Mod_Rewrite Cheat Sheet
  20. Scriptaculous Combination Effects Field Guide (PDF)
  21. XHTML Cheat sheet
  22. XHTML Reference
  23. XHTML & HTML Cheat Sheet
  24. XML Syntax Quick Reference (PDF)
  25. XML Schema Reference (PDF)
  26. XSLT and XPath Quick Reference (PDF)

Miscellaneous Topics

  1. Ascii Codes Cheat Sheet
  2. CVS Cheat Sheet
  3. EMacs Keyboard Shortcut Reference
  4. Regular Expressions Cheat Sheet
  5. RGB Hex Colour Chart
  6. Subversion Quick Reference (PDF) * No Longer Available
  7. Theoretical Computer Science Cheat Sheet (PDF)
  8. UML Quick Reference Card (PDF)
  9. UML Cheat Sheet
  10. Vi Cheat Sheet
  11. Vim Commands Cheat Sheet
  12. XEmacs Commands Cheat Sheet

Monday, March 12, 2007

Perl one liner: spaces to tabs

This Perl one liner converts a file indented with spaces into one indented with tabs, using the first indented line to measure the number of spaces per indent.

perl -i~ -pe "/^( +)/ or next; $I or $I=$1; for($i=0;s/^$I//;$i++){} $_=(qq'\t' x $i).$_;" file ...

javascript: is not required in onclick or other event handlers

In Non-IE Browsers

The javascript: URI scheme is only necessary where URIs are used, such as href attributes.

The onevent event handlers accept javascript code, not URIs, so the scheme isn't required.

It isn't an error, because the colon causes the JavaScript parser to interpret it as a label (though MSIE just seems to ignore the leading javascript:).

In Firefox you can use the label, to confirm that it is interpreted as a label:

<a href="#" onclick="javascript:while(1) if(!confirm('Again?')) break javascript;return false;">test</a>

If you put the same code in the href, it doesn't work, because the URI parser consumes the javascript: scheme before the JavaScript processor can parse it as a label:

<a href="javascript:while(1) if(!confirm('Again?')) break javascript;return false;">test</a>


Internet Explorer supports two scripting languages (more can be installed, but are very rarely used in practice): JScript and VBScript. IE uses the first script on the page to determine the default scripting language for the page. If all of your onevent handlers are JavaScript (JScript to IE), then it makes sense to rearrange your scripts to ensure that a JavaScript appears first. Otherwise, if your handlers are a mix of JScript and VBScript, a language declaration (that looks like a label to non-IE browsers) can be used to disambiguate, e.g. onclick="javascript:alert(now Date())" or onclick="vbscript:alert(Now)".

Note that any VBScript handlers are still going to cause problems for non-IE browsers, so it may be better to define whatever VBScript code you need as a function outside the handler, using type="text/vbscript", and a dummy/alternative function with the same name can be defined for non-IE browsers using type="application/x-javascript", then call the function using a JavaScript handler. This approach also obviates the need to use these declarations.

Friday, February 09, 2007

Reminder: New Daylight Saving Time change starts this March

On August 8, 2005, President George W. Bush signed the Energy Policy Act of 2005. This Act changed the time change dates for Daylight Saving Time in the U.S. Beginning in 2007, DST will begin on the second Sunday in March [instead of the first Sunday in April] and end the first Sunday in November [instead of the last Sunday in October]. The Secretary of Energy will report the impact of this change to Congress. Congress retains the right to resume the 2005 Daylight Saving Time schedule once the Department of Energy study is complete.

&mdash http://webexhibits.org/daylightsaving/b.html

Be sure to check and make sure your systems are ready for this change.

Here are some datetimes to test (UTC=GMT):

  • 2007-03-10 08:00 UTC = 2007-03-10T00:00:00 PST
  • 2007-03-11 09:00 UTC = 2007-03-11T01:00:00 PST
  • 2007-03-11 11:00 UTC = 2007-03-11T04:00:00 PDT
  • 2007-03-12 07:00 UTC = 2007-03-12T00:00:00 PDT
  • 2007-03-31 08:00 UTC = 2007-03-31T01:00:00 PDT
  • 2007-04-01 09:00 UTC = 2007-04-01T02:00:00 PDT
  • 2007-04-01 11:00 UTC = 2007-04-01T04:00:00 PDT
  • 2007-04-02 07:00 UTC = 2007-04-02T00:00:00 PDT
  • 2007-10-27 07:00 UTC = 2007-10-27T00:00:00 PDT
  • 2007-10-28 08:00 UTC = 2007-10-28T01:00:00 PDT
  • 2007-10-28 11:00 UTC = 2007-10-28T03:00:00 PDT
  • 2007-10-29 08:00 UTC = 2007-10-29T00:00:00 PDT
  • 2007-11-03 07:00 UTC = 2007-11-02T23:00:00 PDT
  • 2007-11-04 08:00 UTC = 2007-11-04T00:00:00 PDT
  • 2007-11-04 11:00 UTC = 2007-11-04T03:00:00 PST
  • 2007-11-05 08:00 UTC = 2007-11-05T00:00:00 PST
  • 2006-03-11 08:00 UTC = 2006-03-11T00:00:00 PST
  • 2006-03-12 09:00 UTC = 2006-03-12T01:00:00 PST
  • 2006-03-12 11:00 UTC = 2006-03-12T03:00:00 PST
  • 2006-03-13 07:00 UTC = 2006-03-12T23:00:00 PST
  • 2006-04-01 08:00 UTC = 2006-04-01T00:00:00 PST
  • 2006-04-02 09:00 UTC = 2006-04-02T01:00:00 PST
  • 2006-04-02 11:00 UTC = 2006-04-02T04:00:00 PDT
  • 2006-04-03 07:00 UTC = 2006-04-03T00:00:00 PDT
  • 2006-10-28 07:00 UTC = 2006-10-28T00:00:00 PDT
  • 2006-10-29 08:00 UTC = 2006-10-29T01:00:00 PDT
  • 2006-10-29 11:00 UTC = 2006-10-29T04:00:00 PST
  • 2006-10-30 08:00 UTC = 2006-10-30T01:00:00 PST
  • 2006-11-04 07:00 UTC = 2006-11-04T00:00:00 PST
  • 2006-11-05 08:00 UTC = 2006-11-05T01:00:00 PST
  • 2006-11-05 11:00 UTC = 2006-11-05T03:00:00 PST
  • 2006-11-06 08:00 UTC = 2006-11-06T00:00:00 PST

.NET Results

  • 2007-03-10 08:00Z == 2007-03-10T00:00:00
  • 2007-03-11 09:00Z == 2007-03-11T01:00:00
  • 2007-03-11 11:00Z == 2007-03-11T04:00:00
  • 2007-03-12 07:00Z == 2007-03-12T00:00:00
  • 2007-03-31 08:00Z == 2007-03-31T01:00:00
  • 2007-04-01 09:00Z == 2007-04-01T02:00:00
  • 2007-04-01 11:00Z == 2007-04-01T04:00:00
  • 2007-04-02 07:00Z == 2007-04-02T00:00:00
  • 2007-10-27 07:00Z == 2007-10-27T00:00:00
  • 2007-10-28 08:00Z == 2007-10-28T01:00:00
  • 2007-10-28 11:00Z == 2007-10-28T04:00:00 (wrong)
  • 2007-10-29 08:00Z == 2007-10-29T01:00:00 (wrong)
  • 2007-11-03 07:00Z == 2007-11-03T00:00:00 (wrong)
  • 2007-11-04 08:00Z == 2007-11-04T01:00:00 (wrong)
  • 2007-11-04 11:00Z == 2007-11-04T03:00:00
  • 2007-11-05 08:00Z == 2007-11-05T00:00:00
  • 2006-03-11 08:00Z == 2006-03-11T00:00:00
  • 2006-03-12 09:00Z == 2006-03-12T01:00:00
  • 2006-03-12 11:00Z == 2006-03-12T04:00:00 (wrong)
  • 2006-03-13 07:00Z == 2006-03-13T00:00:00 (wrong)
  • 2006-04-01 08:00Z == 2006-04-01T01:00:00 (wrong)
  • 2006-04-02 09:00Z == 2006-04-02T02:00:00 (wrong)
  • 2006-04-02 11:00Z == 2006-04-02T04:00:00
  • 2006-04-03 07:00Z == 2006-04-03T00:00:00
  • 2006-10-28 07:00Z == 2006-10-28T00:00:00
  • 2006-10-29 08:00Z == 2006-10-29T01:00:00
  • 2006-10-29 11:00Z == 2006-10-29T04:00:00
  • 2006-10-30 08:00Z == 2006-10-30T01:00:00
  • 2006-11-04 07:00Z == 2006-11-04T00:00:00
  • 2006-11-05 08:00Z == 2006-11-05T01:00:00
  • 2006-11-05 11:00Z == 2006-11-05T03:00:00
  • 2006-11-06 08:00Z == 2006-11-06T00:00:00

Wednesday, February 07, 2007

Visual Studio SP1, ASP.NET: Enable property grid in source view

Tools → Options → check "Show all settings" → Text Editor → HTML → Miscellaneous → check "Enable property grid in source view"

Important Note If You Want Property Grid Support in HTML Source Editing Mode

ASP.NET and runat="server"

I'm completely sick of runat="server". I'm sick of typing it, I'm sick of being told when tags require it, I'm sick of looking at it. Especially since it is completely unnecessary.

The <asp: namespace implies that I want the element handled by the server!

Tuesday, February 06, 2007

Monday, February 05, 2007

Office 2007 Product Activation: Why Licensing Sucks

  1. Upgrade to your office's volume-licensed copy of Office 2007.
  2. Never get prompted to change to a product key that will work.
  3. Get prompted to activate online or by phone, choose online because this is not 1988.
  4. Read two paragraphs of explanation about your product key not being adequate, without any prompt to change to the new Office 2007 key you paid for.
  5. Look around the unfamiliar user interface for 20 minutes for where you can change to the correct key, constantly being nagged by Office to activate your product (or else).
  6. Uninstall and reinstall Office, and two hours later, find it did no good at all.
  7. Spend another hour Googling for help.
  8. Find Q826526, which describes the problem exactly, but offers no solution.
  9. Realize that license management costs and complexity are killing you, without offering any real protection from the capricious, unreasonable requirements of major software companies because you wore the wrong color pants today.
  10. Download and use OpenOffice, which doesn't treat users like guilty-until-proven-innocent criminals, and never worry about licensing again.
  11. Profit!

Tuesday, January 30, 2007

From the Tidy config options quickref

Update: If you agree that tidy should at least offer the option to use tabs, add your voice to Tidy Feature Request #1698567.

Tidy never outputs tabs.

HTML Tidy Configuration Options Quick Reference: tab-size

That's just stupid.

Sunday, January 21, 2007

Updated: My Favorite Podcasts


- Teknikal Diffikulties -
An excellent sketch comedy podcast.
The Onion Radio News
Quick, daily satirical headlines.
The President's Weekly Radio Address
A weekly, satirical presidential radio address.
Comic Strip Live: Stand Up Comedy
Stand up comedy. Warning: bad words.
 NPR: Wait Wait... Don't Tell Me!
NPR's game show about current events. Think It Pays To Be Ignorant or Hollywood Squares.
NPR: Satire from The Unger Report
Short satirical opinions from NBC's Brian Unger.
Rory Blyth: The Smartest Man in the World
Humor from the funniest Microsoft employee.
alt.NPR: What Would Rob Do?
Rob's view of various issues.


This American Life
Fascinating audio shows, built on a theme.
NPR: All Songs Considered
A diverse music program.
NPR: Open Mic Music
More diverse music, from artists who have not yet sold their soul to the RIAA.
They Might Be Giants Podcast
Free songs from TMBG.
alt.NPR: Benjamen Walker's Theory of Everything
Random, odd storytelling. Fridays.
alt.NPR: Love and Radio
More odd stuff, somewhat similar to This American Life. Every other Friday.
Cory Doctorow's craphound.com
Sci-fi stories and talks about copyfight issues.
Escape Pod
Sci-fi stories.
Escape Pod Classic
Reruns of the sci-fi story show.
Horror fiction.
Spaceship Radio
Old sci-fi radio shows, with commentary and interpretation.
StarShipSofa: Science Fiction and Sci Fi podcast
Informal discussions of science fiction authors, by a duo with a thickish Northern-Irish brogue.
Movies 101
Movie reviews from KPBX.
KCRW's Watching Television
Television review program.
NPR: Sunday Puzzle
NPR's Sunday morning word puzzle from Will Shortz.


this WEEK in TECH
Leo Laporte's flagship audio program. Panelists (including the colorful John C. Dvorak) discuss the week's news.
Boing Boing Boing
Cory Doctorow and crew discuss the latest stories on Boing Boing.
Guys drinking beer and discussing the top sites people have recently submitted to digg.com.
Net @ Night
Formerly Inside the Net, another Leo Laporte podcast that discusses Internet news.
Security Now!
A security news show from Leo Laporte.


NBC Nightly News (audio)
The complete nightly news as an audio program. Note: you may still get phrases like "what you are seeing..." or "this is the scene...", since this is just the audio track of the TV news.
NPR: Shuffle
A daily collection of stories from Morning Edition, All Things Considered, and other NPR programs.
60 Minutes Podcast - Selected Segments
The 60 Minutes interview of the week.
NPR: Playback
Top news stories from 25 years ago.
MSNBC Countdown with Keith Olbermann
A selected segment from the last episode of MSNBC's Countdown.
KCRW's Le Show (Harry Shearer)
Harry Shearer, voice of Mr. Burns and many, many other Simpsons characters, hosts this political news show.
The Alternative Source
News omitted by the big networks, from KPBX.

Tech News

Slashdot Review
Technology news and editorials from Slashdot, digg, reddit, and other sources.
APM: Future Tense
A short technology news program.
Distrowatch Weekly Podcast
Linux news.
LQ Podcast
LinuxQuestions.org Linux news program.
LQ Radio
LinuxQuestions.org interview show.
The Register - Radio RTFM
Strange radio drama created by mashing up the week's technology news.
EFF Line Noise
News and alerts from the Electronic Freedom Foundation.
Technology news.
HDTV and Home Theater Podcast
News and discussion about HDTV.

Gaming News & Discussion

GameSpot presents The HotSpot
Gaming news and discussion.
alt.NPR: Press Start
Gaming news and reviews.