Tuesday, October 11, 2005

SiteMeter Global Map: Cool Stuff

I use SiteMeter for stats on this blog.  I’ve always joked that my blog’s read only my Mom and some guy in Pakistan who accidentally subscribed to my feed.  SiteMeter’s statistics are a great way to prove/disprove that assertion.

One absolutely shiny thing about SiteMeter: their global map.  The map shows you where in the world folks are hitting your site/blog/whatever from.  The map below shows more folks than my Mom are indeed visiting my blog — unless Mom’s doing a Where In The World Is Matt Lauer or similar gig.

Clicking on any dot will bring up a page showing all kinds of cool info on who stopped by your site.  You get referring URLs, browser specifics, lots of cool stuff.

SiteMeter’s basic stats (which I use) are free.

<disclaimer>I don’t get any bucks from SiteMeter.  I just think their service is cool.  Amazing what powerful stuff is available on the web for free.</disclaimer>

 

Now Playing: Screaming Future Axe Murderers — Xylophone and Pennywhistle Insanity.  Good thing it’s nearly bedtime for my kids.  Then this music will stop and I can relax with a cup of this and get some more work done on NHibernate.

Dayton-Cincy Code Camp

As I announced earlier, James and I are putting on a Code Camp for the Dayton-Cincinnati area on 1/21/06. We've already had some good news on various points. We've had five or six folks express interest in presenting, and we've got two large sponsors lined up already. One's even paying for breakfast and lunch, which is pretty much the highlight of my day. We're still working on a venue, but we've got a lot of good options in the West Chester area just north of Cincy. Check out the post noted above if you're interested in presenting. Now Playing: The Tubes -- The Best of the Tubes. It doesn't have Malagueña Salerosa, White Punks on Dope, or Mr. Hate, but there's still a lot of good tunes on this. Hey, it's got Attack of the Fifty Foot Woman and Sushi Girl, so it can't be all bad. (Plus I got it on sale for like five bucks. Heh.)

NHibernate Tools: ObjectMapper

I’ve been mostly asleep since Saturday evening trying to get over some grunge my son brought home from Sunday school daycare last week.  Ugh.  Thankfully I got mostly over it before my wife had to leave on her regular biz travels, so I’m semi-coherent and able to try and knock off some more things with NHibernate and the project I’m working on.  (Dude, you’re not coherent when you’re in good health! — ed.)

James pointed me to ObjectMapper as a tool which might help me resolve some NHibernate mapping issues I’ve run into with many-to-many relationships.  ObjectMapper gives you the power to do various reverse-engineering tasks: from database to model, from assembly to classes, from classes to tables. All of that, in either direction.  Pretty slick.

ObjectMapper won’t let you work backwards from existing .NET 2.0 assemblies, but that’s not a show-stopper.  I’ve been working from my existing database model, generating up to classes and then having ObjectMapper generate mapping files for NHibernate.  One hitch to using NHibernate and ObjectMapper is that you need to get all the relationships done at once before you start using any access points.  I’m working on a DB schema with 12 inter-related tables.  (No, they don’t all tie to each other in a spaghetti-like mess!)

I think you can get around this by leaving out the <bag> or <set> elements you use to define inter-entity relationships; however, now I’m running into odd schema errors with <id> elements being out of place.  I’ll blog on that solution once I figure it out.

NHibernate seems like a great thing, but it’s certainly a huge PITA to get up and running.  Unclear documentation and rudimentary examples aren’t a big help.

Now Playing: Sheryl Crow — Steve McQueen.  It’s only three songs, but Steve McQueen has a killer beat to it.  I first heard this at a 3D remote control helicopter competition at the National Remote Control Modeler’s Museum in Muncie, IN.  A female pilot fired up this music, launched her ‘copter, and did amazing tricks for about five minutes — with the ‘copter rarely climbing more than five or ten feet above the ground.  I was there with my Dad and daughter, so this short disc brings back great memories.

Friday, October 07, 2005

More on NHibernate: Good Explanatory Article

NHibernate’s documentation, as politely as I can put it, leaves a lot to be desired.  Maybe folks who are more smarter than I am can decypher the information, but I’m finding it nearly useless for figuring out how to get some functionality working.

Justin Gehtland wrote a great NHibernate article on TheServerSide.NET.  Good diagrams, pretty clear explanations.  This article cleared up the discriminator element’s function — the NHibernate dox were useless blabber.  The discussion of one-to-many and many-to-one relationships is also good.

