3 comments Monday, December 17, 2007

If you haven't already, click here to see the latest trailer for "The Dark Knight". They certainly are capturing everything that is cool about Batman and his evil counterpart Joker. Any trailer that uses the classic imagery of Batman glaring over Gotham City from high atop a tower instantly has me hooked. Throw in some cool cape action, and I melt like a seventh grade school-girl at a Justin Timberlake concert.

Almost more importantly, Heath Ledger looks like he captured the true nature of Joker. Ominous, menacing, and just plain creepy. No more pudgy Jack dancing around in an art gallery. After all, Jack did nother more than played Jack with a little makup on in the first Batman movie (yeah, yeah, I know it wasn't hte "first" Batman movie, but you know what I am talking about).

Heath appears to be the maniacle killer that is our hero's foil. Every other villain in the comics serves as no more than a stand-in to occupy Batman's idle-time until Joker returns from some sentence, vacation, etc. I hope this isn't a one-and-done movie for Joker. Let's treat it like the comics, without each other, neither of them exist in their truest/coolest form.

They way I figure it, if Heath pulled off "Brokeback Mountain", Joker should be a breeze...

3 comments Friday, December 14, 2007


Trailer debuts Sunday. Check back then for my impressions, if you care... :)

0 comments Tuesday, November 27, 2007

John Folmer, the football committee chairman for the Sun Bowl, said Monday night that the Sun Bowl had decided to invite South Florida ahead of UC, even though the Bearcats beat the Bulls during the regular season.

"They may have lost to Cincinnati, but at the end of the day we thought USF would do a better job," he said.

I don't exacly understand his reasoning. The Bearcats certainly play a more "exciting" brand of football with our spread offense and the nations leading turnover-creating defense.

Here are some other "reasons" why we aren't going to the Sun Bowl:
The Sun Bowl expects to get Oregon State as the representative from the Pac-10. UC has already beaten Oregon State this season and bowl officials do not like to have rematches. - I can buy this one.

Folmer said the decision was based on USF being the higher-ranked team in the BCS standings. Both teams finished 9-3, but the Bulls are No. 21 with UC at No. 23 in the BCS standings. UC was ranked No. 20 in the Associated Press poll, USF No. 25. - How they are ranked higher in the BCS, I don't know. Is it the win over Auburn?

Regardless of all of the politics involved, I love Brian Kelly's response: "We'll be happy to play anywhere, anytime, anyplace." Please don't leave us Coach Kelly!!!

3 comments Wednesday, November 21, 2007


At the tail end of ESPN.com's current headline article there is a nice mention of UC and the Holy Grail of pizza sauce:

"When hungry in Cincinnati, The Dash recommends a slice of LaRosa's Pizza (40). The local favorite can be found about everywhere, and Cincinnatians will rhapsodize about the sauce. You won't find a leafy idyllic look on campus at the University of Cincinnati, but The Dash is impressed by the modernization efforts around the school's very cool, middle-of-campus football facility, Nippert Stadium."

Granted, I am a little biased, but having played in quite a few stadiums across country, Nippert truly is a one-of-a-kind experience. No other stadium that I have been to is dropped smack-dab in the middle of campus (literally 50 feet away from the student union, the College of Engineering, and other Univerisity buildings) like The Nipp.

As for LaRosa's Pizza comment, I totally agree. We now buy the sauce in six pound bags every time we go down to Cincy to use on our homemade pizzas. No store-bought sauce compares and we are too lazy to try making our own. But, really, could we come up with a sauce better than LaRosa's? I can't imagine it possible.

Speaking of pizza, can anyone name the pizza chain that this post's title came from?

2 comments Monday, November 19, 2007

Obligatory Fanboy Declaration: Amazon is staple in my household. Almost all gift purchases, especially Christmas gifts, are purchased there. The prices rock, delivery is usually free, and they have everything. If you ask me, and some have, Amazon.com represents the Mecca of modern commerce.


On to my gushing, geeky gizmo gawking...

Kindle, Amazon's first tangible product, appears to be the revolutionary leap into ebooks that so many geekified readers yearned for. For the past few years, I stumbled through the bleeding edge of ebook reader technology (PDAs, phones, computers, BlackBerries. You name it, I have tried it.). If they pull it off as well as the demo makes us believe, I could be in heaven.

Being a not-so-small guy, I am a sucker for hardcover copies of books. They tend to be more durable, substatial to hold, and just a whole lot cooler (if you ask me). However, if a simple 10.3 ounces can hold up to 200 books, I will gladly stop lugging around my shoebox sized hardcover novels. No longer would I be restricted to whatever book is in my backpack. If a different genre/story grabs my fancy for the available free time I have at that moment, I can jump right into it regardless of where I am. This is the coup de grĂ¢ce for me. Put my entire library in the palm of my hand using a retina-friendly screen, and I am a disciple.

