Mad Props!

Omniscience is just a Google-search away.

Login

You're reading Mabsterama, the weblog of Matt Hamilton. Enjoy your stay.

Million Dollar Destiny

From Alex Barnett's blog comes this fascinating idea: Remi Frazier's Million Dollar Destiny.

Remi Frazier has left Colorado with $100, and travelled to New York, where he intends to make $1,000,000 in 30 days.

He's maintaining a daily video diary on youtube. He's understandably vague about his "business proposal" ... but I'll keep watching just to see how it turns out.

AWDNUG Meeting #2

Here I am fresh back from the second meeting of the Albury/Wodonga Dot Net User Group!

As I described in my previous post, this month's meeting was focused on content-management systems on which we will be running our web site (awdnug.org, coming soon).

In attendance were (if I recall correctly) seven people, which is not an increase on last month's figure. However, three people from last month's meeting were unable to attend, and we had three new people this month, so things look promising in that respect.

After both presentations, we kind of came to a non-decision of making an attempt at running both Community Server and DotNetNuke concurrently. Since both systems prepend their database objects with a custom string (cs_ and dnn_ respectively), the two should live in harmony on the one database and domain.

Even more interesting, both systems make use of the ASP.NET Membership Provider, so there's a chance that the site could maintain a single membership roster across both CMSes.

Right now I'm of the belief that CS will provide 99% of what the site requires. DNN has some interesting features (payment systems and some integration with PayPal piqued our interest), but in reality I believe we'll get by on pure CS for the foreseeable future.

Our next meeting will be on the 12th of July, and at this stage it looks like we'll be changing venues. More on that as news comes to hand. Rumours abound that we might be getting some high-profile support for our group, too, which is really exciting.

Once the group's web site is operational I'll post my presentation for y'all to see. It's a modest slide deck, so don't raise your expectations too high. Save those high expectations for the inevitable Comicster presentation. ;-)

So ... .NET developers (and developers in general) from the Albury/Wodonga region: See you next month!

AWDNUG Meeting Reminder

In many ways that month went quickly, but then it seems like ages since our first meeting. Anyway, don't forget that tomorrow is the second meeting for the Albury/Wodonga Dot Net User Group.

As mentioned previously, I'll be giving a quick talk about Community Server, whilst fellow member Mick C will be talking about DotNetNuke. May the best ASP.NET content-delivery system win.

So join us at the Commercial Club's Committee Room at 7:30pm Wednesday night!

Long Weekend Movie Round-Up

A quick summary of our movie-going activities this weekend:

The Omen: Quite good. Better than I thought it'd be. Having not seen the original, I wasn't comparing it as some movie-reviewers have, so maybe that helped. Man, that little kid was freaky. Good to see David Thewlis in a big (well, reasonably big) role again. I like him.

Cars: Pixar Perfect. Really enjoyed this one, despite the five-year-old girl sitting on her dad's lap in the seat to my right who, about two-thirds of the way through the film, decided she'd had enough, and spent the remainder asking her dad whether it was over and they could leave. Keep watching during the credits (of course)!

Also wanted to give a nod to Deadwood, which we've been watching on DVD (loaned to me by Crucible) for the last few days. This is really great character-driven western drama. Definitely worth a look provided you're not offended by ... well, anything.

UI Standards ... Endangered Species?

There's a (kind of old, now) post over on the excellent Flow|State blog about Windows Media Player 11 and the new "AERO" style user interface.

If you read through the comments, not everyone thinks WMP11 is as slick and good-looking as I do. That's fine - everyone's entitled to their opinions.

Towards the bottom of the comments, though, the topic of UI standards comes up. A commenter points at IE7, Office 2007 and WMP11 as all having different interfaces. Curiously, another poster agrees with him, saying that IE6, Office 2003 and WMP10 had a common "standard" UI theme. I don't agree with this at all - those three products have a distinctly different look-and-feel from each other.

Anyway, the point of this post is to speculate on the impending death of the "standard UI". Could it be that, come Vista, there will be no such thing as a standard menu bar, toolbar, status bar etc? Windows Presentation Foundation looks like it's going to open up a whole world of new UI styles to developers (for better or worse).

