I’ve just released a small update to Catfood.Shapefile. Stephan Stapel, who implemented PolyLineM support, has contributed a patch that improves the class hierarchy. CodePlex user originSH suggested supporting the ACE driver for 64-bit systems. I’ve added a constructor overload that allows you to use predefined Jet and ACE connection strings or provide your own templates if necessary. Thanks to Stephan and originSH.
Catfood.Shapefile is a .NET library for enumerating ESRI shapefiles. I originally wrote the library to help me build some complex layers in Catfood Earth. Since then it’s picked up thousands of users and some really valuable suggestions and patches from the CodePlex community. I’m very glad a took a couple of hours to open source the library back in 2009.
I’ve just updated Catfood.Shapefile, my ESRI Shapefile parser for .NET, with PolyLineM support thanks to a contribution from Stephan Stapel. The solution for the new version has also been updated to Visual Studio 2010.
Klout is building PageRank for people. You get a score between 0-100 based on how large your social graph is and how much you influence it. They also have a simple API and have been kind enough to let me use it as part of Follower so I’ve just released Follower 1.40 with Klout integration.
Follower automates the chore of following new friends on Twitter. It also somewhat automates removing traitors who don’t follow you back – as much as Twitter would let me get away with. One problem with following promiscuously is that you do end up following a lot of spammy and scammy accounts. Adding Klout helps with this as you can now say ‘follow everyone who follows me as long as their Klout score is higher than 15’. This keeps some of the riff raff out. And if a follower’s score rises above the threshold then they’ll be admitted into the club.
You can also use Klout to weed out existing follows with a low Klout. In this mode anyone below a configurable score will be added to the remove list even if they are following you back.
The only snag I hit with API is that while you can lookup a user by Twitter ID the ID isn’t returned in the response. If you query multiple IDs at a time you don’t always get a full set of results so without the ID you can’t reliably tell which result is associated with each ID. For this reason I’m only looking up one score at a time. Twitter has nice bulk methods to grab IDs for up to 5,000 friends or followers, it would nice if Klout could match this or at least fix the ID issue. This is a small problem though and having an automated way of detecting the quality of Twitter accounts is a great addition to Follower. If you use Twitter check it out.
Mark Jackson, my co-founder at Cucku, is blogging re-mastered debugging tips from StackHash. StackHash is now an open source project and all of the great content from the original site has been taken offline. This new project is a great resource for debugging on the Windows platform, especially post-mortem crash dump analysis. If that’s your thing do yourself a favor and subscribe to Mark’s blog.
Wasted far too long on trying to get WCF to work with custom basic authentication this week. Custom in the sense that I need to look up the username and password in a database and not have IIS attempt to match the credentials to a Windows account. Given how well WCF 4.0 supports RESTful services in general it’s a bit shocking that basic auth over SSL isn’t supported out of the box. It seems like you should be able to derive and hook up a class from UserNamePasswordValidator, set the transport clientCredentialType to Basic and be ready to go. I’ve heard that this works for self-hosted services, but no dice in IIS.
Basic access authentication is a simple protocol and so in the end I added a helper method that checks for access (and in my case returns the user information for later use) at the start of each call into the service. It’s very simple:
Check WebOperationContext.Current.IncomingRequest.Headers for an ‘Authorization’ header. If it’s there decode and validate the credentials.
If the header is missing or the credentials are incorrect add the WWW-Authenticate header to the response - WebOperationContext.Current.OutgoingResponse.Headers.Add("WWW-Authenticate: Basic realm=\"myrealm\""); – and then throw a WebFaultException with a 401 Unauthorized status code.
This triggers a browser to prompt for your username and password and then try the request again. When calling the service in code you can add the ‘Authorization’ header preemptively and skip the 401 response entirely.
Catfood WebCamSaver 3.10 adds support for simultaneous updates in 4 and 16-cam modes. The WebCam Directory has also been completely overhauled. WebCamSaver is a rather voyeuristic screensaver that lets you watch live feeds from around the world. As well as a screensaver the feed is available in my World Webcams Google Gadget.
Catfood PdfScan 1.20 follows hot on the heels of 1.10. The main update is showing a preview of each scanned page which is super handy if you always forget which way pages are supposed to go in your document feeder. Mentioning no names…
Catfood Earth 3.10 includes rotation to longitude / solar time, volcanoes, a screen saver, time zone updates and more. Catfood Earth uses satellite imagery and a variety of data feeds to render jaw-dropping live desktop wallpaper.
Catfood PdfScan 1.10 saves your selected paper size and feeder choices. There is also an option to keep PdfScan open after saving a scan, something that had been bugging me when slogging through large digitization projects. PdfScan is a free tool for scanning stuff into a PDF file.
Catfood Weather 2.00 includes weather alerts and an updated UI. Catfood Weather provides a free, taskbar based weather forecast for US locations.
I’ve just moved ITHCWY comments over to Disqus. BlogEngine.NET now supports Disqus out of the box, but doesn’t export comments to anything that Disqus is willing to eat. I’ve knocked up a quick converter that takes a full BlogML export from BlogEngine.NET (and at least in theory any other source of BlogML) and converts the comments to WXR. You can import the WXR file under the Generic option in Disqus.
The tool is a Windows console application that takes two parameters, the BlogML import file and the WXR output, i.e.:
BlogMLtoDisqus.exe C:\BlogML.xml C:\ForDisqus.wxr
It isn’t fancy and there is no error checking so it will either work or die horribly. If the latter, leave a comment and I’ll try to fix it for you.
Here are two scenarios where merged ResourceDictionary objects are the way forward.
I’m working on a WPF project that needs to be single instance. Heaven forbid that the WPF team should pollute the purity of their framework with support for this kind of thing (or NotifyIcon support but that’s another story) so I’m using the code recommended by Arik Poznanski: WPF Single Instance Application. I like this because it both enforces a single instance and provides an interface that reports the command line passed to any attempt to launch another instance.
An issue with using this code is that you need to write a Main function and so App.xaml is set to Page instead of Application Definition. Once you’ve done this the program works fine but the Visual Studio designer fails to load resources in UserControls (and in Windows containing those UserControls).
The fix is to factor all of the application level resources out into a separate ResourceDictionary (i.e. MergedResources.xaml). Once you’ve done this merge the new ResourceDictionary into App.xaml as follows:
Next, in each Window or UserControl reference the same ResourceDictionary:
The designer will now be able to find the correct resources for each UserControl and Window.
The second scenario is factoring resources and other Xaml into a DLL. To pull resources in from a referenced assembly you just need to use a Pack Uri when merging in the remote ResourceDictionary:
If you’re putting Windows and UserControls in the DLL use exactly the same approach to reference the resources using ResourceDictionary.MergedDictionaries and you’ll get designer support for these as well.