Wednesday, November 17, 2010

Fun at the dentist

Against my better judgment I told my dentist today that I have a tooth that hurts if I chomp down on something crunchy like hard candy; her reaction to that is to have me bite down on a hard, plastic dental tool thing, which of course hurts like a mother. Is that to see if I am lying?

Just to make doubly sure she targeted the problem tooth a second time, sort of like on those personality profile tests where you get the same question multiple times to see if you contradict yourself. Yep, still hurts when I do that!

Thursday, November 11, 2010

Arduino vs. Netduino, or How Netduino totally misses the point

I am a developer both professionally and as a hobbyist; I can't get enough of the stuff. One of the things I really like to do after a hard day of slinging code that, if I'm honest, is just slightly less than sexy, is cobble together some real-life hardware components, and then write the code to make them do cool things like read light values, power motors, and make noise with synthesizers. It's a nice change to do hands-on work and I find it enjoyable and relaxing. In other words, I write business apps by day, so I like to play hardware at night.

The hardware I am speaking of is Arduino, an open source hardware and software platform that has tons of libraries, users, and documentation. The development environment is intentionally limiting, and when compared to something like Visual Studio .NET where I do my day-to-day work, it is refreshing in its simplicity. It is actually not very good at all when compared with VS.NET, but it's not meant to be anywhere near the same thing. In its favor is the fact that I am able to use it from any computer in the house, even though that means multiple versions of Windows, a couple of Linux machines, and even a Mac mini.

But, many times over the past couple of years that I have been tinkering with Arduino I found myself wishing that I could write code in the language that dominates most of the work I do: C#. Arduino uses C++, which is at least a familiar syntax, but when you've been used to working with C# and the .NET framework, it's a bit of a pain to go back to the bad old days of C/C++.

So, a little while back I started hearing about Netduino, which is like Arduino in terms of being an open source hardware/software platform, but which uses C# and .NET as its development environment and framework instead of C/C++. Very recently I decided to check it out, thinking that this must be a marriage made in heaven: my favorite development environment combined with really cool hardware hacking; what could be better?

Well, here's the rub: Netduino totally misses the point of Arduino. The hardware is open source, sure, but who in their right mind is going to brave soldering surface-mount 100 pin chips (the Netduino processors)? Who really wants an ARM chip for a microcontroller, even if it would be cool to have built-in USB, LAN, and all the other stuff that the Netduino chips have? The whole point, to me, is simplicity, and the fact that even with my earthquake-shaky hands I still can manage to solder a simple 28-pin chip to a prototype board. Sure, the thing has hardly any memory at all, and no built in USB or LAN, but that's what gives it its charm: I can make really fun little learning projects with blinky LEDs and inputs that read analog potentiometers, and I don't expect it to have more technology in it than a damn cell phone.

I downloaded, but have not yet installed, the Netduino development kit, so I still have hope that I can ditch the fancy ARM chip and use the trusty old Atmega168, but I am expecting to be disappointed.

Here's hoping that I am wrong.

Wednesday, May 12, 2010

Lego store augmented reality display

Saw the coolest thing the other day at a Lego store: they have a video display with a video camera where you hold up a product box for one of the toy kits they sell, and the camera figures out which kit it is and then displays a 3D, animated sequence that appears on the display to be *on* the box you are holding in your hands.

Lego Store Augmented Reality Display

You can change the position of the box to see the display from various sides and angles, which is very cool.

I was curious to know whether there was some sort of RFID magic going on for the initial image recognition, so I took a picture with my iPhone and then held up the resulting image to the Lego display's video camera to see if the software still would recognize the Lego kit package and run the animation. I was impressed to see that not only did it work, but it was scaled down in size relative to the size of the image on the iPhone's display! The shiny finish of the iPhone display would reflect the bright store lights into the display's camera at certain angles and overpower it, killing the animation, but still, that was pretty cool.

Wednesday, April 21, 2010

Unintentional (I hope) humor in pithy church sign message 'o the day