Now Playing: The Fabulous Thunderbirds — Walk That Walk, Talk That Talk.  I really dig whatever label you want to put on this genre.  Rockabilly, Texas Rock, Just Plain Good Tunes.  I’ll count The Mavericks in this same arena, although their lyrics are usually just a couple short bits repeated over and over.  In any case, the T-Birds are good stuff.

More on NUnit Config Files

Charlie Poole, the Master of All Things NUnit, gives the Real Truth on how NUnit finds config files for tests. Clear and concise. Read and understand it if you're using NUnit. His trick for checking whether or not you're reading config files is a great one.

Now Playing: Warren Zevon -- The Best of Warren Zevon: A Quiet Normal Life. Werewolves of London, Send Lawyers, Guns and Money, and Roland the Headless Thompson Gunner, all on one album. What more could you ask for?

Thursday, October 06, 2005

Byte Array Indexers and Properties

I ran into a neat problem this afternoon while trying to use a byte array indexer to set an array cell to a particular value via a business entity property.  I say it was a “neat problem” because things didn’t work like I’d expected, but I was able to quickly figure out what the issue was.  It would have been a “#@%">“#@%*&!!! problem” if the lightbulb wouldn’t have turned on quickly.

My biz entity has a byte array for storing photos, with a few checks on the setter to ensure we’re not trying to store too large an image:

private byte[] _photo = null;
public byte[] Photo        
{            
   get { return _photo; }            
   set            
   {                
      if (value != null)                
      {                    
         if (value.Length > NS_MAX_IMAGE_SIZE)                    
         {                        
            throw new ArgumentOutOfRangeException("value", value, "Image size too large");                    
          }                
      }                //Clone array, not assign since Arrays are reference types                
      _photo = (byte[])value.Clone();                
      _isModified = true;            
    }       
}

The “neat problem” popped up as I was writing a test to check the Equals() method when one of the two entities being compared had its Photo property as null.  I create one BE with Photo as null, then set the other to a non-null by storing in a single byte:

right.Photo[0] = 0xF;

Well, that got me a NullException error, so I stepped through trying to figure out why the null checks in the property’s setter weren’t behaving as I expected.  Stepping into the assignment above ( right.Photo[0] = 0xF; ) jumped me into the Property’s getter, not the setter.

‘Tis a puzzlement, to quote King Mongkut.

Wait.  Slap forehead.  I’m using an indexer to set a cell of the byte array.  That means the statement needs to work on the actual byte array, so of course the getter is used to return the array before the value’s set.  Duh.

Now I’m creating a new byte array with the appropriate value and using the property’s setter.  Works much better and it was a “neat” problem to work through.  (Quickly, thankfully!)

Now Playing: Guster — Lost and Gone Forever.  Maybe even better than Keep it Together, an album which I love.

Wednesday, October 05, 2005

Setting up a Non-Profit Organization

We’re moving the Dayton .NET Developers Group to non-profit status to make it a bit more attractive for other organizations, individuals, and companies to donate goods or services to us.  (Most straight cash support can be written off a business’s marketing effort expenses.)  Bob Sledge, our group’s new Treasurer, has been finding lots of great reference links.

Here, in no particular order, are some great helpful links:

I’ll post up other bits and pieces as we continue down this road.

Now Playing: Beck — Odelay.  I saw these guys on Letterman the other night and thought they were pretty cool.  I also nabbed “Black Tambourine” which they played on Letterman.  Pretty funny to have found these folks on that show — I never, and I mean never watch Letterman since I’m either at my computer working or heading for much needed sleep.  Dunno if I’ll like this music in a month or so, but it’s different and cool right now.

Sunday, October 02, 2005

Technorati -- Maybe I Just Don't Get It

I’ve had a link on my blog to Technorati for nearly the entire (short) period my blog’s been alive.  A couple months ago, my Technorati listing finally got over one page length of sites linking to my blog.  Unfortunately, I’ve never been able to see more than the first page of links. 

I get this lame error “Sorry, we couldn't complete your search because we're experiencing a high volume of requests right now. Please try again in a minute or add this search to your watchlist to track conversation”  every time I try to go to the second or third page of links.  Every time.  No matter when I try it, no matter how many times.

