Monday, 2 November 2009

Highly Polished Software

Slippery surface
No, not what you think...

Is it just me that dreads finding that the office cleaners have come around? Re-attaching jostled cables and re-adjusting monitor heights is one (annoying) thing - but how much polish does a desk really need? I can barely touch my laptop without it sliding over the desk - so you can imagine what my "freak keyboard" is like.

Coffee spill
Looks like I'm going to have to spill copious amounts of coffee just to make the desk usable again. Sigh.

Tuesday, 20 October 2009

Express 2010; Basic and Expert Settings

Or: “Where has Start Without Debugging gone?”

I'm a fan of C# Express; it is great tool for quick/scratch code, and if you find my machine without at least one Express window in the task-bar, then it must be Patch Tuesday.

It looks like the Express editions of 2010 have different menu configurations for basic and advanced users:

Tools/Settings/{Basic|Expert} Settings

This makes a lot of sense, but caught me off guard - especially since many of the key chords work in both modes.

I won’t attempt to list all the differences; but if you can’t find your menu items… try switching to Expert mode.

Lots of 2010 Shiny, and me feeling stupid

Lots of changes are underway:

And because you'll want somewhere to play with beta 2:

In particular, beta 2 now includes the “Express” line-up, and TFS now supports installation on client OS and has a simplified install; maybe getting a CI server (on just the Microsoft stack) will soon be practical for the individual / small team.

Feeling stupid – moving files between guest and host

I’ve downloaded the new VS2010 line-up – onto my host OS; obviously, this is beta software with the potential for mayhem (or more likely: not be 100% uninstallable), so I want to install it on the guest. In case you haven’t tried Windows Virtual PC yet (perhaps you haven’t got Windows 7 yet), then note that it loses the Microsoft Virtual PC feature to drag files between host and guest. And my guest can only really see http (no local network). So how to get the files there?

I sat there looking silly… USB was an option (Windows Virtual PC can grab USB devices), but seemed overkill. It turns out that the answer is blindingly obvious. So obvious that it didn’t even occur to me to try it. Copy… Paste. D’oh! (this does need the integration features enabled, but that isn’t a problem).

So there you go; I’ll admit to being a muppet, and hopefully it’ll save somebody a few minutes wondering.

Sunday, 18 October 2009

Anonymous Type Tricks - a clarification

The other day, I posted about using anonymous types to pass multiple pieces of state into a method - reminder:

byte[] resp = client.Post(destUri, new {
id = 100021,
dob = DateTime.Today,
caption = "Hello world"
});
About the same time Ayende Rahien posted about a related but different use in Entity Framework - example:

.Case(
e => new {
manager = e.Manager.Id
thisIsADiscriminator = “E”
}
)

There is an important distinction between the two; in the first example, the property names (in the anonymous type) are only relevant to the caller. In the second (EF), the names are relevant to the callee. This is a huge difference. I don't know enough about EF to say more, but just a note: if you are doing something like this for your own types, please use a named property object to pass expected state into a method. Think of the kittens.

Novel uses of anonymous type initializers

On a related note; there was an interesting stackoverflow question today that shows another use of the anonymous type syntax - for specifying multiple members in a type-safe way:

IncludeProperties<IUser>(u => new {
u.ID, u.LogOnName, u.HashedPassword });

The important thing to note is that the above is an Expression (not a delegate), and the code inside tears the Expression apart to find the properties that we are interested in. It never actually invokes the code as a delegate, nor does it ever actually instantiate the anonymous type. It might just be me, but I thought that was quite cute ;-p

Tuesday, 13 October 2009

Go! Dynamic

.NET 4.0 is looming (lurching?) ever-closer, and one of the many interesting developments in this release is the mainstream DLR. I’ve been trying very hard to find time to get into this, but I’ve failed horribly – every time I get some spare time, something comes up. Fortunate, then, that there are plenty of code-geeks around.

In particular, I urge you to have a look at Michael Foord’s recent articles; in particular Python for .NET Programmers (but a few more here). Rest assured that there is also plenty more in both “IronPython in Action” (from the IronPython side), and books like (not yet complete) “C# in Depth, Second Edition”  (from the C# consumer side of “dynamic” – lets face it, I’m primarily a C# developer).

I’m sure that Michael could suggest a hundred other uses, but I’ve got some configuration script scenarios in mind that I really need to find time to investigate.

