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

Tuesday, October 28, 2008

I don't read Russian

A great deal of Cyrillic spam has made it into my various inboxes lately. I don't read Russian, so I'd sure like to be able to configure my email accounts to not accept stuff I cannot read, but this isn't an option‽

Configuring acceptable languages has been an underused but nonetheless available feature of HTTP for at least a dozen years. Why can't MTAs be configured to look for character encodings that the user cannot use? This would be a simple, straightforward solution to most of the spam that somehow currently makes it through my filters.

Update: Other languages I don't read include: Farsi, Chinese, Arabic, Korean, Georgian, and Japanese. The fault lies in myself, sure, but I need an MTA that can say Let me just stop you there. before an opaque message is relayed.

Tuesday, October 21, 2008

Rockbox podcast cover art

The fastest way to add cover art to a podcast folder on an MP3 player running Rockbox:

  1. Browse to the raw feed using Firefox
  2. Press Ctrl+U
  3. Type /:im (this finds the Apple iTunes image tag, the best image to use for the podcast)
  4. Copy the URL of the iTunes cover art image
  5. In a bash terminal window, in the podcast directory, type wget `xclip -o -d` ; convert *.jpg -resize 100x100 cover.bmp ; rm *.jpg

You'll need to be using Linux, and have xclip and convert installed, of course.

Wednesday, September 03, 2008

User Agent Web Of Lies: Where Does It End?

Internet Explorer started it by lying in its user agent string, claiming to be Mozilla (meaning Netscape 4). It got worse with Opera claiming to be both Mozilla and MSIE. Safari included both Mozilla and Gecko (meaning Firefox, et al.) in its UA string. But now, Chrome mentions Mozilla, Gecko, and Safari/WebKit. Will someone please put a stop to this nonsense? Anyone still using a user agent string to select functionality deserves to be hung and drawn and quartered and whipped and boiled and chopped into little bits, then to have those bits jumped on. This snowballing user agent string business just serves to make HTTP slower, make web logs bigger, and parsing logs much more tedious.

Google Chrome User Agent String

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

Update: There's a great summary of the history of the user agent string at WebAIM: Blog - History of the browser user-agent string.

Monday, August 25, 2008

Roundup: XP performance vs. Vista

I dug a bit into some anecdotal reports I had heard about XP vs. Vista. It turns out XP performance beats Vista: 32- or 64-bit, service packs or no, in a box or with a fox, in a house or with a mouse.

Sure, it's doing more, but is it doing more good? Death match: Windows Vista versus XP | InfoWorld | Analysis | 2008-03-17 | By Randall C. Kennedy

Thursday, August 14, 2008

.NET 3.5 sp1 Setup Blocks Itself!

Um… ooooooooooooo-kay… that seems a bit meta.

I guess I'll click Ignore? Oh look, the progress bar is going backwards. I guess it's a Regress Bar.

Wednesday, August 06, 2008

Efficacy of .NET StreamReader's detectEncodingFromByteOrderMarks

The .NET System.IO.StreamReader class has several forms of its constructor that accept a boolean detectEncodingFromByteOrderMarks parameter to look for a byte-order-mark (BOM)/encoding-signature when the file is first read.

When enabled, this feature populates the CurrentEncoding property after the first time the file is read (which can be a simple call to Peek()).

This method only works reliably for encodings that supply a BOM, but since the default encoding is utf-8, several other single-byte encodings are compatible with content in the 7-bit ASCII range.

Here is a sample of how well this feature works with content written in various encodings:

us-ascii
Not detected, but works fine with the default UTF-8 since ASCII is a subset of UTF-8.
utf-7
Not detected, not UTF-8 compatible.
utf-8
Detected correctly. Default encoding anyway.
utf-16/UCS-2
Detected correctly (as utf-16).
utf-32
Detected correctly.
utf-32BE
Detected correctly, but still reads incorrectly in my testing!
unicodeFFFE
Detected correctly.
Windows-1252, iso-8859-1, iso-8859-15, macintosh
Not detected, but shares a significant character overlap with the UTF-8 default (7-bit ASCII).
Various EBCDIC encodings: IBM037, IBM500, IBM870
Not detected, and not read correctly in tests.
UTF-EBCDIC, SCSU, BOCU-1, Punycode, CESU-8, UCS-4*, UTF-1, UTF-9†, UTF-18
Not supported by the .NET Framework.