Does paying $2 to read a blog feed seem outlandish to me? Yes.
Is it an entirely unproven technology? Yes.
Will version 2.0 will be more refined, easier to use, etc.? Yes.
Am I am jumping on the Kindle bandwagon solely based on Amazon's marketing? Yes.

Do I still want one in the worst way? Hell yes!

0 comments Tuesday, November 06, 2007

This week, I am in Las Vegas for DevConnections 2007. Throughout the years, movies have shaped my "vision" of what Las Vegas would be like. Oddly enough, it is quite different than what I expected, in a good way. Here are a few of my observations from the last couple of days...
  • This is the land of bad hair, unproportionally large breasts,
    and extremely uncomfortable-looking heels
    • My personal favorite bad hair was a parted comb-over. It took me a while to figure out what exactly was going on up there, but I decided that it was really a comb-together from each side of the classic horseshoe that is subsequently parted right down the middle. Quite odd.
    • As for the other categories, I will leave my favorites off this website.
  • Developers will shamelessly wear swag, no matter how bad it fits.
    • I witnessed some very ugly hats handed out by vendors just plopped on top of a classic long-haired developer rat's nest.
    • Throw in some XL shirts handed out by vendors worn by fellows needing at least XXL. And no, I was not one of them. I know better.
  • Gathering autographs from "high-ranking" Microsoft employees is a very weird behavior to me. I guess it just proves that fan boys exist everywhere.
  • Older casinos smell bad, kind of like nicotine-smoked death
  • The older the casino, the older the waitresses
  • The city is much cleaner than I imagined, and prostitution seems to be much more
    "behind the scenes" than movies portray.
  • Favorite hotel/casinos so far (in no particular order)
  • This is the first developer conference I have been to with booth babes. I am not complaining, but it was odd to see.
  • I don't think English is the primary language in this city
  • Coffee must be the new crack
    • Developers lined up 20/30 deep for free coffee
    • Maybe it is the booth babes LiveOffice must have paid thousands for to pass out the coffee, but the lines were crazy.
  • All establishments do an amazing job of making sure you have no real clue what time it is, and not just in the casinos. Even the shopping areas adjacent to the casinos are poorly lit. Overall, it is too dark and gloomy for me. I know I like to work with the lights off, but I don’t like to shop with no real light. Bellagio seemed to be the only one who used skylights to light the pathways between areas. Too bad it is outlandishly expensive.
  • Where do all of these people get all of their money? It's just crazy the kind of cash some people throw around. I understand, and buy into, the "you can't win big, if you don't bet big", but it seems out of control here. I guess that is why the casinos are so big…
  • The Latin Grammys are here at the Mandalay Bay on Thursday night. Sadly, my wife informed me that JLo is pregnant so her dress will be of the "flowing" type and not her normal style. Just my luck. At least there is Shakira...
  • I love OneNote. No more scribbling on a notepad just to wonder what I meant to write a few weeks later. And it's searchable too.
  • Sunday afternoons in a big sports book are quite enjoyable. Tons of big screens and lots of people cheering any big play in any game. Proposition bets will do that to you. Poor Dad lost two of them on the Monday night game.

0 comments Thursday, September 27, 2007

Crazy, just crazy. I can't get over how excited I am about the direction that Bearcat football is headed. Can I buy my 2008 season tickets now?

As noted in a previous post, Demetrius Jones was considering UC as his new home for the next four years. The deal is done. Welcome DJ.

Here is some info on our newest "recruit" from the article:

Jones was rated No. 33 by USA Today on a list of the nation's top 100 prep players as a high school senior.

He would have to sit out this year and would have three years of eligibility remaining.

0 comments

From Enquirer.com: "We came here for selfish reasons," Kelly said, "and that is for my family. My wife, my family, we really love this area. It's not about jobs anymore. If you asked me at Central Michigan, yeah, I would tell you that we were looking for another opportunity there. I'm not of that same mind-set here."

Let's hope that my biggest fear about Coach Kelly's hiring doesn't ring true. After all, for decades UC served as a stepping stone job for dozens of big time coaches. I know of at least a dozen coaches that were at UC during my 5 years who are now head coaches or coordinators are "major" college programs or in the pros. Why won't Brian Kelly join them?

The only long-term hire that, I believe, would stay is a UC alum. Someone who TRULY loves UC. Hopefully Coach Kelly means what he says, but many have made that same statement. Let's keep our fingers crossed.

Powered by ScribeFire.

1 comments


It's amazing what a few wins strung together will do for a program. Apparently, Demetrius Jones, yeah the guy who started Notre Dame's season opener, is seriously considering a transfer to UC. Let's hope this one actually pans out, unlike Zach Frazer.

Apparently, the major hang-up is the lack of an open scholarship. Sure, that seems like a problem, but I am sure the smart people in UC's athletic department can figure something out. They better!!!

Powered by ScribeFire.

0 comments Tuesday, September 25, 2007

