I'm Mostly an Adult

Apparently, I'm 7% more of an adult than my 13 year-old daughter...

Your Total "Adultness" Competency Score is 86%

  • Love: 89%
  • Sex: 89%
  • Leadership: 100%
  • Problem Solving: 100%
  • Physical Abilities: 67%
  • Verbal and Math Skills: 100%
  • Interpersonal Skills: 100%
  • Handling Responsibility: 100%
  • Managing High-Risk Behaviors: 100%
  • Managing Work and Money: 100%
  • Education: 89%
  • Personal Care: 100%
  • Self Management: 78%
  • Citizenship: 89%
Technorati tags: , ,
12. April 2007 09:33 by Jacob | Comments (1) | Permalink

Hoppy Birthday to Me

My birthday was yesterday (yes, on Easter this year—sorry about the title-pun). Every Saturday, we take the kids to one of our friends' house and play roleplaying games (currently alternating between D&D and Champions). Since three of us have birthdays within a week of each other, we tend to throw a little birthday celebration on the first Saturday in April. Jay Barnson, our DM and one of the birthday boys, has a post with the incredible cake the ladies put together for us this year. Check it out, they made us a battlecake! The cake was put together by Julie, Kelly, and Melissa (with John lending the die rolls). Birthdays were celebrated by me, Jay, and Bryan.

UPDATE: Doh! Left Jena off the creators list. Since she's our resident baker, that's just wrong...

8. April 2007 05:33 by Jacob | Comments (6) | Permalink

Too Much Information

Too Much InformationLike many businesses, my current employer uses Microsoft Dynamics GP for our main  accounting/inventory software. From a recent trip to Connections (the big convention for Dynamics), I learned that there were some cool data mining utilities available from Microsoft that we might be able to use. I love free stuff, and the opportunity to give our executives something to chew on for a bit (keeping them out of my hair) was one I couldn't pass up.

