.NET doesn’t support rebooting, logging off or shutting down your computer though a managed API. Searching for the best way to do this brings up three options: WMI, shutdown.exe and ExitWindowsEx.
I regard WMI as the last resort of the desperate. Weakly typed magic string juju.
Calling Process.Start(“shutdown.exe /r /t 0”) might work, but how would you know? And you’ve got the overheard of starting a new process just to accomplish a reboot. Lazy.
The best way to reboot is P/Invoke to ExitWindowsEx. Unfortunately there’s some really awful sample code out there which will either fail to do anything or mask any errors. I’ve included a drop-in class below that fixes these problems.
If you read all the way through the documentation for ExitWindowsEx you’ll find this:
To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information, see Running with Special Privileges.
So just calling ExitWindowsEx won’t do anything. The sample code below adjusts the process token and then reboots (change the flags passed to ExitWindowsEx to shutdown instead, or to pass in a different reason). You’ll also get a Win32Exception if a failure occurs. Catch this, and you can tell the user that they need to reboot manually.
Packing for Mars: The Curious Science of Life in the Void by Mary Roach
It's Mary Roach, so no surprise that her book on space focused on how hard it is to take a crap (in space), how much engineering goes into disposing of crap (in space), and practical uses for crap on a Mars mission (including making it into radiation shielding tiles and reprocessing it into crap burgers). You'd think this book would be NASA's worst nightmare, but it's actually humanizing as well as fascinating. If you're a Roach fan you'll love it. If you haven't had the pleasure then this is a great place to start.
The Lion by Nelson DeMille
This sequel to The Lion's Game is disappointingly flat - Corey and Assad are fated to meet for a final confrontation and they do but after an initial sky diving sequence nothing really happens. There's very little tension, no plot, no struggles or setbacks for the hero or villain. DeMille really phoned this one in.
The Girl Who Kicked the Hornet's Nest (Millennium, #3) by Stieg Larsson
The second and third books could be just one (very) long book. Nest kicks off where Fire ended and slows the tempo down a bit, although not to the glacial pace of Tattoo. It's a fitting ending to the tale of Salandar, if a bit drawn out in the final sequence. Of course, a must read if you've ploughed through the first two.
In 1790 Thomas Jefferson became the first patent examiner and issued a grand total of three patents. 220 years later the US Patent Office has a backlog of over 1.2 million applications. Internet and software industries are created and destroyed in the time it takes the average patent to issue.
Here's how a startup can easily turn to the dark side:
Investors pressure a startup to file patents in an attempt to make the business defensible.
Tens of thousands of dollars of billable hours result in ‘System and method for displaying a text based colloquial greeting to the populace of a planetary body’.
Startup fails but notices that other companies have implemented their ‘Hello, World’ IP and a patent troll is born.
Software patents are especially frustrating as it's the idea — usually the easiest part of the business — that gets patented. Because patent law doesn't require actual implementation, let alone success, it's as if you could patent “cancer drug” and then sue pharmaceutical companies each time a new treatment rolled out.
It's tempting to call for an outright ban on software patents, as Vivek Wadhwa did recently. This doesn't work because so much technology is software based and because somewhere in that 1.2 million backlog there probably are a few genuinely novel ideas.
The first part of the fix is to stop examining the patents at all.
This may sound crazy, but think about copyright. You don't need to pay a bunch of lawyers to represent you before the copyright office and prove that this really is the first time a particular novel has been written, or that you were in fact holding the camera when you snapped that photo. Copyright is automatic.
A patentable invention isn't a specific work of art and so some registration system is required. My suggestion is that you upload a PDF and pay a registration fee of around $1,000. It's small enough not to discourage startups and large enough to prevent abuse. USPTO would timestamp the PDF, store it for eighteen months and then publish it.
The obvious flaw would seem to be opening the floodgates to even more patent trolls. That's where the second part of the fix comes in — shift the burden of proof of validity to the company that owns the patent. You can still sue, but the first step is a rigorous and expensive exam process.
This system makes it easy to obtain a patent but changes the nature of the patent to an insurance policy in case your idea really is as clever as you think it is. It also makes it much harder to use a patent offensively. Resources are more efficiently used to evaluate the novelty of a patent when it is enforced, rather than to do the impossible task of evaluating millions of ideas that never will be.
Full disclosure: I'm co-inventor of several software patents that I hope will never be used against you. I also recently lost a product (Cucku Backup) as a result of settling a patent infringement lawsuit and I hope that never happens to you either!
AT&T's MicroCell extends their famously inept network into your home or office. It does a tragically good job — you can use your broadband connection to not make calls rather than not making calls through an AT&T tower.
It's actually worse, because at least on the actual network you know when your signal sucks. With the MicroCell my phone shows five bars but will often refuse to make or receive a call. The first clue is often leaving the coverage of the device and finding out what you've missed. In fact, I think it might even be illegal under the Communications Act of 1934 as it's effectively a jammer.
Even if I can make a voice call the wretched thing screws up geolocation. In order to comply with E911 the device is registered to a specific address AND requires a GPS lock to function at all. Despite this it tells my phone that it's in Berkeley. Switch the MicroCell off and I instantly get the correct location in San Francisco. Switch it on and I'm teleported to Telegraph Avenue. My Google Latitude history has whiplash every time I leave the house.
Reading the AT&T forums I'm lucky. Other users are located in the wrong state, and have choppy voice when they can make a call at all.
Returns to the characters of Less Than Zero twenty five years later. I don't think it's a plot spoiler to say that they're not happy and well adjusted people. I found Glamorama to be pretty tedious and Lunar Park only marginally better. It was a huge relief that Imperial Bedrooms just flows. It's a welcome return to his earlier narrative style. Dread and paranoia are visceral presences from the start and then layers of fear and horror build until it can't get any worse and then somehow does. Brilliant.
Blue Ocean Strategy: How to Create Uncontested Market Space and Make Competition Irrelevant by W. Chan Kim
Given its pedigree it's missing two segments - the yellow ocean (no competition, no customers) and the purple ocean (high competition, no customers). They must be saving those for a sequel. I read this because a few people had recommended it and if you think the ideal market to play in is one with no differentiation and high competition then it's a must read. Otherwise the only real value is being conversant with the buzz word. Evaluating past successes with 20/20 hindsight and talking about their 'blue ocean strategy' is a classic business book selection bias. If you learn anything from the case studies it should be that breakout innovation doesn't come from your ocean, hedgehog principle or current cheese location.
61 Hours (Jack Reacher Series, #14) by Lee Child
Well constructed if average plot. This is the Empire Strikes Back of Reacher novels and ends on a bit of a cliffhanger - the next in the series is out later this year and hopefully picks up the pace a bit.
Professional C# 4 and .NET 4 by Christian Nagel
I own the 2005 and 2008 flavors of this book as well. It's the best overall C# reference I've found and this 2010 version is a welcome update. As with the 2008 book it could use a better guide to new features, but still very highly recommended.
Ina May's Guide to Childbirth by Ina May Gaskin
It's a somewhat troublesome mix of advice and propaganda. The advice seems mostly solid, practical and grounded in a great deal of experience. The book ends with the most important - don't think that your body is a lemon, pregnancy isn't a disease, you can do it. Ina May's statistics from "The Farm" are compelling as well, but the birth stories are a bit far out. They typically sound like: 'Sunflower, hanging from the birthing gallows while member of the Farm suck her nipples and I bring her to repeated orgasm, didn't even notice that her baby had been born'. For most people there's probably a middle ground between technocratic doctors and hippie midwives. When the book veers into propaganda it seems there's no anecdotal story too weird to make the case for natural childbirth and no study rigorous enough to suggest that there might be nothing to this modern medicine fad. Some suggestions - like that obstetricians don't believe that nutrition has a role in healthy pregnancy - are just so ridiculous that they case doubt on the rest of the book. And yet, her statistics are so very good while US hospitals force you into a caesarean section to prevent lawsuits and not miss happy hour. I guess the only conclusion to reach is to give birth in The Netherlands and then move to Sweden to take advantage of their twenty year maternity leave...
The video below shows twenty-four hours from noon UTC to noon UTC on June 7, 2010 using webcams from the Catfood WebCamSaver database. It proves that I really will do anything to avoid finishing off the new Catfood web site.
You can probably figure out that the three blocks of cams are the US, Europe and Japan. The position doesn't reflect the latitude in this version, it's just a random selection of cams for the timezones represented in the database. As it's July and most of the cams are in the northern hemisphere you'll see long days and short nights. I'll try to remember to create an updated version around the autumnal equinox.
The program that generated the frames ended up being simpler than i thought. Because it's fetching images from a lot of different sources I had a timer creating and then saving a frame once a minute and lots of worker threads fetching the images. Each worker thread is assigned a frame number and once it's got the image it locks the main frame and tries to paints it's own area. If the frame number has moved on the image is abandoned. You can see some of the cams flickering on and off in the video — these went down while the frames were rendering or just took longer than a minute to respond.
A barely reheated Glamorama (celebrities and brands in bold face) about star-fucking in the form of a movie script. Enough Palahniukisms to make it worth finishing (for me), but only because it was mercifully short.
Here's a frustrating WPF scenario — you use the ApplicationCommands class to add Cut, Copy and Paste commands to toolbar and then put a TextBox on another toolbar. Click in the TextBox and the commands remain disabled. WTF, WPF?
The problem is with focus scopes. Your window is a focus scope and so are any menus or toolbars. This has the desirable property of allowing commands to target the control you were in immediately before invoking the command. You want paste to target the text box you're editing, not the menu item or button you clicked to request the paste.
So far so good. The problem is that the commanding system isn't smart enough to target the control with keyboard focus if it's in a nested focus scope. Remember that the window itself is a focus scope so our TextBox in a ToolBar (also a focus scope) is nested and immune to commands from our menu or toolbar.
Here's a simple window that demonstrates the problem:
Ignore the PreviewCanExecute handler for now. If you run this window and click in the main TextBox the paste button and menu item are enabled. Click in the toolbar TextBox and pasting isn't an option. Well, Ctrl-V still works and there's a context menu but you know what I mean.
The problem can be fixed by adding a command binding for ApplicationCommands.Paste and handling the PreviewCanExecute event:
When the window loads we're making note of the focus scopes for the toolbar and menu. Then when PreviewCanExecute fires we check to see if the element with the keyboard focus is in a different focus scope (and also that the window doesn't have keyboard focus). We then set the CommandTarget for the menu item and button to the element that has keyboard focus.
A handler isn't required for CanExecute as the command will take care of this with respect to the new CommandTarget.
Run the window again and you'll see that the paste button is enabled for both of the TextBox controls. When you click the button (or menu item) our PreviewCanExecute handler ignores the new keyboard focus and the command is sent to the desired control.
One drawback of this approach is that keyboard focus isn't returned to the TextBox after the command executes. The CommandTarget remains in place so you can keep pasting and the command remains enabled but you lose the visual cue that lets you know where the target is. I haven't figured out a clean approach to this yet. When I do, I'll update this post. Better yet, if you've figured it out leave a comment.
I'm slowly converting a number of blogs from Blogger to BlogEngine.NET. The least fun part is dealing with the Blogger export file. For this blog I used a Powershell script but had problems with comments not exporting correctly and it was quite painful to fix everything up. Blogger allows you to export a copy of your blog using ATOM, however BlogEngine.NET (and other tools) speak BlogML.
I've just released a command line tool that takes the ATOM format Blogger export and converts it to BlogML. You can download Blogger2BlogML from GitHub. The tool uses .NET 4.0 (client profile) so you'll need to install this if you don't already have it. If you give Blogger2BlogML a try let me know how you get on.
I've just released a small update for my ESRI Shapefile Reader project on GitHub. The only change is a patch from SolutionMania that fixes a problem when the shapefile name is also a reserved name in the metadata database. The patch escapes the name preventing an exception from being thrown.
Catfood.Shapefile.dll is a .NET 2.0 forward only parser for reading an ESRI Shapefile. Download 1.20 from GitHub.