Maybe I’m just lame (highly possible), but what’s the big deal about Technorati if their basic searches won’t get you a decent result set?

More on NHibernate and Nullables

James Avery got a slick solution set up for using true .NET 2.0 Nullables in NHibernate. Check out his blog post, grab the code, and have at it. The only limitation I've found so far is that the generator class for ID values won't support Nullables. Hopefully he or I will get a fix for that soon.

Dayton - Cincinnati Code Camp!

James Avery and I are planning a Code Camp for Saturday, January 21st, 2006.  We’re still working on a venue, but it will be in the Union Centre area of West Chester, Ohio.  We’re still working out details, but we’re looking at a one day Camp running from 9am to 6pm, maybe a bit later.  Sessions will be 60 minutes long and will be code-centric.  We’re not looking for marketing folks to come in and show us a bunch of Powerpoint slides.

Here’s the cool thing: YOU get to decide what’s on the agenda.  We’ll get submissions from various presenters, consolidate the list, and pass it on to folks who might attend.  Attendees will vote on the sessions they’d like to see and we’ll assemble a final agenda from the winners.

We’re looking for presentations on a wide range of topics, even outside the .NET arena.  Topics folks from Dayton have expressed interest in include:

  • XP/Agile development
  • Enterprise Architect / Data Modelling and UML
  • Security in .NET
  • C#/VB.NET Essentials
  • Multi-Tier Architecture
  • Web services fundamentals / in-depth
  • Win forms vs ASP.NET
  • Sharepoint/biz talk
  • Enterprise library
  • Compact Framework/mobile
  • .NET & Active directory
  • Using SQL DBs
  • Source control
  • Productive use of VS and other tools
  • XML

Other areas which would be of interest:

  • Development in Ruby
  • Mono
  • Toss something in and we’ll consider it!

Be sure to check James’s blog for topics the Cincy folks are interested in.

Interested in attending?  Monitor my blog or James’s for more details.

Interested in submitting some presentations?  E-mail me at jim-A.T-IterativeRose-D.O.T-com-REMOVEME with the following information:

  • Topic Name
  • Description (Abstract)
  • Target Audience

Presenters may submit a maximum of five sessions and will be limited to a maximum of two actual presentations.  Yes, yes, I said the attendees get to select what topics they want, but we’re shooting for a nice diverse agenda.

Be sure to monitor our blogs for more details.  James and I are both pretty excited about putting this together!

Saturday, October 01, 2005

Recipe Blogging: Fall Tomato Salad

We’ve got an abundance of wonderful cherry tomatoes in our tomato thicket.  (Mexican Midget tomatos from Seed Savers.) Yes, I wrote that correctly.  We have a thicket of tomatoes courtesy of a large number of volunteer plants which took off.  I just sort of point them to the fence and over a few poles I had up for our beans and peas.  They go nuts and give us billions of wonderful cherry tomatoes.

I love tossing these tomatoes in with some just-cooked orzo pasta, a bit of minced garlic, some parsley, and some top-notch extra virgin olive oil.  It’s a killer dish, plus it’s quick and easy to make.

Fall Tomato Orzo Salad

1.5 c. cherry tomatoes

1 c. orzo pasta

1 small clove garlic, minced

3 – 6 Tbs best-quality extra virgin olive oil

2 Tbs minced parsley

Parmesan cheese

  • Bring a fairly large pot of water to boil.  Add a good pinch of salt to the water, then boil the orzo until just cooked, about five minutes.
  • While the orzo’s cooking, mince the garlic using a bit of salt (helps get the oils out).  Scrape into a nice serving bowl and add the olive oil, parsley, and tomatoes.
  • When the orzo’s done, drain it well and stir into the bowl while still piping hot.  Dust with parmesan cheese.

Notes: 

I love garlic, but don’t get carried away with it in this salad.  You want just a hint of it, not a 2x4 in the chops.

Friday, September 30, 2005

YANSR (Yet Another Serenity Review)

I just got back from watching Serenity.

Holy s#|t.  George Lucas weaps in shame and wishes he had one eighth the writing skills Joss Whedon has on his worst day.

I detest simple story lines where everyone lives happily ever after at the end of a movie where no character’s had to sacrifice and everything’s wrapped up in a pretty package.  Life isn’t that way.  Life is wonderful, but it often sucks.  Badly.  People get hurt, people die, loose ends remain untied at the end of the day.

