Random Thoughts of a Scatterbrain.
 Wednesday, January 31, 2007

My Thoughts on WF

1/31/2007 8:03:25 PM (Eastern Standard Time, UTC-05:00)

As I commented in a post on Paul Andrew's blog regarding what WF is and what it is not:

As I've been working with WF these last few weeks, I've come to form another view of WF and what it means for developers: in a way, it *forces* developers away from some bad design practices since a WF itself has no GUI and no visual user interface. 

To expand on that, it forces developers who would otherwise readily hash their ASP.Net and WinForms GUI code in with the business logic to think in  a manner that separates the core business logic from the visual interface code.

The number of developers that still write monolithic projects that contain the UI and business logic is still all too high.  In studying from simplified working examples in text books, in MSDN documentation, and various articles one finds online, many developers do not gain a good understanding of how to separate the concerns of their code.

The downsides of this approach are immediately apparent after a little exposure to alternative design methods, yet for many developers, they simply don't see the light and continue to write their data access code right into the Click event of a Button.

I see WF as a way of moving developers away from this model by encouraging developers to encapsulate code in a WF program (a unit of business logic) or an activity

I would like to add to that, that in the end, WF is still "just code" (maybe my perspective is skewed after having written my own workflow engine). Don't be fooled by the drag and drop UI, the fancy terms (for example, tracking is nothing more than glorified logging that any learned developer could have easily implemented with log4net, a database appender, and a well defined logging policy), and the hype train in general.  When it comes down to it, for any significantly complex application or architecture, it still requires writing of much of the same code that you had to write before (and in some cases, you may end up writing more code to build a functionally equivalent solution) not to mention that whenever you adopt such a framework, you must learn the little nuiances and how the product architects intended for you to complete a certain task within the guidelines of the framework.

Just to share my take on it :-)

Certainly, it is no "silver bullet", as Brooks would say, but it's definitely a step in the right direction. I am quite curious as to the actual adoption rate that we will see with WF in the coming months as it offers no immediate benefit (until perhaps we see a market for custom activities much like we have today for custom controls for the UI).  To most, it simply won't offer anything compelling and to top it off, it will require additional training to implement a solution using WF.

For me, personally, it's been fun picking it apart and seeing how the minds at Microsoft implemented the same functionality I implemented in my own workflow engine that I wrote for our project at Zorch (while certainly less polished, I like to think I was heading in the same direction...and in some cases, I wish WF offered the same features as I had implemented myself (that was my ego speaking ;-))).

Sandra In The News!

1/31/2007 6:56:24 PM (Eastern Standard Time, UTC-05:00)

How could I have forgotten to post about this?

My wife was recently featured in the Home News and Tribune; not once, but twice!

To begin with, gosh, could they have used worse pictures of her?

But to be honest, it's an extremely proud moment for our entire family (my mom was really going off the walls over this).

My wife is kind of a dynamic person in this respect: you would never guess, just talking to her, that she has a fairly high level grasp of mathematics (not to mention that in person, she looks like she's 18 (especially when she goes with the curly hair)).  I was quite suprised to see some of her coursework in psychology and education which had her in classes similar to mid-high level computer science math courses (probability and statistics).

As a teacher, she's one of those increasingly rare ones that won't take any crap from the students or the parents...she's very straight up to the parents about her expectations of them and how their role in the development of their child (at least while they're in her class) is crucial to the child's success.  She has a whole crazy system in place to make parents and their kids accountable.

So if your school district is intereted in this Singapore math business, do take a look at her SDE profile ;-)

 Thursday, January 25, 2007

Utah - Day 3, 4, 5

1/25/2007 10:26:53 PM (Eastern Standard Time, UTC-05:00)

Programmathon was fairly successful. While I enjoy the freedom of working offsite, it's definitely good to get together once in a while and get face to face with everyone (although my gastrointestinal tract begs to differ).

But of course, no trip with Jim is complete without a trip to Hooters :-P

Zorch @ Hooters

Me @ Hooters

Check David's Spiffy Hat

In the Salt Lake City vicinity, the mountains are omnipresent. It's very beautiful out here (but dry as a desert (I started to bleed under my fingernails due to the dryness)).

Mountains Are Omnipresent.