The Analysis Services install I managed to dig up (after much searching on Microsoft's Customer Source) went pretty easily. There are a couple of SSIS jobs included that populate an summary database with relevant data pulled from the objects you want to throw into your data warehouse. Not too shabby, even if it's an extra aggregating step. In fact, I kind of appreciate the added encapsulation and I know I'll have to restrain myself from using this database for other reports.

Anyway, the only thing left at that point was to "process" the data warehouse. That's where the data warehouse reads the "factual" information and chunks it up into nice little cubes that should have precise business-person meaning. It can take a while, so I was prepared to leave the process running a bit.

Five hours later...

We're just not so big a company that this thing should have taken five+ hours. Digging into the process that was taking so long revealed that at least one of the dimensions it was trying to process included a table join that seemed a bit fishy. It included a master-detail relationship that should have ended up with something around 500,000 rows. Checking the "Estimated Execution Plan" on the generated select statement showed that it was estimated to return closer to 2 billion rows. That's a messed-up join is what that is.

Fortunately, Visual Studio 2005 gives you some cool tools that work with Analysis Services. One of them is a wizard that you can point at a data warehouse and have it reconstruct it as a project. Checking the Data Source View "GPDataWarehouse.dsv" revealed what the problem was. Roughly half the relations in that view had split the key so that there was one for the actual relation minus the CompanyId and another with the CompanyId all by its lonesome. The effect of this is that the data warehouse would process once for the real relationship and again for the spare. Since CompanyId is the same value for all my records, what I ended up with was a data set getting ready to relate 147,698 records with every one of 11,937 records. I'll spare you digging out a calculator; that's 1,763,071,026 rows total.

Now frankly, I could have simply removed the CompanyId entirely from all relationships—CompanyId is only really relevant if your Dynamics install is trying to manage multiple companies. We aren't doing that. Still, I can be a little, uh, rigid with stuff like that so I went ahead and changed the relevant relationships to include CompanyId and simply deleted the spares. Once I deployed the project back to the data warehouse, processing it completed in a mere 15 minutes.

I suspect that the cause of this disjointed relationship is that the original warehouse was configured for SQL Server 2000 and we're using SQL Server 2005. At any rate, things are a lot happier now. I have an SSIS package that kicks off the summary database update and then processes the cube and the whole thing runs at night in 20 minutes or so.

For those who might be experiencing similar issues, I've uploaded my working Data Source View. You should be able to replace yours using SQL Server Management Studio. I selected all the options on install so it includes the Financials, Inventory, Payables, Purchases, Receivables, and Sales cubes. I'd do a backup before attempting it, but you were probably going to do that anyway...

4. April 2007 22:25 by Jacob | Comments (0) | Permalink

Having a Song Stuck in your Head

This is something of a public service announcement. I don't remember where I learned this, but here's a sure-fire cure for having a song stuck in your head:

Amazing Grace
Gilligan's Island theme song

 Sing the words to one to the tune of the other. In your head or out loud doesn't seem to matter. It works every time (for me so far). The cognitive dissonance will wipe out whatever is there and neither song sets itself in its place. It's like a psychic reboot.

2. April 2007 12:47 by Jacob | Comments (0) | Permalink

DataSets in SOA

Last November, I engaged Udi Dahan (the Software Simplist) on using DataSets in OLTP situations. It turns out that Udi uses a question I posed that kind of preceded this dialogue for his latest podcast at Dr. Dobbs Journal titled DataSets and Web Services. Yes, I am the Jacob he mentions.

You can tell that he's not a great fan of DataSets in general, though he takes pains to treat them fairly. Which puts him ahead of most of the developers I track, really.

Row State

One of the things that Udi doesn't like about DataSets is that they track row state. Unfortunately, he seems to be wrapping together two different consequences of doing so and it's a little bit confusing. His point actually makes more sense if you break it apart a bit.

The first thing he brings up is that because a DataSet tracks row state, many developers build that tracking into the web service as an unstated expectation. I've seen this, too, and it is hideous. In the most extreme cases, you'll get a web service for each of the CRUD operations for your objects—essentially making your web service a thin proxy for your data layer.

The real problem with using row state, however, is that it muddies the contract for your services. This is where Udi is talking about "passing along the intent." Services should have an explicit intent for the data that they receive (or return). Without an explicit intent, it can be hard to discern what any specific service is supposed to do and therefore what business logic that service will enforce. The narrower you can define your intent the better. If your service only knows that a customer record has changed, that service doesn't know if it's supposed to change the address, the name, the marital status, or what all. Which means that the service will not only have to handle all business logic associated with a customer record every time, it also has to try to reconstruct what has happened if it wants to have any kind of concurrency at all.

Incidentally (and more importantly, I think), this also means that those using that service don't know what all it is supposed to do or what criteria it uses to do it. Developers don't deal well with uncertainty. Before you know it, you'll see business logic creep into the calling code "just to be sure." Or worse, you'll see new services pop up duplicating pieces of the larger service.

The problem with row state isn't deterministically bad—just because it's easier to screw up by relying on that additional information doesn't mean you have to screw it up. In other words, just because DataSets track row state doesn't mean you have to give row state significance in your services.

Too Much Information

Row State is really just a specific example of a wider problem, though—namely that DataSets encode a lot of details beyond the data that your service needs to do its stuff. These details make DataSets unsuited for including as a part of an SOA contract because alterations in those implementation details will break a service contract even when the data structures remain the same.

Udi's conclusion is that DataSets should never be used in SOA. I'm forced to agree with him for this last reason. Versioning objects across an enterprise is a tricky business. Minimizing the number of things that break downstream stuff when changed is important to good architecture. The more that you can isolate, the happier you will be.

So the key question for me becomes: are you actually implementing SOA or just using web services? If you're simply using web services, DataSets have limitations to watch for but can be useful. If you're going SOA, keep DataSets to yourself.

I can live with that.

28. March 2007 20:36 by Jacob | Comments (0) | Permalink

MtG Color as Personality

27. March 2007 17:02 by Jacob | Comments (1) | Permalink

Programmer Personality Types

Well, it turns out that, like Simone, I am a DHSB programmer. I can't say that I'm surprised. The only part I'm a little leery of is that S. It just sounds so unfriendly to be a Solo programmer. I've worked in some excellent teams in the past, but coordinating with others is something I had to consciously learn to be good at.



Here's the breakdown:

  • Doer
  • High Level
  • Solo
  • liBeral
Technorati tags: , ,
24. March 2007 04:50 by Jacob | Comments (0) | Permalink

The Parental No

I don't know how it happened, but one way or another, Melissa and I stumbled on a really useful parenting technique early on in our child-raising careers. Do you ever have those situations where a child asks for something only to throw a fit if the answer is "no"? Personally, I hate when this happens. I even hate it when it isn't my kids and I'm just collateral damage. Well, here's one way to cut down on this occurring in the first place. I've never seen or heard of this anywhere else. I don't know why not. Anyway, here you go:

Be inconsistent.

Yeah, I know that's supposed to be a bad thing with kids, and seriously, it is a bad idea in most situations. Done right, though, it can be incredibly powerful when you want your kids to learn to take a "no" calmly. Here's the rules I follow that make this actually work:

  1. If a child throws a fit, don't ever back down. If you back down once, then your child learns that fit-throwing is an effective technique for getting what they want. I personally have a high tolerance for public notoriety so I won't back down even when I'm in a hurry or we're in the middle of Wal-Mart on Christmas Eve. Frankly, if they throw enough of a fit, I'll escalate to let them know that they can lose more than they thought was on the table. They can go from not being able to go to a friends house to not being able to go to anyone's house for a week.
  2. If a child handles a "no" calmly and moves on, make a mental note of it. Every now and then (it's important this isn't every time because then it loses meaning), return to the child later and thank them for handling the denial so well. Let them know you appreciate their growing maturity. I think the delay is important because it gives them time to get over the disappointment. That way, thanking them isn't as much of a temptation for them to reopen negotiations. The bigger the disappointment, the longer I'll delay.
  3. In addition to #2, every now and then give the child what they asked for in the first place after all. You don't necessarily have to tell them that you're allowing them because they handled the denied permission so well, but it doesn't hurt to connect the dots. They don't always make the connections themselves. It doesn't take long for them to realize that if they handle it well there's a chance that they'll get what they want after all.

You don't have to do #3 often. A couple of times a month is all it takes. The results are really gratifying. I get compliments sometimes on how well-behaved and mature the kids are sometimes. I think one reason for those compliments is that they don't often throw fits when denied something they ask for.

I can see how getting an opening for 2 and 3 can be potentially problematic. You can open the door by adding a "well I'm certainly not going to let you now!" during a heated "no" moment. Get them thinking along the lines of how maybe if they handle things better, they'll be more likely to get what they want.

Of course, it could simply be that we lucked out with four wonderful kids who can take a "no" calmly when they ask for things. Our kids are pretty great for the most part, so I wouldn't be surprised if we simply started out with more points to spend during character creation...

19. March 2007 03:57 by Jacob | Comments (3) | Permalink

Vanguard - A Review

I like game systems and always have. They fascinate me. It started out with my generation's standard: D&D. I bought my first game manual in 1981 and haven't looked back since. This fascination manifests itself in a masochistic desire to explore new MMOGs when they come out. If a game claims to innovate away from the standard mob-hunt, monster bash level progression, I'm particularly interested.

So when I read that Vanguard has three separate spheres for character advancement and that you didn't need to advance at all in the "Adventure" sphere (i.e. killing stuff) to advance in the others, I was pretty much doomed. Other games have tried this before with tragic results, but Vanguard is a part of the Sony empire so I expect that the game will actually be playable. And I have to say, they did something mildly wonderful with the Craft and Diplomacy spheres. Too bad Sony is run by pointy-headed morons who can only see customers as dollars with legs.

The Good

I explored Crafting first and I have to say, they did some interesting things here. The beginning crafting quests give you everything you need to get a feel for the ropes including some minor crafting equipment. This is where I first discovered one of the best things Sigil created: sphere-specific character inventory. My crafting stuff doesn't clutter up my bags and require complex item switching to maintain, just as my adventuring gear doesn't get in the way when I craft. This is nice, though 9 players in 10 won't even be aware of the pain-that-might-have-been (which is a sign of good design).

One thing that took some getting used to in both the non-killing-stuff spheres is that they incorporate colorful "gamey" abstractions. In Diplomacy, for example, you earn "conversation cards" that you play during a conversation to determine who is "winning" a discussion. The cards interact in certain ways that make diplomacy something of a challenge. While a touch odd at first, I came to admire this solution to making these sphere's attractive. It seems that Sigil remembered what others seem to have forgotten--this is a game. If all you have to do to craft something is push a button, then crafting is going to be boring.

These "gamey" abstractions both give you opportunities for random events and introduce the possibility of failure (to be clear, I'm not actually linking those two--while you can have an awkward run of luck in crafting, success or failure is still in the hands of the player). You choose whether to continue pursuit of an "A" quality item or decide that you've had too many muscle cramps to make that feasible and be happy with a "B". This dynamic means that your brain has to be engaged as you play these spheres, keeping them fun and precluding boredom as you pursue them.

My favorite sphere, by far, was Diplomacy. The "gamey" aspects of it were the most abstract but it also had the best writing. This makes sense, but it's good to see they actually spent the money to get some quality stories. I experimented with a couple of different races and each one had some compelling diplomatic storylines with factional interplay and manipulation that pulled me in. I'm not as big a fan of the "town levers" dynamic (which allow your diplomats to boost certain aspects of towns that then give players there interesting buffs--usually with a one-hour timer). I wish they had done more diplomacy quests, but I can see how there's only so much individually crafted, unique content you can create. They could also improve the availability of information before going into a conversation, but the information is there (you just have to remember who you are talking to and what that means about their conversational proclivities). Don't let these nit picks distract here, though: this is an excellent innovation, fun to play, and others would do well to learn from Vanguard.

Finally, a class I think they did extremely well with is the bard. Vanguard has 15 different classes (which is a little excessive) so I haven't experimented with them all, but I'm always interested in what people do with bards. Bard fighting skills in Vanguard are about what you'd expect (though dual wield is a fun non-common perk), but their songs are fantastically well-done. First, you don't actually get songs as you level--you get movements, rests, embellishments, lyrics, and other pieces of songs that you then put together to craft masterpieces to your liking. This lets you fine-tune your energy expenditure and song effects in a very bard-like manner. Second, Vanguard lets you name your songs. The buff tool-tip on mouse-over actually contains your title, allowing you to be publicly creative in a very bard-like way. Nice touches, both.

The Bad

As innovative as some aspects of Vanguard are, there are aspects of the game that grate. The most obvious is that Sony chose to skimp on quality. The graphics, while nice, aren't anywhere near what you'd expect given the system specs on this thing. In addition, the voice acting is... spotty. Some of it was okay, but mostly it was pretty bare-bones (and some of it was downright cringe-worthy). I don't consider myself a voice guy--I don't normally notice voice acting in games. This was occasionally bad enough to draw my attention.

The thing that drove me to cancel my subscription and head back to World of Warcraft, though, is the stupid insistence on a death penalty. Traveling the world is a dangerous activity what with wild boars and other aggressive bad guys wandering around loose. Also, sometimes you want to go out and exercise your inner barbarian. Even though you can theoretically spend all your time in non-adventuring spheres, it remains your core gameplay and central dynamic. If it sucks, everything else is affected. And make no mistake, ramped up death penalties suck.

I truly don't get how people aren't learning from City of Heroes and World of Warcraft on this. Failure is its own penalty. Adding an XP hit and corpse retrieval is just adding insult to injury. Games put you in the position of playing the extraordinary. Games let you play a risk-taking, tough-talking, potentially swaggering larger-than-life character that takes the world on through brains, brawn, or maybe just persistence. Hitting me hard when a risk turns out badly adds suck to a game that I don't think needs to be there.

An additional suck in Vanguard is also that you run out of quests before you run out of level (even more so if you die at all). That means that some time spent running around killing random stuff is, to an extent, mandatory. Here's a tip to anyone designing games: random killing is only fun for people with a lot of time on their hands and/or psychopathic tendencies. Yeah, that's a good portion of your male teen demographic, but games aren't dominated by that group as much as you think (witness WoW's continuing phenomenal, broad-based popularity).

The death penalty suckage is particularly vivid with a player used to World of Warcraft. In WoW, quests will tend to take you places where a single "add" during a fight, while risky, isn't likely to end badly if you're careful. Hard-core players bemoan the wussification of MMOs brought by World of Warcraft, but that's because they're jerks. Well, okay, that's probably not the case, but heavy death penalties do tend to be championed by people looking to prove that they are better than all the noobs running around who have a mere hour or two a night to play.

My final gripe is that Sony, as a company, seems to be deep into self-destruct mode when it comes to pricing and marketing. In Vanguard, this is manifest through their Station Players site. You can, for $1 a month each of four "services" (or $2.99 a month for all four) have access to a couple of character information pages. Gee, thanks. This is actually a cool feature that I first noticed and loved with Planetside. Being able to check out your stats without having to be logged in opens up new obsessive horizons and gives players opportunities to be involved with your game without drawing down all the resources they would if they were logged in. It's a classic win-win for any company with half a clue. Which is why Sony is trying to extort $3/month for something other, more enlightened, companies are giving away for free.

The Conclusion

As I said above, I canceled my Vanguard subscription. I got as much play from the game as I typically do for your standard single-player releases, so I'm not upset about wasting money. It gave me some good memories and I have to admit that exploring the Diplomacy sphere still has an attraction. Unfortunately, the rest of the game seems to be targeted more for your hard core, death-penalty-loving, noob squashing l33t playaz than for someone like me. Also, a company that seems to be looking for every opportunity to squeeze the last dime from my pocket offends me. Note to Sony: you are not the only game in town and your competitors are generous with their offerings. Extorting an extra 20% a month for something others provide for free is a really bad idea™.

7. March 2007 19:33 by Jacob | Comments (5) | Permalink

Another Pointless Quiz

2. March 2007 14:38 by Jacob | Comments (0) | Permalink


<<  March 2017  >>

View posts in large calendar