Friday, 9 October 2009

Pass data simply; learning from jQuery and ASP.NET MVC

One of the really nice things that is common to both jQuery and ASP.NET MVC is how it passed multiple values around. They both avoid the complexity of things like dictionaries (or alternatively forcing specific types) by letting the caller use ad-hoc objects; by which I mean either a jQuery “post” method like:

    $.post("test.php", { name: "John", time: "2pm" } );

Or an ASP.NET MVC ActionLink of the kind:

    <%= Html.ActionLink(category.CategoryName,
new { action="List", id = category.CategoryName})%>

In both cases, we are passing caller-specific data (not callee-specific data, so optional / named parameters wouldn’t help), but without the pain that we might have used in the past. Of course, we could also pass it one of our domain entities, and as long as the names all matched up, it wouldn’t care. Which is nice.

I’m going to concentrate on the second of these mainly – this is a hugely versatile tool; and while it shouldn’t be used for every job, it sure is handy. Here’s an example of using the same approach for a more readable Format syntax:

    string s = Format("You are {age} years old and your last name is {name}",
new {age = 18, name = "Foo"});

There are a myriad of opportunities for this type of use. My main aim here is just to show some of the possibilities – and let your collective imaginations run wild. For example, to bring the jQuery “post” approach into regular C#:

    using (WebClient client = new WebClient())
{
byte[] resp = client.Post(destUri, new {
id = 100021,
dob = DateTime.Today,
caption = "Hello world"
});
string html = client.Encoding.GetString(resp);
}

With supporting code:

    public static class WebClientExtensions
{
public static byte[] Post(this WebClient client,
string address, object values)
{
if (client == null)
throw new ArgumentNullException("client");
if (values == null)
throw new ArgumentNullException("values");

NameValueCollection valueLookup =
new NameValueCollection();
foreach (PropertyDescriptor prop in
TypeDescriptor.GetProperties(values))
{
object val = prop.GetValue(values);
string sVal = prop.Converter
.ConvertToInvariantString(val);
valueLookup.Add(prop.Name, sVal);
}
return client.UploadValues(address,
WebRequestMethods.Http.Post, valueLookup);
}
}

Sure, this is just a basic example and there are lots of things I could do to provide more flexibility, but it shows the key points.

Thursday, 24 September 2009

Numeric keypads; what is the point?

As I hinted the other day, I've recently had some stress/RSI symptoms in my arm. Nothing too serious, just definitely worth fixing ASAP. I'm by no means crippled with RSI or anything, but I am on a mini-crusade for programmer-health, and want to help others avoid unnecessary stress / irritation.

I had a very productive session with a physiotherapist today, who made some really constructive and pragmatic points (for example, demonstrating quite simply and clearly that the curve on my corner-desk points the wrong way, and simply swapping to a mirrored desk could help hugely).

But one startling point she made while observing me; as a programmer, I move frequently between the keyboard (in my case a decent ergonomic split jobbie) and the mouse (now a shiny new "vertical" model) - code a few lines, use the mouse to click a few buttons, test a few things via the UI - rinse, repeat.

Sure, I use the keyboard shortcuts, but I would struggle to remember the hundreds of magic key-presses and "chords" that drive Visual Studio.

Very rarely do I use the numeric keypad. Heck, I also use a laptop, and the only time I find myself looking for Num Lock is when my password inexplicably doesn't work. Yet every time I move between keys and mouse I have to travel this pointless distance.

Lets not do that

Numeric keypads; absolutely useless. Underused, oversized, badly placed, and they don't agree with 'phones on which way the numbers should go.


Goldtouch Keyboard

She gave me a tip to simply try a keyboard without one, letting me have the mouse much closer. You can pick up a "Goldtouch" ergonomic keyboard (sans keypad) for about GBP25 at Amazon. This is so simple and so obvious that I'm just stunned that people insist on still including it, even on "ergonomic" keyboards. If it is so ergonomic, why is it causing unnecessary travel?!?!


USB Numeric Keypad
If you want a keypad (and I do find them handy occasionally), then buy a USB keypad (like they sell for laptops) - roughly GBP10, and that is for the models that double as a handy USB hub. If you're right-handed, stick it on the left, or on the far side of the mouse - whichever you prefer and find most comfortable. Plus you can move it to either side if a "sinister" shows up at your desk.

Join the revolt! I invite you to ditch (or move) your keypad today!