Of course, we had to visit the Standard Supply company nearby the office where they had a giant toilet (for the obese I assume). Brady labeled this portrait: Stinking Man.

The Stinking Man

Being Monday, everyone had to go watch 24 (except me as I don't really watch TV) so we didn't go out to dinner, which saved my body from yet another caloric bombardment. I was too tired anyways, so I plopped down and went to bed early.

On day 4, we went up to "Snow Bird" to have lunch at a lodge there. It was absolutely beautiful. Some of those runs looked incredible...but yeah, I'm too much of a pansy to ski :-P Basketball for me, thanks.

Up On SnowBird For Lunch

SnowBird

Leaving SnowBird

As beautiful as the scenery is out there and as nice a place as Utah seems to be, I'm glad to be back home in New Jersey. My skin and fingers are doing better in just a day back home (be sure to bring some moisturizer with urea if you go out there) as the air out there is just so incredibly arid. It's also kind of weird being in a social setting where 98% of the population is so homogeneous.

One thing that I've learned on this trip is that mini-vans actually aren't that bad. The Sienna was quite peppy for such a large vehicle and rode very well. It even made it through 3-4 inches of snow without issue.

 Sunday, January 21, 2007

Utah - Day 1, 2

1/21/2007 10:34:56 AM (Eastern Standard Time, UTC-05:00)

It was rough getting out of Newark.  A freak snowstorm delayed the landing of the plane that I was supposed to board and the subsequent snow buildup necessitated de-icing.  I touched down about three and a half hours behind schedule.  To make matters worse, the Hertz counter where my car was reserved was manned by perhaps some of the most incompetent people.  Ever.  There were probably 6 groups in front of me and it took me at least an hour and fifteen minutes just to get my car >:-[ There's something weird about driving a mini-van when you're not expecting it.  While I was supposed to have a Corolla reserved, the only thing they had in the same price class was a Toyota Sienna.  This is actually the first time that I've driven a mini-van...it's kind of weird since I'm used to smaller cars.

We had lunch at Rubio's, a Mexi-Cali place that specialized in fish tacos.  I had a grilled salmon taco, which was delicious (out east, we only have the kinda shitty Baja Fresh).

Dinner was at Joe's Crab Shack, a great seafood place where Jim (our CTO) finally found a satisfactory martini in Utah.  Unfortunately, they also pulled the birthday-boy schtick on me and I had to dance around on a broomstick horse and cowboy hat (I have pictures, but it's just too embarassing)...

DSC00002.jpg

This morning, I woke up to find 3 inches of snow on the ground.  But by that time, I was already dressed and ready to go to the gym.  I wasn't too excited by the prospect of trying to drive in the dark to a gym which I only had rough directions to in 3 inches of snow in a mini-van with California plates...

DSC00012.jpg

But I'm glad I did.  I ended up at the new Lifetime Fitness gym here.  DAAAAAAAAAAYUM.  This is the nicest gym I've ever seen.  It's bigger than the Costco back home.  The indoor pool had two huge, twisty water slides like the ones you find at amusement parks.  The basketball court was full size, well lit, and they actually had good basketballs, too.  And the workout floor: at least 100 weight machines and wall to wall plasma TVs.  It was kind of weird being the only person in such a huge building...I think I would move out here just for this gym :-P

I ended up at the office earlier than anyone else (or so I thought) so I killed some time by writing my name in the snow...

DSC00019.jpg

DSC00018.jpg

So begins day two of Programmathon II...

DSC00013.jpg

It turns out that Jim had already arrived at the office. He saw my snow writing and walked downstairs and let me in :-P

We had lunch on day two at some Chinese place in the food court at a nearby mall. Damn that gave me gas (actually, I think eating out anywhere give's me gas).

DSC00020.jpg

After a long day of programming, we ended up having dinner at Johnny Carrino's. I checked the score on the Colts-Pats game and it looked like the Pats were gonna blow the Colts out.

DSC00021.jpg

As you can see, it was my birthday again. Forced against my will, I finished the free chocolate cake and ice-cream.

DSC00022.jpg

 Friday, January 19, 2007

Well I'll Be Damned...

1/19/2007 1:26:54 PM (Eastern Standard Time, UTC-05:00)

Just a few days ago, I was praising Microsoft hardware and support after calling to get my broken IntelliMouse replaced.

So today when I got back from lunch, to my surprise, I found a huge package sitting on my front steps.

new-keyboard.jpg

Awesome!  They sent a whole new set.  Now I have an extra wireless keyboard.

I'm heading out to Utah in 5 hours, so I'll leave this week on a random note:

quincy-log.jpg

For those of you who have been following along, this is my lizard Quincy, who just a few months ago, was the size of my pinky.

 Wednesday, January 17, 2007

Forgive And Forget

1/17/2007 5:33:04 PM (Eastern Standard Time, UTC-05:00)

I really think that one of the big keys to success and happiness in life is to be able to forgive and forget.  With some people, it just comes naturally and easily; they can move on and mend relationships without regards to whatever transpired.

Of course, for many people, this is an acquired life skill that comes with maturity.  Take my mother, for example.  In her younger days, she was probably too unwilling to compromise and too headstrong.  She held her grudges against my father for the longest time, but as the years have passed, she has come to understand how she erred in not being more flexible.  Nowadays, she's pretty much always happy-go-lucky when you bump into her.  Even when we have disagreements or we have a small fight, she never holds it against me.  It's not just me, she's the same way with everyone she meets.

I'm still working on it.  I am kind of egotisctical and unerring in my presumption that I'm always right :-P (just ask my sister).  On top of that, it takes me a long time to forgive and a longer time still to forget.  I hope that I can correct this over time...life's truly too short to hold grudges.  It's just that for some, like me, it takes a really long time for that to set in.

I started thinking about this after reading an article on Jeff McInnis, who was basically banished from the Nets team for a whole year and whose career was put in limbo - especially so considering his age.  But of course, one of the things that comes with age is maturity:

McInnis has refused to criticize New Jersey coach Lawrence Frank, who was apparently upset with McInnis' work ethic following knee surgery last January.

"If that was the case, I'd hold a grudge against every team I've played for," said McInnis, who has played for eight teams. "I can't think of it like that. They gave me $7 million to better my family. I can't be mad at Jersey. They made a decision last summer not to bring me back, but I'm here now. I want to focus on the Bobcats."

"When I was younger I probably wouldn't understand it, but I'm older, I know what's going on. I don't have anything personal against Jersey."

To be honest, with all the trash and rumors I had heard about McInnis and how the Nets treated him (not the classiest ways of doing business), this is a surprisingly mature response.  I hope that I can develop that same outlook on life and learn to be more optimistic and forgiving.

 Tuesday, January 16, 2007

I <3 Microsoft Hardware

1/16/2007 3:19:40 PM (Eastern Standard Time, UTC-05:00)

I know I'll probably come across like a "fanboi", but I really, really like Microsoft's keyboards and mice.  I'm currently using the Natural Ergo 4000 keyboard and it's awesome (you can read my review of it at Amazon).  It's the most comfortable "mainstream" (as in anyone can pick it up in Staples or Office Max) keyboard out there for extended typing usage.  I haven't had cramps or pain in my pinkies for months (CamelCase will do that to you...)!  Months!  And I'm in front of the computer for a good 8-10 hours a day!

Prior to this, I was rocking a Wireless Desktop Pro keyboard/mouse set (which I also reviewed at Amazon).  While quite comfortable in its own right, cannot compare to my current setup of the aforementioned 4000 and Logitech MX Revolution (along with UberOptions).

But anyways, I replaced the mouse included with the WDP set a few months back as the scroll wheel started to gum up and would not scroll or click anymore (damn cats >.<).  So I finally decided to call Microsoft today and see if I could get a replacement since the receiver and keyboard are both still fine.  Fully ready to pay for the replacement and the shipping cost, to my surprise,

  1. The service rep. that answered my phone call was American and spoke "normal" English,
  2. The service rep. was polite and friendly,
  3. The service rep. hooked it up with a replacement mouse, no questions asked (well, except for the standard ones) with no charge at all to me...no shipping, no replacement fee,
  4. The confirmation was sent to me in under an hour...

Yes indeed.  I <3 Microsoft hardware :-D (and great support to boot).

 Monday, January 15, 2007

In Memory of MLK...

1/15/2007 9:57:46 AM (Eastern Standard Time, UTC-05:00)

In celebration of this day, I think it's worth the time to listen to a recording of his historic speech.

Could the civil rights movement have had a better, more visionary, and stronger leader than MLK?  It's hard to believe so.  Let's hope that his message doesn't die and lose it's power with today's generation.

I often find myself wondering whom in our time can even be compared to the great people of years past.  Who will we remember as "great" in the decades to come?  It often seems that such people are increasingly rare these days...

I leave you with a passage from his speech which resonates with me:

But there is something that I must say to my people, who stand on the warm threshold which leads into the palace of justice: In the process of gaining our rightful place, we must not be guilty of wrongful deeds. Let us not seek to satisfy our thirst for freedom by drinking from the cup of bitterness and hatred. We must forever conduct our struggle on the high plane of dignity and discipline. We must not allow our creative protest to degenerate into physical violence. Again and again, we must rise to the majestic heights of meeting physical force with soul force.
 Sunday, January 14, 2007

Updated Site Layout

1/14/2007 2:25:06 AM (Eastern Standard Time, UTC-05:00)

I'm just too lazy to update the blogging engine :P

But at least now, the site renders correctly in FF and IE.

Now what to do about those other link items...

 Saturday, January 13, 2007

Adding Users To A Document Workspace

1/13/2007 6:49:08 PM (Eastern Standard Time, UTC-05:00)

In WSS3, the process of adding users to a document workspace (or any sub-web) has changed from WSS2.  The following snippet will allow you to add a user (I've only tested with users mapped to domain accounts) to the workspace:

using(SPSite site = new SPSite("http://ashelia:2345")) {
    using(SPWeb workspace = site.OpenWeb()) {
        string resourceLogin = "ASHELIA\\cchen";

        // Ensure that the user exists and conveniently, get
        // an SPUser reference.
        SPUser user = workspace.EnsureUser(resourceLogin);

        // Create a new SPRoleAssignment for the user.
        SPRoleAssignment assignment =
            new SPRoleAssignment(
                user.LoginName, user.LoginName,
                user.Name, user.Notes
            );

        // Add the "Contribute" role definition to the role
        // assignment.
        assignment.RoleDefinitionBindings.Add(
            workspace.RoleDefinitions["Contribute"]
        );

        // Add the assignment to the web.
        workspace.RoleAssignments.Add(assignment);

        // Update the web.
        workspace.Update();
    }
}

Note that when you create a new sub-web, by default, there are 5 role definitions defined for you already.  These are:

  1. Full Control
  2. Design
  3. Contribute
  4. Read
  5. Limited Access
 Thursday, January 11, 2007

Final Fantasy 12 - The Movie

1/11/2007 1:44:12 PM (Eastern Standard Time, UTC-05:00)

Or rather, the cut scenes (in game and pre-rendered) from the game.

If you're like me, you really don't have the time to spend plunking down in front of your TV to play 40-60 hour games anymore.  Most of my gaming time these days is spent with the DS (the greatest gaming platform of this generation?).

But I can't shake my adoration for the Final Fantasy series, even though sometimes it seems like it's been milked to death.  The game always features some of the most creative character, architectural, landscape, and creature designs.  In this respect, Final Fantasy XII does not disappoint...some of the bosses and their specials are just jaw dropping.  It blows my mind that they were able to create this world with such detail, creativity, richness, and beauty.

In any case, if you want to skip to the good stuff, then hop on over to videogamesheaven.net and check out the FFXII cutscenes.  It's worth watching through the whole thing.  I actually think it's fairly well written and the voice acting isn't terrible (Vaan is possibly the worst one but Fran, Balthier, Basch, and Penelo are all great).

On some level, the main theme relates to one of the central themes of the Blade of the Immortal series: how does one come to grips with the desire for revenge and the reality of bloodshed that such a path would entail and the cycle of hatred that is driven by such actions? 

 Tuesday, January 09, 2007

On Software "Architects"

1/9/2007 10:28:54 AM (Eastern Standard Time, UTC-05:00)

I've always had a disdain for the term "architect" in the context of software development. Possibly due to my not-so-fond experience with an "architect" during my days at Factiva.

I popped open Fred Brooks' The Mythical Man Month last night searching for a specific passage on project management, but stumbled on another passage that I had highlighted which caught my attention:

The manual, or written specification, is a necessary tool, though not a sufficient one. The manual is the external specification of the product. It describes and prescribes every detail of what the user sees. As such, it is the chief product of the architect.
The manual must not only describe everything the user does see, including all interfaces, it must also refrain from describing what the user does not see. That is the implementer's business and there his design freedom must be unconstrained. The architect must always be prepared to show an implementation for any feature he describes, but he must not attempt to dictate the implementation.

I think this is a golden rule that is often broken by software architects. The reason that it's so common to break this rule is that in most organizations and teams, the architect is not necessarily:

  1. labeled as such; instead, the term that might more commonly be used to describe such a person would be "business analyst",
  2. a distinct position/role, which means that a high level/senior (read:"been here the longest") developer assumes the role of architect,
  3. accustomed to the practice of separating usage from implementation.

On point 1, by Brooks' definition, an architect is not necessarily a developer, but an individual more aligned with the business side of the client/company with perhaps some technical background or maybe even a trusted technical advisor. The architect must be able to interface with business users and extract the information required to create the right product.  Such incorrect labeling of the position often leads to conflict.  When Confucius was asked what his first measure would be as a minister in the court of Wei, he commented:

It will certainly concern the rectification of names.  If names are not rectified, then language will not be in accord with truth.  If language is not in accord with truth, then things cannot be accomplished.  If things cannot be accomplished, then ceremonies and music will not flourish.

-- Confucius (Chan, A Source Book in Chinese Philosophy, p.40)

The role of architect and developer should be distinct and well defined.  This is not to say that the architect shouldn't have a development background.  Quite the opposite is true; the architect should know the technologies and know the tools, but should refrain from telling others how to implement a feature.  By Brooks' definition, the architect should only tell others what to implement.

On point 2 and 3, in most cases, companies do not always specifically allocate the role of "architect" without also making sure that said individual does not lead the direction of development. In smaller organizations, it's perhaps not an option to create such a distinct role. In these cases, the architect-developer must be able to separate the responsibilities of the duties of both roles.  The problem that arises when this happens is that the developer-cum-architect needs to have the discipline to switch contexts between architect mode and developer mode.  The individual must not think of interfaces in terms of code, but in purely terms of use cases.  This is a difficult task as when I'm presented with a proposed interface (be it visual or programmatic), my natural reaction is to wonder "how will I implement this feature?", "what libraries can I use?", and other such thoughts instead of focusing on dissecting the features of the interface from a use case perspective.

In any case, the architect can still guide the development process by continually updating the specs, conveying user feedback, and offering implementation advice when requested, but the architect must not dictate the details of the woodwork. Doing so always inevitably causes friction between those that create the code and those that create the specification. For, as Brooks says, the act of software engineering is, ultimately, a creative process for the programmer and by restricting this aspect, only begrudging compliance can be achieved.

 Monday, January 08, 2007

ContentTypeIds In WSS3

1/8/2007 4:50:43 PM (Eastern Standard Time, UTC-05:00)

In WSS3, if you execute the following SQL:

    SELECT
        ContentTypeId
    FROM 
        ContentTypes

You will notice that the content types are represented in the output as hex.  If you take a look at the table definition, you'll see that the actual data type of the column is VARBINARY(512).

Doing a lookup like so:

    SELECT
        ContentTypeId
    FROM 
        ContentTypes
    WHERE 
        ContentTypeId = '0x101'

Will not work since you cannot perform a comparison between VARBINARY and a character data type directly.

Doing the following will also not work:

    SELECT
        ContentTypeId
    FROM 
        ContentTypes
    WHERE 
        CAST(ContentTypeId AS VARCHAR(512)) = '0x101'

This doesn't work because the underlying type of the binary data isn't character data.  It's integer data.  You can confirm this by running the following query:

    SELECT
        ContentTypeId,
        CAST(ContentTypeId AS VARCHAR(512))
    FROM 
        ContentTypes

You'll see that it's just a bunch of gibberish.  Try the same query with INT and you'll see that the data makes much more sense.  What you'll notice is that content types that inherit from a base content type will have numerical values that increment by 1.

This information is useful, but not nearly as useful as the data that you can glean from the hex string representation of the ContentTypeId.  You see, in the hex string representation, the base ID is a substring of the ID of any inheriting content type.  For example, if I have a content type which has a ID (as a hex string) of 0x0101345346345312234346, then any child content types will have 0x0101345346345312234346 as a substring (e.g. 0x010134534634531223434601, 0x010134534634531223434602).

So how do we get this data in SQL Server for comparison purposes?  We need to use an "undocumented" SQL function: fn_varbintohexstr().

This allows you to do nifty queries to find a given content type and all child content types (or any query where you have to retrieve information about a hierarchy of content types) like so:

    SELECT
        *
    FROM 
        ContentTypes
    WHERE 
        master.dbo.fn_varbintohexstr(ContentTypeId) LIKE 
            '0x0101345346345312234346%'

You can find out more information on this function here.

 Sunday, January 07, 2007

A Note On Copying Files In WSS3

1/7/2007 2:52:33 PM (Eastern Standard Time, UTC-05:00)

I dunno if this was supported in WSS2 or not, but in WSS3, when a file is copied to a new destination, a link is stored which indicates where the new document is copied from.

In the database, you can see this by running the query:

SELECT
    tp_dirname,
    tp_leafname,
    tp_copysource,
    tp_hascopydestinations,
    tp_guid,
    *
FROM ALLUSERDATA

The tp_CopySource column holds the URL of the source document from which the given file is copied from.  If you simply change the URL here, you can point it to any file you want.  If the file is a copy, then the following information bar will be displayed on top of the file properties in the properties page:

copy-indicator.jpg

However, it's not so obvious how to do this programmtically.  First, I tried using the CopyTo() method of SPFile.  Aside from not having the desired effect, this method does not seem to allow copying files across site boundaries (for example, from a root site to a document workspace -- for that, you have to use the Add() method on the Files property of the target SPWeb).

On my second attempt, I tried to set the "Copy Source" property of the file.

foreach (object key in file.Properties.Keys) {
    Console.Out.WriteLine("{0} : {1}", key, file.Properties[key]);
}

Iterating through the properties of an SPFile instance, I found that one of the properties, was "Copy Source" (internal name of "_CopySource") and in fact, held the URL of the source document.  I tried to set this value and update the file, but this was unsuccessful yet again.

On my third attempt, I came across the CopyTo() method on the SPListItem class and this did it for me :-) Conveniently, it also allows you to copy an item across site boundaries.

I felt so stupid afterwards because it should have been obvious that I had to use the CopyTo() method on the SPItem because the SPItem is also where the UnlinkFromCopySource() method is located.

 Thursday, January 04, 2007

More on Dean Karnazes

1/4/2007 9:21:29 PM (Eastern Standard Time, UTC-05:00)

I mentioned a short article on Dean Karnazes in the current (January, 2007) issue of Outside magazine in my previous post.

There's a great passage that I really liked:

I think Western culture has things backwards.  We equate comfot with happiness, and now we're so comfortable we're miserable.  There's no struggle in our life, no sense of adventure.  I've found that I'm never more alive than when I'm pushing and I'm in pain and I'm struggling for high achievement.  In that struggle, I think there's a magic.

Unless you're pushing yourself, you're not living to the fullest.  You can't be afraid to fail, but unless you fail, you haven't pushed hard enough.  If you look at successful people and happy people, they fail a lot, because they're constantly trying to go further and expand.

It's a good mindset to keep in mind as you start out your new year and try to stick to your resolutions :-)

 Wednesday, January 03, 2007

I Want To Dunk.

1/3/2007 11:16:33 AM (Eastern Standard Time, UTC-05:00)

I have no idea why, but I woke up this morning and I thought to myself "I want to dunk" :P

First, a little background: I've been playing basketball on and off during the last 10 years, some times really intensely (like in high school, when I played 2-3 hours every day) and sometimes less (like nowadays, when I only have time to play an hour or two at the gym).  During my high school days, I could actually dunk a ball on the rim (it's true, I actually did it once).  (But alas, cursed with average sized hands for a 5'10" guy, I could never palm the ball with a strong enough grip with one hand for a dunk.)  Yes, at one time, I could actually jump vertically (no running start) and grab onto the rim.

Over the years, as I've become more sedentary, as most programmers are inclined to, I've lost much of that leaping ability (although my calves still look fantastic (no, really :-D)) even with regular weightlifting and workouts.

For the past three months, I've been battling various issues that have hampered my usual workouts: a sprained ankle in Sept./Oct., my intensely dry skin which basically precludes me from playing basketball at all, and my fractured finger (which is just now healing to the point where I can close my fist).  Not to mention that I packed on 6 pounds (mostly -- okay, all -- fat) due to inactivity and holiday feasting.

But I figure now is as good a time as any to work on this goal and get back to my regular regiment.

By way of Google, I stumbled upon an article by Josh McHugh of Outside (which, by the way, recently had an excellent mini article on Dean Karnazes -- so good that someone actually ripped the page out of the Outside magazine at the gym) and Wired magazine fame.  I think I'm gonna try for it.  There's quite a bit of investment involved in some equipment (enough to get myself a Treo 700wx!), but I think it'll be worth it even if I can't dunk, at least so that I can swat some more shots at my gym pickup games :P (man I sound like such an old fart).

JumpUSA has most of the products including:

I'm having a hard time deciding between the weight vest and the belt.  The vest seems like it's more natural and easier to deal with (less motion on the body when running/jumping) but seems like it'd collect more sweat and also add more weight above the waist, which could strain my lower back.

So it'll be interesting to see how far I can take it.  I'll keep my progress posted.

 Tuesday, January 02, 2007

To Follow Up...

1/2/2007 5:30:48 PM (Eastern Standard Time, UTC-05:00)

So it turns out that Paul Andrew, the technical product manager of WF linked to my very abstract review of Essential Windows Workflow Foundation.  For those that haven't been following, I wrote an awesome review of the book on Amazon and sent it in (or so I thought!) but I haven't seen it show up on the page yet :-S

So for the sake of others considering this book, I'll review it again.

There are two types of developers that you will come across: those that are content to make things work and solve business solutions from the top down and those that want to understand the underlying technologies to build solutions from the bottom up.  This is not so much a discussion on "architecting", mind you, but rather a discussion on how different developers approach tools and frameworks.  Not that one is better than the other, but each brings a different approach and each has different preferences with regards to technical resources.

If you fall into the former and you are mostly concerned with your immediate business solutions (learn top-down) and you learn best by doing, then this book is not for you.  The contents of this book are not so much concerned with how to solve business solutions with WF nor is it a cookbook for WF solutions.  This book doesn't have many pictures of the design surface and doesn't concern itself much with building workflows in the designer.  It is an introductory guide to the underpinnings of the WF framework.  It delves into the workings of WF and the principles behind many of the advanced concepts that may not necessarily crop up in most use cases.

If you fall into the latter category of developers (learn bottom-up) and you learn best by first understanding the tool and the design principles of the tool, then this book will be a good starting point to understanding WF.  In fact, the first chapter of the book walks through a sample implementation of a simple "workflow engine" and covers the principles that drive the implementation of the WF framework.  The chapter presents a "If I were writing a workflow engine, how would I write it?" scenario (if that makes any sense).  This outline then serves as a basis for understanding the function and design of the WF engine.

The book provides insight into advanced concepts and does a fairly good job of it (examples are simple and straightforward - oddly, not all of the code is provided online), but it seems to come up short in the last chapter, where the authors just kind of jumbled everything that they didn't cover into one chapter.  It almost seems like the authors were working on a 10 or 12 chapter book but were forced to cram the remaining topics (unfinished) into chapter 8.  In short, the book seems unfinished.

This book is not for everyone.  It does assume some familiarity with higher level .Net framework concepts that many developers from the ASP.Net world may not have experience with (specifically, threading and asynchronous method calls) so for that reason, I would recommend a companion book: Pro C# 2005 and the .NET 2.0 Platform, Third Edition.  As a general note, I've found that the "Microsoft .Net Development Series" of books from Addison Wesley typically does not cater to the first class of developer as the titles tend to be architecture and framework oriented as opposed to solution and implementation oriented.

In summary: 4 out of 5 stars; a worthy book that deserves a space on your bookshelf if you plan on doing WF.

RSS 2.0 Atom 1.0 CDF