For the most part, content using a Unicode encoding of some kind (which include a BOM) have the greatest chance of success, and encodings not listed aren't likely to work. EBCDIC and international encodings, among others, must really be opened using their explicit encoding (meaning they must be anticipated), if they are to be read successfully, which is why you should only produce UTF-8/16/32 content.

* Not recognized as an alias for UTF-32.
† To be fair, these encodings are a joke.

Thursday, July 31, 2008

Windows Special Folders Support

Windows system/special folders, unlike Linux (which has a consistent, reliable filesystem heirarchy), can be in all kinds of crazy custom locations, or use localized text.

As a consequence, you cannot simply use a path to a special folder. You have to look it up first. Nearly all Microsoft APIs/platforms/technologies provide some way to look up these special folders. What's even more complicated is that these lookups seem to be about as varied as the folder names themselves.

Not only do newer technologies reflect completely new folders, as could be expected, but each API seems to provide access to a different subset of special folders, and use different names/keys for the folders, and sometimes provide multiple partial lists via different methods/lookups/constants. Say you want to look up the location of the Windows Recycle Bin, does your API refer to this as CSIDL_BITBUCKET or FOLDERID_RecycleBinFolder, or does it provide any access to it at all?

This reference aims to provide an overview of whether your API supports a given special folder, and where to look for it.

Windows Special Folder Environment Variables

  • ALLUSERSPROFILE
  • APPDATA
  • CommonProgramFiles
  • CommonProgramFiles(x86)
  • CommonProgramFilesW6432
  • ProgramFiles
  • ProgramFiles(x86)
  • ProgramFilesW6432
  • SystemDrive
  • SystemRoot
  • TEMP
  • TMP
  • USERPROFILE
  • windir
Windows XP Embedded uses numeric environment variables.

.NET System.Environment.SpecialFolder Enumeration

  • ApplicationData
  • CommonApplicationData
  • LocalApplicationData
  • Cookies
  • Desktop
  • Favorites
  • History
  • InternetCache
  • Programs
  • MyComputer
  • MyMusic
  • MyPictures
  • Recent
  • SendTo
  • StartMenu
  • Startup
  • System
  • Templates
  • DesktopDirectory
  • Personal
  • MyDocuments
  • ProgramFiles
  • CommonProgramFiles

.NET System.IO.Path Methods

  • GetTempPath()

Windows Scripting Host WshShell.SpecialFolders Collection

  • AllUsersDesktop
  • AllUsersStartMenu
  • AllUsersPrograms
  • AllUsersStartup
  • Desktop
  • Favorites
  • Fonts
  • MyDocuments
  • NetHood
  • PrintHood
  • Programs
  • Recent
  • SendTo
  • StartMenu
  • Startup
  • Templates

Windows Scripting Host FileSystemObject.GetSpecialFolder() Method Parameters

  • SystemFolder
  • TemporaryFolder
  • WindowsFolder

Windows CLSID GUIDs