There's a church I pass on the way to work each day that has one of those sliding-letter message boards with a trite saying on it that is meant to convey some humorous, God-related wisdom that always makes me smile.

Today's sign reads:
download your worries
get online with god

Shouldn't that be "upload" your worries?

Awesome circuit diagram at XKCD

Wednesday, March 10, 2010

Cool Nissan 370Z video

Here's a cool video if you are into cars at all, or into the Nissan 370Z in particular: http://www.youtube.com/watch?v=Qro3VLv4xOU

There are some cool see-through views of the engine and transmission and a neat little graphical simulation of the torsional forces on the car. There's also a couple of interesting animations: one of the Variable Valve Event and Lift (VVEL) in action and one of the full engine.

Monday, February 22, 2010

Replacement iPhone

Those Apple folks are pretty cool -- my iPhone 3G had developed a crack starting at the dock connector so I took it in to one of the Apple stores in town and they said it still was under warranty and replaced it with a brand new one (3G, no free upgrade to 3GS). I had researched the problem a bit before making the appointment to take it in and found that my iPhone was not the only one with that problem, but I was a bit skeptical that it would be as easy as it sounded to get it swapped out for a new one.

Sure, it shouldn't have cracked in the first place, but they definitely made good on it in my book. I assume the warranty doesn't reset with the new hardware (although maybe that assumption is wrong) but it doesn't matter, really -- I now have a brand new device that should last well beyond the original warranty period.

If you have an iPhone, go to the Apple Service and Repair site and enter your hardware serial number to see if you are covered. Don't assume that using a protective case prevents the crack from occurring; although I don't use a case, it doesn't seem to be related to anything a case could prevent from happening. My guess is that the problem is related to repeated use of the dock connector, and everyone uses that.

UPDATE 3/8/2010: The new iPhone had a dud battery -- it seemed like about 8 hours was all it was good for even with minimal active use (e.g. sitting on the night stand overnight). I watched it one day during the day and noticed that after about 6 hours following a full charge it would be down to 25%, again with minimal use.

Over the past weekend we were in the shopping center that has the Apple store where I got the replacement, so I stopped in to see if there was any chance of getting an appointment with the Genius Bar. This was a busy Saturday at a busy location, and the concierge said she had one spot, which was an hour and ten minutes away. That actually wasn't going to be a big problem because we had just gotten there, but then she looked in the Mac queue (she had looked previously in the iPhone queue) and saw that they had a slot coming up in 25 minutes, so she gave me that one instead, a nice touch.