During my years at UC, we had a couple of sell-outs, but mainly due to the big-time teams/players on the other side of the field (Tim Couch and Kentucky, Edge and Miami (FL), Ron Dayne and Wisconsin), . The one exception to that rule was a UC/Miami-Bastard-Redskin/Redhawk triple-OT classic (the greatest game I ever played in). Our teams sent many players into the NFL, set a few school/conference records, and even led the nation in a few statistical categories. But we couldn't sell-out on our own, no matter who in the top 25 we beat.

Don't get me wrong. As I said yesterday, you would be hard-pressed to see someone more excited about UC's new-found popularity than me and my family. We, especially me, are extremely loyal to our alma mater and their sports teams. However, the local Cincinnati fans are a bit more fickle. All of a sudden, Bearcat football is the hot ticket in town. Let's hope Coach Kelly keeps this thing rolling in a positive direction and sell-outs can become the norm. After all, it is only 35,000...

Powered by ScribeFire.

1 comments Monday, September 24, 2007

I can't even begin to tell you how excited we are in the Anderson household that our Bearcats cracked the AP Top 25.

The big test will be in a couple of weeks when Big East play begins. Good luck fellas! We will be watching...

Powered by ScribeFire.

0 comments Tuesday, September 18, 2007

My dream home theater. Enough said.



Here is the slideshow of all the pics if you want to skip reading the article.

Powered by ScribeFire.

0 comments Friday, September 07, 2007

Today really snuck up on me. It seems like just a few days ago that my head lost about 2 pounds of hair to help childhood cancer. I found myself searching for ways to get out of the painting over the past week, but I kept thinking of the folks that dished out their hard-earned money to see me with an orange and brown head.

The guilt took over and I ran to Wal-Mart at 5:50 AM this morning to find some face paint. As always, Wally World saved me by having their Halloween stuff front-and-center.

I know you don't care about the commentary, so here are some photos:



Let's just hope I can get this off my head before tonigh's big game!!!

2 comments Friday, August 10, 2007

1. I get called a lot of interesting names. Some of my favorites are Sloth (yeah, the guy from The Goonies), Humpty Dumpty, Bald Bull, and King Hippo. I am, however, a little disappointed that no one threw out Jabba. That one seemed so obvious to me.

2. Hair insulates amazingly well. I am constantly astounded at how much cooler I am without hair.

3. Breezes are way more noticeable now that my scalp is bare. This certainly helps with the cooling effect when I start to overheat.

4. My head is quite weathered. We found dents, scars, and odd nicks when the rug was removed. My shaver, Jeffery Paul (whose clients include Al Learner and other famous folk) even remarked at how much it appears my head had been through.

0 comments

As previously blogged about, I volunteered to shave my head for childhood cancer. Many people stepped up to the plate and donated their hard-earned money to help support this great cause. I thank you all who helped me raise $650 in less than 48 hours. If only I had started sooner...

Well, I know you are all waiting to see what my massive melon looks like sans hair, so here you go (click on the image to see the scary image up close and way too personal):


Since I reached my "bonus" goal of $500, I agreed to have my head shaved again and painted brown and orange the Friday before the first Steelers/Browns game. That should be interesting, and I am sure those pictures will be even more eagerly anticipated.

0 comments Tuesday, August 07, 2007

My boys (The Bearcats) just inked a home-and-home deal with Oklahoma. Most impressive...

The Bearcats will travel to Norman on Sept. 6, 2008 to begin the series and will host the Sooners on September 25, 2010 at Paul Brown Stadium.

I really like the direction they are headed, and Coach Kelly seems to know the steps needed to get us to that next level: "If we expect Bearcats football to be a national presence and compete in the BCS, we need to play nationally recognized programs"

The big question on my mind is, how long will Coach Kelly stay around? Is this just a stop on the way to bigger and better things? I fear that it is, but I sincerely hope not. I like what he has done over his first few months. Whether they win or not, remains to be seen. But I feel good about the season...

2 comments Monday, August 06, 2007

My company has a long-standing tradition of supporting many wonderful causes helping childhood cancer patients (St. Jude, Wigs For Kids, etc.). Our latest endeavor is St. Baldrick's, and after receiving full clearance from the wife (I'm no dummy!), my head gets shaved on Wednesday morning.

So, exactly how much would you pay to see my with a shaved head? There is one way to find out. Please donate, anything you can (either online or the old school way by printing this PDF).

0 comments Sunday, June 24, 2007


The boy must have seen the pride flowing through me as Leia garnered the lion's share of attention during the weekends ceremony. Not wanting to be out done, he decided to lay down the trump card and take his first steps.

Deuce never really seemed too keen on walking until this morning. He motored around wherever he needed on his hands and knees for months before even thinking of walking.

Knowing that out vacation to the beach may do even more damage to his poor, roughed up little knees, Renee and I began really pushing the walking subject with the little guy.