Administrative Tools{D20EA4E1-3957-11d2-A40B-0C5020524153}
Briefcase{85BBD920-42A0-1069-A2E4-08002B30309D}
Control Panel{21EC2020-3AEA-1069-A2DD-08002B30309D}
Fonts{D20EA4E1-3957-11d2-A40B-0C5020524152}
History{FF393560-C2A7-11CF-BFF4-444553540000}
Inbox{00020D75-0000-0000-C000-000000000046}
Microsoft Network{00028B00-0000-0000-C000-000000000046}
My Computer{20D04FE0-3AEA-1069-A2D8-08002B30309D}
My Documents{450D8FBA-AD25-11D0-98A8-0800361B1103}
My Network Places{208D2C60-3AEA-1069-A2D7-08002B30309D}
Network Connections{7007ACC7-3202-11D1-AAD2-00805FC1270E}
Printers and Faxes{2227A280-3AEA-1069-A2DE-08002B30309D}
Recycle Bin{645FF040-5081-101B-9F08-00AA002F954E}
Scanners and Cameras{E211B736-43FD-11D1-9EFB-0000F8757FCD}
Scheduled Tasks{D6277990-4C6A-11CF-8D87-00AA0060F5BF}
Temporary Internet Files{7BD29E00-76C1-11CF-9DD0-00A0C9034933}
Web Folders{BDEADF00-C265-11D0-BCED-00A0C90AB50F}

Win32 CSIDL Constants

  • CSIDL_ADMINTOOLS
  • CSIDL_ALTSTARTUP
  • CSIDL_APPDATA
  • CSIDL_BITBUCKET
  • CSIDL_CDBURN_AREA
  • CSIDL_COMMON_ADMINTOOLS
  • CSIDL_COMMON_ALTSTARTUP
  • CSIDL_COMMON_APPDATA
  • CSIDL_COMMON_DESKTOPDIRECTORY
  • CSIDL_COMMON_DOCUMENTS
  • CSIDL_COMMON_FAVORITES
  • CSIDL_COMMON_MUSIC
  • CSIDL_COMMON_OEM_LINKS
  • CSIDL_COMMON_PICTURES
  • CSIDL_COMMON_PROGRAMS
  • CSIDL_COMMON_STARTMENU
  • CSIDL_COMMON_STARTUP
  • CSIDL_COMMON_TEMPLATES
  • CSIDL_COMMON_VIDEO
  • CSIDL_COMPUTERSNEARME
  • CSIDL_CONNECTIONS
  • CSIDL_CONTROLS
  • CSIDL_COOKIES
  • CSIDL_DESKTOP
  • CSIDL_DESKTOPDIRECTORY
  • CSIDL_DRIVES
  • CSIDL_FAVORITES
  • CSIDL_FONTS
  • CSIDL_HISTORY
  • CSIDL_INTERNET
  • CSIDL_INTERNET_CACHE
  • CSIDL_LOCAL_APPDATA
  • CSIDL_MYDOCUMENTS
  • CSIDL_MYMUSIC
  • CSIDL_MYPICTURES
  • CSIDL_MYVIDEO
  • CSIDL_NETHOOD
  • CSIDL_NETWORK
  • CSIDL_PERSONAL
  • CSIDL_PRINTERS
  • CSIDL_PRINTHOOD
  • CSIDL_PROFILE
  • CSIDL_PROGRAM_FILES
  • CSIDL_PROGRAM_FILESX86
  • CSIDL_PROGRAM_FILES_COMMON
  • CSIDL_PROGRAM_FILES_COMMONX86
  • CSIDL_PROGRAMS
  • CSIDL_RECENT
  • CSIDL_RESOURCES
  • CSIDL_RESOURCES_LOCALIZED
  • CSIDL_SENDTO
  • CSIDL_STARTMENU
  • CSIDL_STARTUP
  • CSIDL_SYSTEM
  • CSIDL_SYSTEMX86
  • CSIDL_TEMPLATES
  • CSIDL_WINDOWS