I ask you though ... is the extinction of the standard UI a bad thing? Compare the idea to the real world: My DVD player doesn't look anything like my toaster. My clock radio doesn't have a remote control like my TV. Do applications on a PC need a standard UI any more than real-world devices? Provided the individual controls (buttons, checkboxes etc) are recognisable, maybe it's no big deal if the apps all look unique.

Perhaps it's time we started taking the "right tool for the job" approach to UI design, rather than worrying about whether the "File|Exit" menu item has an accelerator key on the "x".

Who's In Your League?

Ah, this is cool. With the imminent release of the third volume of The League of Extraordinary Gentlemen, Blogger Bully has started a meme. Who would you cast in your modern-day League?

As he states in his post: It's unfair to cast super-heroes etc. Base your league off "non-superhero" literature and try to stick to the character archetypes he outlines.

I'm gonna give it a go, with a sci-fi twist. Let's assume it's some kind of time-travel story, 'coz I'm not going to go to the trouble of finding contemporaries in stories that span tens of thousands of years:

The Leader. Who better to lead than the machiavellian Pham Nuwen from Vinge's A Fire Upon the Deep and A Deepness in the Sky? He has so many tricks up his sleeve it's just not fair on the bad guys, and he thinks on so many levels that no-one would have any clue as to his endgame.

The Rogue. Someone the group doesn't totally trust, but can't do without. Someone who doesn't take everything as seriously as they should, but can be a useful source of information. Y'know, I think I'd have to go with Ford Prefect.

The Muscle. Oh yeah ... such a wealth of characters to choose from here. Let's see ... we already have Pham and Ford ... who would sit nicely in the middle? Oh yeah - Batou from Ghost In The Shell. He'd get along just fine with those guys. Not.

The Woman of Mystery. A staple of the League. A lot of female characters to choose from in sci-fi, but to have that mysterious edge ... hmmm ... y'know, it'd be a shame not to go with Teela Brown from Larry Niven's Ringworld series. She was bred for luck, so it'd be just her luck she'd end up on this team.

The Guy with a Boat. The team's gotta get around somehow. I can interpret "boat" a slightly different way since I'm going with a sci-fi theme. In fact, I believe I can interpret "guy" slightly differently too. How about we have the league travel using The Way, aboard Thistledown from Greg Bear's Eon, Eternity and Legacy? Oh, what the heck, let's leave Olmy there to direct 'em. They can look for universes with different values for pi.

So there you go: My sci-fi, universe-spanning League of Extraordinary Gentlemen. Pham Nuwen, Ford Prefect, Batou, Teela Brown and Olmy/Thistledown.