Dragging Joshua around the house dangling from our grip, he put up with our "lessons". Hardly interested, Deuce hung rather limp, not moving his feet very much until we finally released him back to his duties of drooling, screaming, and generally destroying things (hence the Godzilla nickname Leia and I dubbed him with).

For about two weeks, every time Deuce stood up on his own, we waited axiously and called for him to just take one step towards us. He was happy to comply, on his terms though. Plopping down on his hands and knees, he would scurry over with a massive grin.

This morning, going almost unnoticed, 1, 2, 3 steps. After alerting Renee to the big news happing right before our eyes, she screamed, Leia jumped and little Deucie clapped for himself after he dismounted. Over the next hour, stpes 4 through 50 occurred. Having realized the power of walking, nothing else was on his mind. Stumbling everywhere, he is determined to master this thing we call walking. That sand is gonna be hot in a couple of weeks buddy, so keep on practicing!

Daddy is proud of you.

I think the picture pretty much explains Proud Papa Moment #3.

0 comments

Parenting whirls you through all kinds of emotions as you watch your children experience new things. Pride was the big emotion this weekend. Sure, I have been proud of my little ones many times before, but seeing one of them do their thing in front of a sizeable crowd, without missing a beat, marched this memory up to #1 on Leia's list of proudest moments for Daddy.


This weekend, my brother-in-law got married down in "The Nasty" (Cincinnati, in case you were wondering). Leia served as the Flower Girl in the wedding ceremony and was a HUGE hit. She stole the show and made me realize that I will be a total wreck when she walks down the aisle for her own wedding.

Leia nailed both test runs in the previous night's rehersals and rose to the occasion when it was showtime. After sending her off just before the bride, I walked on my tip-toes along side her (outside the pews, of course) craning my neck to see her over all of the wedding goers. Seemingly everyone who showed up the reception told us how beautiful our children are and raved about how well Leia perfomed during the ceremony.

For those of you saying, "Dude, all she did was walk down the aisle and smile. Why all the fuss?", give it time. You will understand one day when you have kids.

Congratulations Princess.

0 comments Thursday, June 21, 2007

I am quite ashamed that I didn't build one of these for little Leia and Deuce... :(

Regardless, this is, by far, the best stroller ever!


Technorati Tags:

Powered by ScribeFire.

0 comments Tuesday, June 19, 2007

Alexi Lalas, former defender on our US National team, seems to have rather grandiose visions of the MLS. Granted, I am a recent soccer convert (or traitor, if you ask my Brother-In-Law), but it is quite obvious, even to me, that the teams in the Premier League are CLEARLY better than anything I have seen in the MLS.

It stands to reason, that if the teams are clearly better, than the players that make up those teams are better. Name one player in the MLS, even with an aging Beckham, that is on anywhere nearly as talented as Didier Drogba or Cristiano Ronaldo. Just running down the list of EPL players who have made me sit up and say, "Damn, that guy is good!", I can rattle off quite a few who are heads-and-shoulders above anyone I have seen in the MLS (Wayne Rooney, Thierry Henry, Frank Lampard, and Steven Gerrard).

I do try, repeat try, to watch MLS soccer whenever it is on just so I can support our nation's league and only once have I stopped and said, "Wow, this is actually fun to watch!" Sadly, I think it was only fun because the defense was non-existant. Apparently the newspapers in England feel the same way (see the bottom of the linked article). If someone as new to soccer as I am can see that, how can Lalas say this in his right mind? Is it a marketing tactic or something stupid like that? Maybe, but it is still extremely ridiculous.

Technorati Tags: , ,

Powered by ScribeFire.

0 comments Monday, June 18, 2007


I don't normally care about, or watch, baseball. But if I am flipping through the channels and see that my boy, Larry "Chipper" Jones, is at the plate, I drop everything and watch.

So, congrats to Larry for reaching another milestone in his career. I just hope I don't have to see Chip-dog in another uniform like I did with Dale Murphy. That would be a bit too painful...

0 comments Friday, June 15, 2007

If only we got cool gadgets as quickly as the Chinese...


Sure, sure, you could buy a smartphone and load a NES emulator, but playing games on a phone that is really just a phone sucks big time. This little beauty has a handy little directional pad and A/B buttons.

Who knows what the ROMs cost though. Afterall, every game I would play on this, I already purchased for my Wii. If you could upload/sync/whatever my Wii's Virtual Console games to this phone... then, and only then, would we finally have gaming Nirvana!

0 comments Thursday, June 14, 2007

Forget Game 5 in the Eastern Conference Finals. Forget his posterization of Rasheed. This tops it all.

Any guy who gives his son a middle name of Maximus is AWESOME! Sure, it might put a little pressure on the little guy to be studly, but I am sure his genes will help him along the way.

Welcome to wonderful Akron, Ohio Bryce Maximus James...

0 comments Wednesday, June 13, 2007


I learned a lot from this guy. Sadly there haven't been many other shows that have introduced children to science like Mr. Wizard. Bill Nye came close and Beakman's World tried, but the man in the rat suit tended to take away from the show's credibility. I just hope someone comes along with a show that my kids can watch that will teach them as much as Mr. Herbert did me. If not, I guess there is always DVD...