Windows Vista KNOWNFOLDERID

  • FOLDERID_AddNewPrograms
  • FOLDERID_AdminTools
  • FOLDERID_AppUpdates
  • FOLDERID_CDBurning
  • FOLDERID_ChangeRemovePrograms
  • FOLDERID_CommonAdminTools
  • FOLDERID_CommonOEMLinks
  • FOLDERID_CommonPrograms
  • FOLDERID_CommonStartMenu
  • FOLDERID_CommonStartup
  • FOLDERID_CommonTemplates
  • FOLDERID_ComputerFolder
  • FOLDERID_ConflictFolder
  • FOLDERID_ConnectionsFolder
  • FOLDERID_Contacts
  • FOLDERID_ControlPanelFolder
  • FOLDERID_Cookies
  • FOLDERID_Desktop
  • FOLDERID_Documents
  • FOLDERID_Downloads
  • FOLDERID_Favorites
  • FOLDERID_Fonts
  • FOLDERID_Games
  • FOLDERID_GameTasks
  • FOLDERID_History
  • FOLDERID_InternetCache
  • FOLDERID_InternetFolder
  • FOLDERID_Links
  • FOLDERID_LocalAppData
  • FOLDERID_LocalAppDataLow
  • FOLDERID_LocalizedResourcesDir
  • FOLDERID_Music
  • FOLDERID_NetHood
  • FOLDERID_NetworkFolder
  • FOLDERID_OriginalImages
  • FOLDERID_PhotoAlbums
  • FOLDERID_Pictures
  • FOLDERID_Playlists
  • FOLDERID_PrintersFolder
  • FOLDERID_PrintHood
  • FOLDERID_Profile
  • FOLDERID_ProgramData
  • FOLDERID_ProgramFiles
  • FOLDERID_ProgramFilesX64
  • FOLDERID_ProgramFilesX86
  • FOLDERID_ProgramFilesCommon
  • FOLDERID_ProgramFilesCommonX64
  • FOLDERID_ProgramFilesCommonX86
  • FOLDERID_Programs
  • FOLDERID_Public
  • FOLDERID_PublicDesktop
  • FOLDERID_PublicDocuments
  • FOLDERID_PublicDownloads
  • FOLDERID_PublicGameTasks
  • FOLDERID_PublicMusic
  • FOLDERID_PublicPictures
  • FOLDERID_PublicVideos
  • FOLDERID_QuickLaunch
  • FOLDERID_Recent
  • FOLDERID_RecordedTV
  • FOLDERID_RecycleBinFolder
  • FOLDERID_ResourceDir
  • FOLDERID_RoamingAppData
  • FOLDERID_SampleMusic
  • FOLDERID_SamplePictures
  • FOLDERID_SamplePlaylists
  • FOLDERID_SampleVideos
  • FOLDERID_SavedGames
  • FOLDERID_SavedSearches
  • FOLDERID_SEARCH_CSC
  • FOLDERID_SEARCH_MAPI
  • FOLDERID_SearchHome
  • FOLDERID_SendTo
  • FOLDERID_SidebarDefaultParts
  • FOLDERID_SidebarParts
  • FOLDERID_StartMenu
  • FOLDERID_Startup
  • FOLDERID_SyncManagerFolder
  • FOLDERID_SyncResultsFolder
  • FOLDERID_SyncSetupFolder
  • FOLDERID_System
  • FOLDERID_SystemX86
  • FOLDERID_Templates
  • FOLDERID_TreeProperties
  • FOLDERID_UserProfiles
  • FOLDERID_UsersFiles
  • FOLDERID_Videos
  • FOLDERID_Windows

TweakUI Special Folders

  • CD Burning
  • Desktop
  • Document Templates
  • Favorites
  • Installation Path
  • My Documents
  • My Music
  • My Pictures
  • My Video
  • Programs
  • Send To
  • Shared Music
  • Shared Pictures
  • Shared Video
  • Start Menu
  • Startup

Visual Studio 2008 Setup Project → Add Special Folder

  • Common Files Folder
  • Common Files (64-bit) Folder
  • Fonts Folder
  • Program Files Folder
  • Program Files (64-bit) Folder
  • System Folder
  • System (64-bit) Folder
  • User's Application Data Folder
  • User's Desktop
  • User's Favorites Folder
  • User's Personal Data Folder
  • User's Programs Menu
  • User's Send To Menu
  • User's Start Menu
  • User's Startup Folder
  • User's Template Folder
  • Windows Folder
  • Global Assembly Cache Folder