Serenity certainly doesn’t fall into that lame rut, and I loved the movie for its dark themes and sacrifices.  I really enjoyed doing literary analysis on good movies and books back when I was finishing up my degree in night school.  I loved comparing and contrasting various stories with the classical hero theme: a journey, arrogance, doubt, sacrifice, redemption, mercy. 

Serenity has all these elements wrapped into it in spades, plus there’s a great amount of humor.  One of the bloggers I linked in my previous Serenity post made the great observation that Whedon’s not afraid to let one liners fall flat, just like they do in real life.  The audience, admittedly a bunch of Firefly fanatics, repeatedly roared throughout the entire movie, and even broke out into applause a couple times after good lines.

Whedon maintained the depth in all his characters, something I loved about the series.  The interplay between all of them is terrific, although Jayne is much more assertive and stands up to Mal more than he did in the series — where he on occasion showed outright fear of Mal when Mal’s game face was on.  Z�e’s character also has some key questions for Mal at critical junctures, something which brings about Mal’s crisis of doubt.  Characters this rich are tough to find in any story.

Other “trivial” stuff about the movie: The action is great and fun.  There’s a large amount of violence, but I’d say the gore isn’t bad at all.  The violence fits right into an appropriate context, so it doesn’t bother me.  As noted on other blogs, some of the special effects are a bit weak, but I didn’t care.  The cinematography is simply incredible.  I love that Whedon kept the same flavor as the TV series with zooms (“The cheese factor” as Tim Minear said in the Making Of spot on the DVD set), bouncing/jiggling shots, and even some cool flares popping into the screen.

Serenity is by far the best movie in any genre I’ve seen in a long, long time.

<SPOILER_ALERT>

Sue me for saying it, but I’m glad to see Ron Glass’s character, Shepard Book, killed off.  Book was a great idea, but I always cringed when Whedon had Glass trying to pull off something pious or deep in faith.  In the Firefly DVD set’s Objects in Space commentary, Whedon talks about his lack of faith.  I always felt the religious aspect of Book’s character came off very weakly, and I cringed at several points during the series when Ron Glass, a Buddhist, tried to pull off a priestly homily.  Don’t get me wrong, I really enjoyed Book’s character on most occasions, but boy, did I hate those instances where his lines just fell completely flat because neither Whedon or Glass had a clue of where the character should have been coming from.

Wash’s death hit hard, but man o’ man, was it incredibly well pulled off.  Z�e’s shock and loss (and the audience’s!) run head long into Mal’s game face hardass insistence on keeping moving to get the mission done.  Whedon carries the audience and suviving crew through the climactic crisis in the same numbed, get-the-job-done-and-survive fashion, then leaves everyone with a bit of breathing space to let the shock settle in.  It’s simply an amazing section of work that left me, uh, amazed.

</SPOILER_ALERT>

Now Playing: Crosby, Stills, Nash, and Young — American Dream.  Screw those pompous foreigners with their anti-American pandering.  I like my anti-American music home grown where the artists at least have a grasp of what life here really is.  (Or sort of have, should have, might have.)  This isn’t CSNY at their best, but I absolutely love In the Name of Love, That Girl, and This Old House.

Thursday, September 29, 2005

NetGear Router & FTP Problems

My new Netgear firewall/router/dsl modem was not cooperating with FTP sessions at all.  I couldn’t reliably publish pages for our user group or my LLC.  FrontPage couldn’t list any pages on the remote system, FTP timed out, ncftp via Cygwin wasn’t any better.

Sucky.

A quick bounce to Netgear’s product page showed that my “new” router is actually a fairly old model and the firmware was waaaay out of date.  A quick download of the new firmware followed by a quick flash of the new version and Poof!  Everything’s shiny and working fine.  (Frontpage still sucks, though.)

 

Now Playing: The Who — Who’s Next (Remastered).  Killer stuff.  ‘Nuff said.

Wednesday, September 28, 2005

NHibernate and .NET 2.0 Nullables (Ooops)

On occasion one makes a really, really dumbass mistake.  My previous post on NHibernate and .NET 2.0 Nullables was just such a beast.  Encapsulation’s a great thing, as long as you can get the right forms of data to the right places. 