Here is the full article from the Seattle Post: TV's 'Mr. Wizard' Don Herbert dies at 89

3 comments Tuesday, June 12, 2007


Call me crazy, but this is pretty exciting! First a starting QB transfers from Wake Forest, and now a possible ND transfer?! Granted, I played with guys that transferred from "bigger" schools who turned out to be pretty lame, but some were bonafied studs. Let's hope guys like this start to choose UC right out of high school instead of coming late. But hey, beggers can't be choosers!!!

From Enquirer.com: The University of Cincinnati is among the schools Notre Dame quarterback Zach Frazer is considering after receiving his release from the Fighting Irish.

"I'm looking to see what's out there," Frazer said Monday. "Cincinnati is one I'm considering."

Frazer would not say how many other schools he's considering, nor would he name any of them.


ESPN.com reported that Rutgers, Connecticut, Miami, Louisville and East Carolina are "among the schools with mutual interest."

Frazer, a 6-foot-4, 226-pound sophomore from Mechanicsburg, Pa., asked for permission to contact other schools about a possible transfer after Notre Dame coach Charlie Weis announced last week that he would not be among the three quarterbacks who would compete to succeed Brady Quinn as starting quarterback for the Irish.

But Frazer said that's not the only reason he has decided to look at other schools.

"There was more than just that," he said. "I'm not really talking about that."

Frazer was considered a blue-chip recruit coming out of high school. As a junior, he completed 285 of 440 passes for a Pennsylvania state-record 3,674 yards and 27 touchdowns.

USA Today ranked him No. 12 on its list of the top 100 prep players in his senior year.

Frazer's father, David, told the Chicago Sun-Times that Zach has not completely ruled out staying at Notre Dame. If he leaves, Frazer will have to sit out one year and will then have three years of eligibility remaining.

0 comments Thursday, June 07, 2007

From Digg.com "The film is about two friends who have managed to trudge into their 30s with a satisfying lack of accomplishment. But a 15-year high school reunion and dire rent problems spark the novel moneymaking idea of pulling together an amateur porn enterprise. “It’s … dirty, with nudity,” says Smith. “But funny nudity, not gratuitous nudity.”"Count me in!!!



read more | digg story

0 comments Friday, June 01, 2007

I love this idea! I can't imagine that I would end up being good enough to qualify for our country's Virtual World Cup team, but this is my only real hope at being any "good" at soccer. Maybe I should go pick up the latest version of FIFA again and try to brush up a little. Afterall, it is only 3 years away... :)