Visual Studio 2008 Setup Project → File Installation Properties → DefaultLocation [SpecialFolders]

  • AdminToolsFolder
  • AppDataFolder
  • CommonAppDataFolder
  • CommonFiles64Folder
  • CommonFilesFolder
  • DesktopFolder
  • FavoritesFolder
  • FontsFolder
  • LocalAppDataFolder
  • MyPicturesFolder
  • PersonalFolder
  • ProgramFiles64Folder
  • ProgramFilesFolder
  • ProgramMenuFolder
  • SendToFolder
  • StartMenuFolder
  • StartupFolder
  • System16Folder
  • System64Folder
  • SystemFolder
  • TempFolder
  • TemplateFolder
  • WindowsFolder
  • WindowsVolume

Wednesday, June 25, 2008

Way to go, abc.com!

So my DVR missed the most recent episode of the Mole. I decided, rather than grabbing the episode from a torrent, that I'd try and play their game.

  1. I went to abc.com, and quickly found out that Linux STILL isn't supported (hulu seems to have figured it out).
  2. So, I grit my teeth and boot into my old, neglected Windows partition and go to abc.com again.
  3. I had to install a plugin and restart Firefox.
  4. Finally, after a lengthy download, I chose the episode to watch and got an error.
  5. I noticed that the error is BECAUSE THERE IS NO AD DATA.
  6. Nevermind.

So after all of that, I can't watch the episode because abc.com wasn't able to line up commercials? Brilliant. Advertisers want viewers, so clearly the smartest way to drum up advertising is to lock out viewers!

Monday, June 09, 2008

Firefox 3 Features


Here's a good demo of the Awesome Bar, plus: find out who Larry is.

I also found out this weekend that Firefox 3 has true zoom, like Opera has had for years. If you zoom in, the images and layout all zoom in, not just the text anymore.

How to create your own "smart bookmark" queries in Firefox 3 (saved search bookmarks/history, sort by 20 different properties, filter by domain or term, and limit the number returned):

Here's how to restore the original examples:

Thursday, May 22, 2008

Update: Visual Studio's NIH RegEx Syntax


It looks like this topic came up a couple of years ago with VS2005 at Coding Horror, including a Microsoft reply.

Hey Jeff (and assorted follow-up posters),

I'm the lead program manager for the team that owns editing and the find/replace dialog in Visual Studio. Our team agrees with your post :)

It is a very oddball regex syntax, and as best we can tell it comes from Visual C++ 2.0. We did want to add additional support for .NET 2.0-style regular expressions in the Visual Studio 2005 release, but unfortunately due to time pressures it didn't make the final list of features. We were able to make a number of bug fixes to the existing engine though, to give some improvement over VS 2003.

We do keep this on our list of things we want to fix. Ideally at some point we'll actually build in a nifty little extensibility point so you can wire up any regex engine you want for searches.

Thanks for the feedback!

Neil Enns
Lead Program Manager
Microsoft Visual Studio
— Neil on July 14, 2006 11:15 AM

So, take heart! A Microsoft team member agreed about the stupidity of the NIH RegEx syntax in 2006, so I'm sure we'll see this fixed any day now.

What we need, as pointed out by another commenter, is another pattern option: Regular regular expressions.

Instead, the closest we currently have is couple of VS add-ons to replace the Find and Replace dialog that support normal regex syntax, an unfamiliar UI, broken English, and VS 2005, and no express editions.

Tuesday, May 06, 2008

Visual Studio's NIH RegEx Syntax

Here's a quick phrasebook for Visual Studio's NIH RegEx syntax:

VS Editor RegEx Syntax Real RegEx Syntax* Meaning
{} () tagged / captured submatch
() (?:) non-capturing submatch
(?=) lookahead assertion
~() (?!) negative lookahead assertion / prevent match
(?<=) lookbehind assertion
(?<!) negative lookbehind assertion
(?>) nonbacktracking (greedy) subexpression
< \< start of word
> \> end of word
\< < matches < character
\> > matches > character
(<|>) \b word boundary
~(<|>) \B not a word boundary
? zero-or-one quantifier
?? minimal zero-or-one quantifier
@ *? minimal zero-or-more quantifier
\@ @ matches @ character
# +? minimal one-or-more quantifier
\# # matches # character
^n {n} match n times quantifier
\^ ^ matches ^ character
{n,} match at least n times quantifier
{m,n} match between m and n times (inclusive) quantifier
{n,}? minimally match at least n times quantifier
{m,n}? minimally match between m and n times (inclusive) quantifier
\(w,n) (replacement expression) left-pad captured group n to w characters
\(-w,n) (replacement expression) right-pad captured group n to w characters
\g \a alert / bell
\h [\b] backspace
\: : matches : character
:i ([a-zA-Z_$][a-zA-Z0-9_$]*) identifier
:q (("[^"]*")|('[^']*')) quoted string
:h ([0-9A-Fa-f]+) hexadecimal number (not including any prefix, e.g. 0x or \x or \u)
:n ((\d+.\d*)|(\d*.\d+)|(\d+)) rational number
:w (\p{L}+) letters
:b [ \t] space or tab (like \s without \n or \v)
:z \d+ integer (one or more decimal digits)
:a \w word / alphanumeric character
[^:a] \W non-word / non-alphanumeric character
:c \p{L} letter character (like \w without the _)
:d \d decimal digit
[^:d] \D non-decimal-digit character
:U \p{U} matches Unicode character category U
\p{IsBlock} matches characters in Unicode named block Block
[^:U] \P{U} does not match Unicode character category U
\P{IsBlock} does not match characters in Unicode named block Block
:Al \p{L} letter
:Nu \d decimal digit
:Pu \p{P} punctuation character
:Wh \s whitespace character
[^:Wh] \S non-whitespace character
:Bi ? bidirectional character
:Ha \p{IsHangulJamo} Korean Hangul and combining Jamos
:Hi \p{IsHiragana} hiragana character
:Ka \p{IsKatakana} katakana character
:Id ? ideographic characters, such as Han and kanji

*This is the syntax supported by everything else, including the .NET System.Text.RegularExpressions library. For some reason, Microsoft decided to create a new syntax just for the Visual Studio editor! But they just don't have the resources to implement "your favorite standard".

Anything that's not on the list should be the same for NIH Regex patterns.

Tuesday, April 22, 2008

Dear Microsoft, We Need XSLT 2.0

XSLT2 Is Useful

Listen, I really appreciate the work Microsoft has done on IE8 standards, and I think LINQ to XML really improves on the W3C XML DOM, but I also need to produce XML from templates.

You see, ASP.NET really only produces HTML from templates. If you want to produce RSS, Atom, POX, SVG, P3P, XSLT, or XSL-FO from templates, probably the best way to do this (for flexibility, maintainability, and readability) is with XSLT Simplified Syntax.

Example

<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2006/xpath-functions"
xsl:exclude-result-prefixes="xsl fn"
xsl:version="2.0">
<title>Press Releases</title>
<link href="http://example.org/"/>
<updated>
<xsl:value-of select="fn:max(//story/@releasedate)"/>
</updated>
<id>urn:uuid:7b2845b6-cc0d-4a64-92a4-2c0f33a398a2</id>
<xsl:for-each select="//story">
<entry>
<title>
<xsl:value-of select="@name"/>
</title>
<link href="http://example.org/"/>
<id>
<xsl:text>http://example.org/press/</xsl:text>
<xsl:value-of select="fn:format-dateTime(@releasedate,'YYYYMMDDTHHmmss')"/>
</id>
<updated>
<xsl:value-of select="@releasedate"/>
</updated>
<content type="xhtml" xml:lang="en">
<xsl:copy-of select="div"/>
</content>
</entry>
</xsl:for-each>
</feed>

This is more readable and maintainable than using the DOM to build up the document, or a full XSLT stylesheet. It is much more approachable, since it is a simple template, which allows trivial changes without having to understand the complete XSLT syntax. Plus, a minimal .NET HTTP handler can apply XSLT to source XML (perhaps produced by SQL Server) without much code to maintain.

The Problem

Anyone that's tried to use XSLT 1.0 quickly finds that they can't use most of the modern methods they've become used to in other languages: regular expressions, date/time/number parsing and formatting, grouping, data structures, Unicode support, date/time/timezone/duration data types and functions, set manipulation, aggregate functions, and converting relative URLs to absolute ones, to name some common examples of things that are simply prohibitively difficult and complex in XSLT 1.0 (particularly using the simplified syntax).

Of course these have all been addressed in XSLT 2.0 and XPath 2.0, released as W3C Recommendations over a year ago, moving XSLT from curiosity to practical templating engine.

The .NET XSLT library still only supports XSLT 1.0 and XPath 1.0.

The emphasized functions in the above example give an indication of why this is a problem. How can you provide aggregate functions and date/time formatting without those functions without losing the benefits of the XSLT Simplified Syntax? There are really only two practical answers.

Saxon

Buy Saxon (or use Saxon Basic, which is free).

Benefits
  • You support Michael Kay, XSLT ninja.
  • The market for XSLT grows.
  • You won't have to make changes to all of your templates when Microsoft finally supports XSLT2.
  • You spend no time trying to figure out how to work around the lack of a simple XSLT2 feature.
  • You get used to XSLT2.

Kludgy Workarounds

If your needs are more modest, you could try converting your stylesheet to XSLT1 and work around the limitations of that implementation.

Benefits
  • You don't spend time learning a third party library.
  • You don't have to manage a third party library when deploying your system.
  • You spend no money, provided you do not assign any value to the time required for you to come up with workarounds.

Obviously, you only want to use this approach if you have to, or if there are only a few simple workarounds to get what you want into the template, such as using the SQL Server CONVERT function to format date/time/currency/numeric values before building the XML document, or altering the XML DOM to add or substitute formatted or aggregate values before applying the stylesheet.

Conclusion

Microsoft really needs to focus some resources on getting XSLT 2.0 into the next release of .NET. Clearly, between IE8 and OOXML, standards support is on Microsoft's TODO list, and there's no question about their committment to XML. Microsoft even knows that their customers want XSLT2. The only question that remains is when market pressure will intensify the need to implement this omission. Be sure to contact Microsoft's XML Team to request a timeline for XSLT2.

Wednesday, March 26, 2008

What happens when people don't know what they're doing: DoNotReply.com and RFC 2606

People without a basic understanding of RFC 2606 have been using a From or Reply-To address of donotreply@donotreply.com, and surprise!, that domain exists.

This implies not just job incompetence, but a manner so cavalier and naïve that the person responsible didn't even consider typing donotreply.com into a browser.

This is a level of technical malpractice worthy of termination, IMO.

Remember, the people that designed the Internet were generally pretty clever folks. If you need a phony domain name (akin to a 555 phone number), for example, there's a pretty good chance someone has set aside a few of those.

  • .test
  • .example
  • .invalid
  • .localhost
  • example.com
  • example.net
  • example.org

Note: IANA has even set aside an example MIME supertype and subtypes for all of the other supertypes.

Tuesday, March 25, 2008

Re: The Internet Explorer 8 User-Agent String

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)