One thing Bully forgot to mention: Every League has an enigmatic behind-the-scenes guy pulling the strings. It'd be a shame not to use Heinlein's Lazarus Long for some reason (and I'd really love to see how he interacts with Pham), so let's shoehorn him into this position.

 

Office 2007 and Acrobat

Don't know how many of you have seen this.

Microsoft stated a while back that Office 2007 would have native support for Adobe Acrobat (PDF) files. That is, you could select "File|Save As" in Word, and save your document directly to PDF.

Well, despite the fact that Apple and OpenOffice both have this functionality, Adobe have decided to sue Microsoft over this decision and disallow them including Save as PDF as a feature in Office 2007.

Good work Adobe, you tools. Talk about fairness in the market!

Read all about it on Brian Jones's blog. He's one of the main guys behind the open XML formats in Office 2007.

Detail Level in Objects Returned by a Service

On the drive home tonight I listened to this episode of Ron Jacobs' ARCast. In it, he talked with Denny Boynton about SOA, and some of the best- and worst-practices ("patterns and anti-patterns") associated with creating services.

One of the topics that came up is something I've thought a lot about in the past - how to tell the service what kind of details you want in the objects you're requesting.

For example, let's say you're calling off to a service to retrieve a list of customers. What do you need in that list? Obviously each customer should have a name; possibly an address; but do you really need their list of contacts, or outstanding invoices? If you're expecting to get a list containing 1000 customers, then no - you only want the bare-minimum of details back.

Ron suggested that in the real, "on-paper", world, you'd probably submit a "customer list request" form, and that form would have a series of checkboxes letting you specify the details you need. If you translate that idea to code, I guess you could define an enum which has a value for each property in your Customer class:

[Flags] 
public enum CustomerProperties { Name, Address, Contacts, Invoices } 

So now you could pass that to the service and it could populate the list of Customer objects accordingly.

This, to me, seems a bit too tightly-coupled. I was thinking about a way you could do this so that the calling program didn't have to worry too much about individual properties.

The idea I've come up with is a way to specify a "detail level" using custom attributes.

First, we define a new DetailLevelAttribute class:

[AttributeUsage(AttributeTargets.Property, AllowMultiple=false)] 
class DetailLevelAttribute : Attribute 
{ 
    int level = 0; 

    public DetailLevelAttribute(int level) 
    { 
        this.level = level; 
    } 

    public int Level 
    { 
        get { return level; } 
    } 
} 

Now we can apply that attribute to all the properties in our class:

class Customer 
{ 
    [DetailLevel(0)] 
    public string Name 
    { 
        get; set; 
    } 

    [DetailLevel(0)] 
    public string Address 
    { 
        get; set; 
    } 

    [DetailLevel(1)]
    public List<Invoice> Invoices { get { return _invoices; } } 
} 

Ok! So now we have a Customer class whose properties are each decorated with a DetailLevel attribute. Our service, then, can accept a "requiredDetailLevel" parameter, and using reflection, decide whether the property needs to be populated before returning the customer:

int requiredDetailLevel = 1;
Type custType = typeof(Customer); 
Customer cust = new Customer(); 
if (IsPropertyRequired(custType, "Name", requiredDetailLevel)) 
{ 
    // populate cust.Name 
} 

if (IsPropertyRequired(custType, "Address", requiredDetailLevel)) 
{ 
    // populate cust.Address 
} 

if (IsPropertyRequired(custType, "Invoices", requiredDetailLevel)) 
{ 
    // populate cust.Invoices 
} 

... which just leaves us to define the "IsPropertyRequired" method:

bool IsPropertyRequired(Type type, string propName, int maxDetail) 
{ 
    Type dlaType = typeof(DetailLevelAttribute); 

    System.Reflection.PropertyInfo prop = type.GetProperty(propName); 
    if (prop == null) 
    { 
        // Property not found. Maybe raise an exception. 
        return false; 
    } 

    object[] attrs = prop.GetCustomAttributes(dlaType, false); 
    if (attrs.Length == 0) 
    { 
        // Not decorated with DetailLevelAttribute. Assume required. 
        return true; 
    } 

    DetailLevelAttribute dla = attrs[0] as DetailLevelAttribute; 
    if (dla == null) 
    { 
        // Something's gone bananas. Maybe Assert. 
        return true; 
    } 

    return dla.Level <= maxDetail; 
} 

So now our service has a way to determine whether a property needs to be filled out, and it doesn't need to know too much about the object itself. The developer who designs the objects gets to specify which bits belong to which "detail level" using attributes.

Could this work? I dunno. But I thought it was worth documenting - let me know your thoughts!

80s Rock

Kingdom Come - In Your FaceFor some reason my old copy of Kingdom Come's "In Your Face" was in my car, so I listened to it on the drive home tonight.

It's amazing how much of today's "garage rock" music (Jet, The Vines etc) harks back to this old 80s guitar-driven sound. I guess they both have roots in the 60s and 70s, but still ... I found myself really enjoying this CD.

So I'm gonna start digging out some of my other albums from that era. Hair Metal rises again, man! Yeah!

Mobile Client Software Factory

Fellow chrome-domed down-under .NET developer Dave Glover announces the latest release of the "Mobile Client Software Factory" on GotDotNet.

This sounds interesting ... how about a webcast series similar to Don's, Dave?