At the appointed time a tech ran a piece of diagnostic software on the phone that seemed like it was more for show than anything (e.g. the tech noticed it had a handful of dropped calls, which seemed significant to him, although I don't see how that has anything to do with anything relating to the battery, but hey, who am I to complain?) and deemed it a dud. He grabbed out a new one from the back, swapped the SIM and did the paperwork, and we were out of there.

I am happy to report that the battery in this latest handset is working extremely well, holding a charge for a couple of days under normal use, and once again I felt like they had done right by me, even with the hassle of having to take the replacement unit back. That's good customer service.

Friday, February 12, 2010

Aggregate extension method in LINQ

It seems that I never stop finding new reasons to love LINQ and today I've found another: the Aggregate extension method.

Here's the scenario: we have a Silverlight application with a UIElement that binds to an IEnumerable of type string where the contents of each item is an error or validation message. There are times when instead of binding to the list I just want a concatenated string of all the items in the collection with a CRLF stuck on the end of each. Just for kicks I asked my friend Nick what at the time felt like a silly "how many convoluted ways can you think of to solve this simple programming problem, and how would you do it in LINQ?" question and, being the genius that he is, he suggested using the Aggregate extension method.

I already had a passing awareness of .Aggregate() but to be honest it hadn't occurred to me that it would be useful for something other than aggregating numbers, and at any rate I found it a bit unintuitive to use initially. It turns out, of course, that the accumulator can work on a series of strings just as easily as, say, ints, and it really couldn't be much simpler.

Here's how it looks as a C# Statement in LinqPad:

string[] words = { "foo", "bar", "ski" };
words.Aggregate(string.Empty, (seed, w) => seed + "\r\n" + w).Dump();

And in the Results pane:

foo
bar
ski

Pretty slick!

Wednesday, January 20, 2010

If It's Not Information It's Just Noise

If you write code for a living, you don't have to be around very long before the subject of coding standards comes up, and it is a subject about which people tend to have very strong opinions. My own very strong opinion is that most so-called standards really are styles, and that they do not rise to the same level as standards. How many spaces you use to indent a line of code is a style (or do you use tabs?); whether your code compiles when you don't have a trailing semicolon is a standard.

Call me pedantic (you wouldn't be the first) but I think the distinction is important. When people are discussing the formatting of any given piece of code, it is easier for the proponent of a certain style (opening curly braces, for example) to get his way if he can appeal to the authority of the "standard" to support his position (reference to the logical fallacy fully intentional). Just because that person was pushy enough to get his way codified doesn't make it right, though.

Countless hours have been spent discussing, drafting, arguing about, and then conforming code to some standard or another, and that's a sad waste of time. Worse, for me anyway, is that many coding standards make code harder to read, such as requiring comments on every method, requiring regions (collapsible blocks in which code lives in a code file) around every conceivable form of code in a file and in a certain order (sometimes even where there is nothing actually *in* the blocks, or when the block already has a collapsible region with a title!), and worst of all, requiring that something like a property getter or setter take up four lines of code when it could all fit on one.

Standards that don't help your code convey something important or interesting about the code should be eliminated, at least as far as what a coder has to deal with on a day-to-day basis. If stylized code makes it easier for the source control tool to diff and merge, well, require running it through a prettifier before committing changes. Just make sure the prettifier can reverse-engineer the code back to *my* way before I have to see it!

Monday, January 11, 2010

Silverlight UIAutomation Testing -- Using WatiN to navigate to a page and White to test a Silverlight app

I had the need recently to automate testing of a Silverlight app and ran into a problem using white (could anyone have come up with a more difficult name to search on?) where white does not provide functionality to get a reference to a hyperlink in the DOM and click it in the way that, for example, WatiN does. The scenario where this came up is there is a web app with a landing page that has a link to the page hosting the Silverlight app and we need to click through the link into the Silverlight hosting page.

I briefly thought about just cribbing the functionality from WatiN and extending white's capabilities but quickly discarded that idea as too complicated and out of concern that it would become a maintenance nightmare.

The solution I came up with is to use WatiN and white together in a hybrid fashion, where WatiN spins up a browser instance and then white attaches to that browser instance using the ProcessID of the instance from WatiN. White doesn't expose an Attach method up in the InternetExplorer class where Launch lives, but it does have it down in White.Core on the Application class, so it was a simple matter to create an extension method on the InternetExplorer class to expose one that can be used in unit tests.

It goes a little like this (warning: horrible formatting):

public static class WhiteExtensions
{
// the extension method to simplify usage
public static InternetExplorerWindow Attach(
this InternetExplorer val, int processId, string title)
{
InternetExplorerFactory.Plugin();

return (InternetExplorerWindow)Application
.Attach(processId)
.GetWindow(title);
}
}

// new up a browser with WatiN
Watin.Core.IE watin = new Watin.Core.IE(url);
watin.Link(Find.ByText("foo")).Click();

// spin up white and attach to the browser that WatiN started
White.WebBrowser.InternetExplorer white = new White.WebBrowser.InternetExplorer();
white.Attach(watin.ProcessID, "browser window title");

// get the Silverlight app reference from the white browser reference
White.WebBrowser.Silverlight.SilverlightDocument sl = white.SilverlightDocument;

// do stuff
sl.Get<Button>(SearchCriteria.ByAutomationId("SomeButton")).Click();


UPDATE: screenshot of exactly how my working unit test code looks