The only problem?  My altered business entity had no way for NHibernate to stuff in those goofy custom nullable types — NHibernate accesses everything via properties, and I’d changed the public interfaces to the .NET Nullables, not the NHibernateContrib custom ones.  Sure the tests ran fine, but they weren’t using the NHibernate Nullables.

Duh.

Back to the drawing board.  One alternative is to create a service layer using an Adapter pattern which sits below the data access layer.  That service layer would be responsible for converting “real” BEs to ones using NHibernate’s custom type.  I fooled around with a quick bit of work on that.  Here’s a quick diagram of what I came up with, although note I’m not doing Test Driven Development and haven’t implemented anything yet.

Frankly, it’s late and I’m off for bed, so there’s no more getting done on this tonight!

Now Playing: Buena Vista Social Club (soundtrack).  Great stuff for frazzled brains.

Serenity Blogs

If you haven’t heard, the folks pushing Serenity (the movie follow on to the incredible series Firefly) opened early screenings to bloggers.  (This after having had three sets of early viewings nationwide for diehard fans.)  Of course, I live in Dayton where no such cool thing would ever happen.

Still, I can enjoy some of the blog reviews here, here, here, here, here, and here.

This one here is a particularly interesting summary of the culture surrounding Serenity/Firefly.  Makes for good reading.

Now Playing: The B-52s — The B-52s.  My wife hates the B-52s, so I have to listen to them when she’s not around.  I’m brainwashing both my kids to love them.  It’s OK because she’ll get me back by playing lots of Nirvana for them.

Tuesday, September 27, 2005

Current Reading

July, August, and September were stuffed with me reading scads of technical books.  Among the titles I blasted through were, in no particular order:

  • Lean Software Development
  • Effective C#
  • Expert .NET Delivery With NAnt and CruiseControl.NET
  • Visual Studio Hacks
  • Writing Portable Code
  • The .NET Developer’s Guide to Windows Security
  • 19 Deadly Sins of Software Programming

Add to that frequent references to Building Applications and Components with Visual Basic.NET, Programming .NET Components, and Design Patterns.

Needless to say, I was pretty groggy after all that.  A break was in order, so I’ve spent the last ten or so days plowing through Halderman’s Forever series: Forever War, Forever Peace,  and Forever Freedom, plus re-reading Drake’s Counting the Cost.  (I’d given up on trying to re-read Anderson’s Harvest of Stars.  The story was OK, but I just couldn’t get over the hideously campy dialog.  Sorry.)  Also toss in a re-read of Scalzi’s fantastic Old Man’s War just so I could remain positive about the guy after his odd rants on Katrina and poverty.

Now, to steal a line from The Holy Grail, I’m feeling much better.  I think I’ll go for a walk.  Or at least get back to trying to get some decent writing and coding done, not to mention trying to get back into the study grove so I can knock off another MCSD test which I’ve been procrastinating for far too long…

Now Playing: Little Feat – Let It Roll.  Amazing how iTunes’s “Shuffle” feature will remind you about some great music you’d lost track of for a whole lot of years.

Sunday, September 25, 2005

Top 50 Sci-Fi Shows

The Boston Globe has posted a list of their top 50 science fiction TV shows. The list's somewhat psychotic, though. The Avengers, Batman, and Tales from the Crypt are listed. Tales from the Crypt and Batman fer cryin' out loud? Yeesh. They also left out the terrific UFO, a campy, terrific show from 1970. I think they've hit a lot of things spot on, so it makes a fun read despite the stupid crap they've got in a few spots.

Friday, September 23, 2005

Great Patterns WebCast

Talk about a timely find: Our Developers Group’s last meeting had Martin Shoemaker talking about Architecture Patterns in C#.  Today I finally got around to looking at this month’s webcasts on the MSDN DVD.  Whoopee!  I found that Craig Utley has a terrific webcast on Pattern Based Development using the .NET Framework.

It’s a 90 minute webcast and he gets into some great detail.  I’m only at the 40 minute point, but he’s gotten into great detail on Singleton patterns, even dealing with multi-threading issues.

You can find a copy of the webcast here.  It’s worth the download!

One note: the first 20 minutes are fairly introductory to patterns, so skip past that if you’re familiar with the background of patterns, the Gang of Four, and how Microsoft is working hard at pushing patterns and practices.

Thursday, September 22, 2005

Selling the Agile Concept to Customers