Over the past year or so, I have really fallen in love with soccer. Just like my infatuation with hockey (starting about 15 years ago and ending with the NHLPA's somewhat recent strike), I think it all stemmed from a video game. In much the same manner, I found a team that I liked (Chelsea), along with a budding star (Drogba), and played the crap out of FIFA '07.

Soon after I became half-way decent at FIFA (A.K.A. understanding the tactics of the game a little), I started religiously recording games on the Fox Soccer Channel. Watching these games has become a bit of a weekend morning ritual for myself and the kids whenever Renee is not home. The best part? Leia knows who Drogba is.

Astoundingly enough, soccer has offically become my second favorite sport to watch on TV (Naturally football is #1. And no, I am not going to play that stupid football=soccer game. Soccer is soccer. Football is football). I mean, seriously, baseball is horrendously boring, basketball is only good during the playoffs or big-time college games, hockey is just annoying after the strike, and the rest (golf, bowling, etc.) can be quite mind-numbing most of the time. Some, including my former self, have said that soccer is boring, but once I started to understand how the game is really played along with how amazingly talented those guys are, it became increasingly intriguing. This new fascination makes every posession and each delicately placed pass very enjoyable to watch for me. Call me crazy, but I love it!!!

0 comments Thursday, May 31, 2007

A Harry Potter theme park sounds like a pretty cool concept. Having been enamored with the books for quite a few years now, it would be cool to take Leia and Deuce to the world of Harry Potter (once they get a little older, I suppose). I can imagine The Flight of The Hippogriff being very interesting. Throw in a virtual reality Quidditch match, and you are golden (yeah, like the Snitch). Boy, that was a bad play on words...

This raises a few questions:
1. Does this mean that Harry will be the next Mickey Mouse, Marty Moose, or Mooby?
2. I wonder if the next park will be a Lord of The Rings theme park?
3. Forget Harry, will they have a Hermione look-a-like?!?!

0 comments Tuesday, May 08, 2007

I don't neccesarily agree with all of the picks (especially #1), but I always enjoy lists like this one...

I mean seriously, how is the destruction of the first Death Star #1?

0 comments Wednesday, April 18, 2007

FTFA: "James finished the regular season averaging 27.3 points, 6.7 rebounds and 6.0 assists. He and Hall of Famer Oscar Robertson are the only players in league history to average at least 27-6-6 for three straight years."

Seriously. As a well-versed University of Cincinnati alum, and son of a man who claims that The Big "O" is the greatest basketball player ever, that is pretty astounding.

MJ, Bird, Magic, Wilt, Kareem, The Mailman, etc., etc. ...

Name all of the other great players in the history of the NBA and not one of them ever accomplished three consecutive 27-6-6 years. Not one.

This proud Akron boy salutes another. Well done LeBron, well done.

0 comments Monday, April 09, 2007

My wife and I have gotten into making our own pizza at home, and with a few trial runs under our belt we make a decent pizza. However, the biggest fan of the pizza turns out to be our 8 month old son.

Little Deucey ate his turkey vegetable baby-food dinner in a rather ho-hum manner whilst we chowed down on some homemade pizza. Apparently feeling a little jealous, he decided to lean forward with his mouth open and start whining for a nibble. Renee gladly obliged. All 3 1/2 teeth tore right into it at a feverish pace! As soon as he processed the first piece, he opened up, leaned forward, and started getting pissed off that Mommy didn't have the slice of pizza back in his mouth yet. This routine went on for at least 8-10 bites, good sized bites at that.

Renee was quick to point out that I was beaming watching my boy eat a slice of pizza for his first real food. I have to admit, it was pretty damn cool to see the little fella tear into pizza at only 8 months old. The only fear is that he will be hooked for life and want nothing else! Oh well, there are worse addictions out there.

1 comments Wednesday, April 04, 2007

My company recently replaced our two headed monster of SourceGear's Vault and Intuit's Track-It! with Microsoft's Team Foundation Server "all-in-one" solution.  While this has been a relatively smooth transition there were a couple of features creeping up that TFS didn't support out of the box (emailing developers when a work item is assigned, allowing users to email bug requests, etc.).  Luckily, Microsoft built TFS with extensiblity in mind.  Granted, the documentation on how to get some real-life problems solved is quite a bit lacking, but it is do-able.

The main resources available were bits and pieces of info scattered across blogs that needed to be congealed together to get me a working product.  One of the major sticky points was accessing, and saving to, a custom field in the work item type.  There were plenty of resources that said you flat out couldn't do it, but it seemed silly to require a unique reference name if you can't actually reference.  Luckily, my stubborness paid off. 

Below, I will detail the major steps needed to accomplish this small feat.  Is my app and associated code perfect?  No, but you will get the idea of how to get this done.

To get you acquainted, here are screenshots of my app:

Here is the main form (not much to it).  Basically, the I just display a log of what happened (checking Outlook folder, creating work item, etc.) so that the users has some idea of what is going onwith the app since it just runs minimzed in the system tray.

Options form (yeah, I know it is sloppy to not keep a list, but I had to fight scope-creep somehow):

Anyways, here is the code that does all of the heavy-lifting.  I will detail certain parts later on in this post.

/// <summary>
/// Wrapper method to call methods to actually process the emails.
/// </summary>
/// <param name="folderName">The name of the Outlook email folder to process.</param>
/// <param name="lastRunDateTime">Date and time when we ran last. Used to filter out "processed" emails.</param>
/// <param name="projectName">String holding the TFS project name to save the work items to.</param>
/// <param name="tfsServerName">String holding the TFS server name to save the work items to.</param>
/// <param name="workItemType">String holding the work item type to save the email as.</param>
private void CheckEmailInFolderForProject(string folderName, DateTime lastRunDateTime, string projectName, string tfsServerName, string workItemType)
{
try
{
//Get ready to work
this.Cursor = Cursors.WaitCursor;
MAPIFolder folder
= null;

//Set up hook-in to outlook
Microsoft.Office.Interop.Outlook.Application objOutlook = new Microsoft.Office.Interop.Outlook.ApplicationClass();
Microsoft.Office.Interop.Outlook.NameSpace objOutlookNamespace
= objOutlook.GetNamespace("MAPI");
objOutlookNamespace.Logon(
"", "", false, true);

//Get the folder and process emails
if (GetFolder(objOutlookNamespace.Folders, folderName, ref folder))
ProcessEmailsInFolder(folder, lastRunDateTime, projectName, tfsServerName, workItemType);
else
this.lstHistory.Items.Add("Folder (" + folderName + ") not found.");
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
this.Cursor = Cursors.Default;
this.toolStripStatusLastCheckLabel.Text = "Last Check Time: " + DateTime.Now;

}
}

/// <summary>
/// Recursively search Outlook for a folder name.
/// </summary>
/// <param name="folders">MAPI folder array to search.</param>
/// <param name="folderName">The folder name we are searching for.</param>
/// <param name="returnFolder">Reference field used to return MAPI folder.</param>
/// <returns>Boolean representing if the specified folder was found.</returns>
private bool GetFolder(Folders folders, string folderName, ref MAPIFolder returnFolder)
{
bool matchFound = false;

foreach (MAPIFolder folder in folders)
{
//Only process if no match found yet
if (!matchFound)
{
//Did we find it?
if (folder.Name == folderName)
{
returnFolder
= folder;
matchFound
= true;
break;
}
else
{
//Recurisve call if folders are found
if (folder.Folders.Count > 0)
matchFound
= GetFolder(folder.Folders, folderName, ref returnFolder);
}
}
else
break;
}

return matchFound;
}

/// <summary>
/// Loop through all non-processed items in specified folder and load into TFS.
/// </summary>
/// <param name="folder">MAPI folder to search for and process.</param>
/// <param name="lastRunDateTime">Only process items recieved after this datetime.</param>
/// <param name="projectName">String holding the TFS project name to save the work items to.</param>
/// <param name="tfsServerName">String holding the TFS server name to save the work items to.</param>
/// <param name="workItemType">String holding the work item type to save the email as.</param>
private void ProcessEmailsInFolder(MAPIFolder folder, DateTime lastRunDateTime, string projectName, string tfsServerName, string workItemType)
{
//Initialize string and get form setup
string listOutputString = string.Empty;
int toBeProcessedCounter = 0;
int chunk = 0;
int processedCounter = 0;


lstHistory.Items.Add(
"=======Import Starting for '" + projectName + "' project and '" + workItemType + "' work item type at " + System.DateTime.Now.ToString() + "=======");

//Get and sort the emails by received date
Microsoft.Office.Interop.Outlook.Items myItems = folder.Items;
myItems.Sort(
"[ReceivedTime]", true);

//Prepare status bar
foreach (MailItem email in myItems)
if (email.ReceivedTime > lastRunDateTime)
++toBeProcessedCounter;
else
break;

//Set up the progress bar logic
if (toBeProcessedCounter > 0)
{
chunk
= 100 / toBeProcessedCounter;
toolStripProgressBar.Step
= chunk;
}

foreach (MailItem email in myItems)
{
//Make sure it came in after our last processing time
if (email.ReceivedTime > lastRunDateTime)
{
//Add work item to TFS
if (AddItemToTFS(tfsServerName, projectName, workItemType, email))
{
listOutputString
= email.Subject + " from " + email.SenderName + " processed at " + System.DateTime.Now;
}
else
{
listOutputString
= "FAILURE: " + email.Subject + " from " + email.SenderName + " FAILED at " + System.DateTime.Now;
}

//Update the screen
lstHistory.Items.Add(listOutputString);
toolStripProgressBar.PerformStep();
++processedCounter;
}
else
break;
}

//Update settings file
Properties.Settings.Default.LastRunDateTime = System.DateTime.Now;
Properties.Settings.Default.Save();

//Update the screen
toolStripStatusLastCheckLabel.Text += " - " + processedCounter + " records processed.";
toolStripProgressBar.Value
= 0;
lstHistory.Items.Add(
"=================Import Complete: " + Properties.Settings.Default.LastRunDateTime.ToString() + "=================");

}

/// <summary>
/// Method used to save the passed in fields into TFS.
/// </summary>
/// <param name="TFSServer">String designating which server TFS is located on.</param>
/// <param name="TFSProject">String identifying TFS project to be used when loading items.</param>
/// <param name="workItemType">String identifying the type of work item to save.</param>
/// <param name="email">Outlook email object used to populate Work Item fields and contains attachments.</param>
/// <returns>Boolean denoting if the save was successful.</returns>
private bool AddItemToTFS(string TFSServer, string TFSProject, string workItemType, MailItem email)
{
try
{

//Connect to the TFS server/project
TeamFoundationServer tfs = new TeamFoundationServer(TFSServer);
WorkItemStore wis
= (WorkItemStore)tfs.GetService(typeof(WorkItemStore));
Project teamProject
= wis.Projects[TFSProject];

//Get the type of bug we need to work with
WorkItemType witBug = teamProject.WorkItemTypes[workItemType];

//Make sure we got something back.
if (witBug != null)
{
//Set standard field(s)
WorkItem workItem = new WorkItem(witBug);
workItem.Description
= email.Body;
workItem.Title
= email.Subject;

//Set custom field(s)
FieldCollection fields = workItem.Fields;
fields[
"My.WorkItems.Fields.Requestor"].Value = email.SenderName;

//Add attachments, if any
for (int i = 0; i <= email.Attachments.Count; i++)
{
//To prevent array index errors since attachment array is 1 based
if (i == 0)
continue;

string filePathAndName = string.Empty;

//Since we are dealing with IO operations, wrap in Try/Catch in case of
//permission issues or who knows what else...
try
{
//Save email attachment to temp directory (note funky non-zero-based indexing)
filePathAndName = "C:\\Temp\\" + email.Attachments[1].FileName;
email.Attachments[i].SaveAsFile(filePathAndName);

//Create and save the TFS attachment
Microsoft.TeamFoundation.WorkItemTracking.Client.Attachment attachment = new Microsoft.TeamFoundation.WorkItemTracking.Client.Attachment(filePathAndName, "Email Attachment");
workItem.Attachments.Add(attachment);

//We have to save after each addition if we want to easily delete the file when we are done.
//Saving after the delete fails because the save even then tries to reference that file after deletion.
workItem.Save();

}
catch (SystemException ex)
{
throw ex;
}
finally
{
//Cleanup the left-overs...
if (System.IO.File.Exists(filePathAndName))
System.IO.File.Delete(filePathAndName);
}
}

return true;
}
else
{
NullReferenceException ex
= new NullReferenceException("Work item type " + workItemType + " not found.");
throw ex;
}

}
catch
{
return false;
}
}

Here are some of the highlights of things I really battled with.

1. Dealing with a custom field in a work item type, which many blogs and forums seemed to think was impossible. 


First off, I had to create a new field in the work item type and add that field to the display within VS.Net 2005 (MSDN has a good bit of info on doing this.  You can start here).  Here is the defintion of the field I added (Ignore the "My" naming convention, which I truly dispise.  I did this to protect the innocent).


<FIELD name="Requestor" refname="My.WorkItems.Fields.Requestor" type="String" reportable="detail">
<HELPTEXT>Name of the user who submitted this issue.</HELPTEXT>
</FIELD>

Next, I had to add it to the screen so that we could actually see this new info (I just dropped it on the "Details" tab of the screen).


<Control Type="FieldControl" FieldName="My.WorkItems.Fields.Requestor" Label="Requestor:" LabelPosition="Left" />

Then, the truly undocumented part came.  Actually assigning data to the field programmatically.  I think it was one of those things that is simplier than everyone thought, since many forums/blogs say it can't be done.  I will give you the lead up (connectiing to TFS, creating a new work item of the proper type, etc. ... but the last two lines are where the magic happens.


//Connect to the TFS server/project
TeamFoundationServer tfs = new TeamFoundationServer(TFSServer);
WorkItemStore wis
= (WorkItemStore)tfs.GetService(typeof(WorkItemStore));
Project teamProject
= wis.Projects[TFSProject];

//Get the type of bug we need to work with
WorkItemType witBug = teamProject.WorkItemTypes[workItemType];

//Make sure we got something back.
if (witBug != null)
{
//Set standard field(s)
WorkItem workItem = new WorkItem(witBug);
workItem.Description
= email.Body;
workItem.Title
= email.Subject;

//Set custom field(s)
FieldCollection fields = workItem.Fields;
fields[
"My.WorkItems.Fields.Requestor"].Value = email.SenderName;

2. Attachments to email submissions.  Our users generally attach a screenshot with each submission, so this part had to get figured out for the first pass.  Connecting to the Outlook folder and reading the email itself was pretty simple with the help of Google (here is a pretty good resource), but the getting to the attachments and tacking them onto a TFS work item proved to be a bit trickier.  Here is what I came up with.


//Add attachments, if any
for (int i = 0; i <= email.Attachments.Count; i++)
{
//To prevent array index errors since attachment array is 1 based
if (i == 0)
continue;

string filePathAndName = string.Empty;

//Since we are dealing with IO operations, wrap in Try/Catch in case of
//permission issues or who knows what else...
try
{
//Save email attachment to temp directory (note funky non-zero-based indexing)
filePathAndName = "C:\\Temp\\" + email.Attachments[1].FileName;
email.Attachments[i].SaveAsFile(filePathAndName);

//Create and save the TFS attachment
Microsoft.TeamFoundation.WorkItemTracking.Client.Attachment attachment = new Microsoft.TeamFoundation.WorkItemTracking.Client.Attachment(filePathAndName, "Email Attachment");
workItem.Attachments.Add(attachment);

//We have to save after each addition if we want to easily delete the file when we are done.
//Saving after the delete fails because the save even then tries to reference that file after deletion.
workItem.Save();

}
catch (SystemException ex)
{
throw ex;
}
finally
{
//Cleanup the left-overs...
if (System.IO.File.Exists(filePathAndName))
System.IO.File.Delete(filePathAndName);
}
}

3.  Minimizing the app to the system tray.  Granted, this is not new news or impossible to find suggestions for on the web, but this one seemed like the simplest solution.


The steps involved are adding a notify icon to the form (simple enough).
Add a little logic the form's resize event:


private void MainForm_Resize(object sender, EventArgs e)
{
if (FormWindowState.Minimized == WindowState)
Hide();
}

Then, to get the window to return to normal when double-clicking the notify icon, or via the context menu, I just added this code (which gets called from those two events).


private void RestoreMinimizedWindow()
{
Show();
WindowState
= FormWindowState.Normal;
}


Again, there are a million ways to do this out there, but this one seemed to be the least painful to me.


That should just about cover it.  Let me know if you have any questions about any of this, and I will try to get back to you ASAP.