Microsoft, why are you still lying about being Mozilla?

Seriously, it's just wasted network traffic and drive space and extra parsing for log analyzers.

I see many commentors, in the recent IEBlog post about the IE8 user agent string, requesting an end to the "Mozilla/4.0 (compatible; " nonsense:

I see only two people defending the 1990s style user agent string:

This seems to indicate a pretty clear preference from the developer community.

There will be a few sites that incorrectly slam the door on their guests simply due to an unknown UA string, but they clearly need a wake-up call anyway. Whitelisting user agent strings is stupid, and needs to be stopped now.

P.S.: Thanks for making standards mode the default in IE8, Microsoft! I'm not kidding or being sarcastic. You've really improved the lives of developers in the long run, whether or not everyone understands it now.

Monday, March 10, 2008

Vista at MIX08

At nearly every session, Windows Vista froze briefly and flickered several times in a way that interrupted the session presentations significantly. It was obvious that the presenters were afraid the machine had just crashed, though the desktop eventually returned. Usually, this was at a time when the input to the projector was changed, and I'm guessing that changed the video subsystem enough to cause Vista Content Protection to restart the video subsystem.

This seems to confirm: Peter Gutmann was right.

Friday, March 07, 2008

More from MIX08

More about IE8 from MIX08:

  • The new Developer Tools is part of the standard IE8 install.
  • The Dev Tools have an extremely cool Trace Styles feature that allows you to look at the effective styles of an object, and determine which rule is responsible for a given style.
  • The Dev Tools contain a full-featured JScript debugger.
  • JScript may now select DOM elements using CSS selectors.
  • Using the window.location.hash property to store and retrieve state info, the back button now more intuitively supports AJAX apps.
  • JScript in IE8 can tell whether the browser has lost its internet connection (window.navigator.online) and use offline storage to persist the page state.
  • The offline data store does not use a database backend (yet), and limits the storage to 10MB/domain/tab.
  • A new object, XDomainRequest, allows XmlHttpRequest-style interactions across domains.