Ben Carey’s written a terrific post inspired from the “Advances in Agile” session he had at PDC.   Ben gives some great insight on how to deal with Statements of Work (SOWs) and companies which budget for Big UpFront Design (BUFD) or alternatively Big Design Up Front (BDUF).  Check out his thoughts on how to deal with this.

For an alternative view, read Joel Spolsky’s opinion of doing BDUF.  Alternatively to Joel’s alternative, these folks say Joel’s not doing BDUF, he’s doing EDUF (Enough Design Up Front).

Recipe Blogging: Ginger Oil Chicken

Several years ago a good friend took me out to Full Kee restaurant at Baileys Crossroads in Alexandria, VA.  We had an amazing meal there, part of which was a dish called scallion oil chicken.  It was a chicken perfectly poached in a lightly aromatic broth, then served with some finely minced ginger macerated in some oil.  The chicken was cut into bite-sized pieces which you nabbed with chopsticks and dabbed into the oil.  It was just amazing stuff: wonderful, subtle flavors, and an incredible texture brought about by cooking the chicken to exactly the right point.

I’ve thought about the dish occasionally, but never gave a shot at reproducing it — until Tuesday night.  This isn’t exactly what I had at Full Kee, but I hope it’s in the spirit of the recipe.  My family sure loved it.  I call my variant “Ginger Oil Chicken” simply because I could never figure out exactly where Full Kee used scallion oil in their recipe.

This recipe’s all about simplicity and subtlety.  Find as fresh a chicken as possible, preferrably free-range or organic.  Don’t get carried away with the aromatics in the poaching liquid.  Don’t gussy things up with soy sauce, hoisin, or any number of other things which are wonderful in other contexts.  Keep it simple and reap the benefits!

Ginger Oil Chicken

1 fresh chicken, 3 – 4 lbs.  (Use free range or organic if you can find it.)

2 carrots, scrubbed and split

2 stalks celery, cleaned

1 medium onion, skinned and cut in quarters

3 star anise

1 stick cinnamon, broken

4 – 6 cloves

2 coins ginger

Dipping Oil

2 Tbs finely minced ginger, including the skin (See Notes)

pinch kosher or sea salt

1/3 c. canola oil

  • At least one hour before serving, prepare the dipping oil.  Finely mince the ginger and scrape into a small bowl.  Mix in the salt and let sit for ten minutes.  Pour in the canola oil, stir well.  Set aside to steep as you cook the chicken.
  • Cut the skin between the thigh and body of the chicken.  Season the body cavity of the chicken with salt and pepper, then put in a few pieces of carrot, onion, and celery.  Place the chicken in a large pot.  Add the remaining vegetables, star anise, cinnamon, cloves, and ginger.  Cover with 1” of water and place on the stove over high heat.  Bring to a simmer.
  • Cover the pot, lower the heat and keep at a bare simmer.  Simmer for 45 minutes.  (A bare simmer here is critical to keep the chicken from getting too rubbery as it cooks.)  Turn off the heat and let sit for another 15 minutes.  Cut into the thigh and breast to check for doneness.  If the chicken’s cooked through, remove it from the pot and drain.  If not, bring back to a simmer and simmer another 15 minutes.
  • Remove the chicken from the pot and drain well.  Remove the vegetables from the body cavity.  Using shears, a heavy chef’s knife, or better yet cleaver (I ain’t got one.  Boo hoo.), cut the chicken into bite-sized pieces.  Place on a serving platter.
  • Serve the chicken with the oil.  Folks should lightly dip their pieces in the oil, getting a bit of ginger in addition to the oil.

NOTES:

I actually used five-spice powder in place of the cinnamon, cloves, and ginger; however, that powder stuck to the skin of the chicken, rendering it rather ugly.  Five-spice is based on star anise, fennel, ginger, cloves, and cinnamon and I’m pretty confident of my recommendation.

Make sure to include the skin when you’re mincing up the ginger.  Yes, yes, normally it’s shaved off, but it lends an interesting complexity in this context.  Do please scrub off the ginger first, though!

 

Now Playing: Jason Mraz, Mr. A-Z.  This isn’t anywhere near as good as his Curbside Prophet albumn which I absolutely love.  As a matter of fact, I’d say this albumn sucks, or I would say that if I hadn’t paid $12 on iTunes for it.  Bummer.

Subscribe (RSS)

The Leadership Journey