Thursday, March 06, 2008

MIX08 News

  • IE8 will finally support data: URLs!
  • SSDS provides REST, SOAP, or APP access to a SQL data store.
  • There have been many changes to ASP.NET Dynamic Data controls since they were introduced at the last MIX: everything seems more template-based, uses attribute decorating in addition to SQL schema info to automatically build GridView and DetailsView/FormView controls.
  • Microsoft is REALLY into REST.
  • Silverlight can be worked into any conversation.
  • IIS7 is pretty exciting, particularly for developers with hosted applications (or corporations in a similar situation), since nearly every IIS setting is now in the web.config file.
  • Hosts in IIS7 can delegate features with impressive granularity, or lock them down.
  • The IIS7 admin console can connect through port 80.
  • IE8 is pushing something called WebSlices.

Wednesday, March 05, 2008

MIX08: Day One

This year, Microsoft handed out purses to all attendees, made out of the finest white tarpaulin. To complete the look, white (or green or black) berets were available, for anyone that wanted to rock the Jamie Hyneman look. No matching shoes yet, though.

No expense has been spared, as Microsoft has made a full 11Mb/s 802.11b Internet connection available to anyone directly within the conference rooms. Internet access from within the hotel rooms can be had for only $10/day.

Last night, we attended a Microsoft screening of The King of Kong (2007), and tonight the subject of the movie will try to break the current Donkey Kong high score.

Saturday, March 01, 2008

Warning: Do not buy Microsoft input devices

My Microsoft Sidewinder Strategic Commander doesn't work under Vista (64-bit). It's pretty clear that Microsoft considers even a USB input device to have an expiration date, since they appear to have no plans to add this support.

I bought Bioshock recently, and it also seems obvious that Microsoft paid the developer to make using any game controller other than the XBOX 360 controller virtually impossible to set up.

So, I guess in a few years, when the next version of Windows is released and doesn't support even that controller, I'll be stuck with keyboard and mouse.

Though this approach works really well for Microsoft, and stands as the familiar degenerate case of Capitalism, I'm tired of spending money unnecessarily. Is this what a stand-alone hardware company or OS vendor would do? This isn't anticompetitive?

Thursday, February 21, 2008

Wednesday, January 16, 2008

Election '08: Meat Update

In case you only suspected candidates are just meat products...

Google News 2008-01-16T08:00: Elections: Meat Recall