Monday, October 24, 2005

Dayton-Cincinnati Code Camp Registration Live!!

We've got a live registration link for the Dayton-Cincinnati Code Camp on January 21st, 2006! Check out my earlier posts on the Code Camp here and here, then go sign up if you're in the area and interested in attending! Are you a speaker interested in presenting? Please check out the submission guidelines on the first post and get your topics in! Now Playing: Santana -- The Essential Santana Two disks, 32 songs, loads of Santana goodness. Amazing that the guy's put out nearly 40 albumns!

Great Online Sci-Fi Resource

Baen books, home of books by incredible authors like Kieth Laumer, Larry Niven, Jerry Pournelle, David Drake, and 15 or 20 other wonderful scribes, has a passle of their classic books available online for FREE. 

Check out their library here, and be sure to read Eric Flint’s thoughts about online piracy and why Baen has put so many great titles up.  The draconian fools in the recording industry ought to pay attention to Flint’s thoughts that “ Any cure which relies on tighter regulation of the market — especially the kind of extreme measures being advocated by some people — is far worse than the disease.”  Maybe they’d stop prosecuting 12 year olds for downloading music and open up a better economic model.  And maybe monkeys will fly out … 

Nevermind.

In any case, check out the library.  They’ve also got downloads for various readers, which makes it even better!

I’d run across this some years ago, but had forgotten about it until I saw a reference on Instapundit today.

Thursday, October 20, 2005

Political Blogging: The Coburn Anti-Pork Amendment

Warning: incandescent, searing rant against my Republican party. Keep small children away from the screen. Both my Senators here in Ohio voted today against the Coburm amendment. The Coburn amendment would have moved some of the rediculous amounts of pork in the budget over to paying for hurricane Katrina reconstruction costs. (Some of the best commentary on the Coburn amendment is at Instapundit. Just keep scrolling through and checking the links.) Only 13 Senators had enough brass tacks to vote against pork in order to help pay for reconstruction in Lousiana. There's a complete list of how the votes fell here. I am absolutely disgusted that my Republican senatorial representatives care less about fiscal sanity than idiotic, bloated, asinine earmarks. In fighting the war on terror, my President has shown great courage and leadership in standing up to the most difficult, unpopular effort faced by a leader in a long time. I wish he would show some of that same courage and leadership in domestic matters, but he's abdicated everything to the irresponsible children on Capitol Hill. Tomorrow I'm calling the offices of both Senators DeWine and Voinovich to let them know they won't see one red cent of campaign contributions from me. I'm not a huge contributor, but I refuse to spend my money to re-elect either one of them. I will also most likely vote for whaterver Democrat is running against them when they next come up for reelection, and I'm going to make that clear to their offices. Neither Senator has shown an ounce of fiscal leadership. Right now I think the only way to fix this domestic insanity in Washington is a return to divided government where the Presidency and Congress are controlled by different parties. My Republican party, supposedly for small government and less spending, has shown itself completely incapable of having control over the reins. At least a divided government will somewhat limit this madness.

Now Playing: Dire Straits -- Alchemy

I'm hoping Mark Knopfler's amazing guitar can somewhat calm my rage.

More on NHibernate and Nullables

NHibernate has their v1.0 release out.  Incorporating that with James’s Nullables2 (for support of native .NET 2.0 C# Nullable types) is a snap.  Download the 1.0 release files, drop the DLLs from the project’s bin directory into NHibernate.Nullables2\NHibernate Files\ and rebuild the Nullables2 solution.  Move the NHibernate.Nullables2.dll and the regular NHibernate DLLs wherever you need them in your projects.

By the way, to get green lights in NUnit, you’ll need to reference Nullables2 in both the project where you’re doing your data access and the project holding your unit tests.  Otherwise you’ll end up with NHibernate.MappingException errors stating that “could not interpret type” with the specific NullableType called out.

Now Playing: Off Kilter — Celtic Armadillo.  Five guys in combat boots and kilts mix bagpipes, drums, bass, guitar and keyboards.  We saw these guys at Disney World’s Epcot center where they put on a terrific show.  They do plenty of traditional Irish music, but they’ve got some contemporary things too.  Alive is an absolutely killer track.  The only downer on this CD is that it seems like a pretty amaturish production — there are a couple tracks which run over each other.  That really pisses me off because I had to shell out $20 for the disk.  Bah!

Wednesday, October 19, 2005

NHibernate Associations

Looking for good documentation in NHibernate’s help files on associations (relationships between objects) ?  Here’s what you’ll find in the 1.0.0.0 NHibernate Documentation file, right after the text that says “Association mappings are often the most difficult thing to get right. In this section we'll go through the canonical cases one by one, starting with unidirectional mappings…”

Nice, huh?  Check out the Hibernate dox, even though Hibernate’s a Java project.  The concepts seem to be pretty clear and I’m hoping I’ll be able to translate things to NHibernate without too much trouble.

Now Playing: The Corrs — In Blue.  I was looking for Celtic pop.  This may be a little too dance music-ish for me, but the harmonies seem nice.

NHibernate Tricks: Locating the Mapping Files

The various examples I’ve seen of NHibernate all had the mapping files (*.hbm.xml) in the same location as the business entities (BEs) they map.

That kind of sucks for trying to abstract out your data access.  Storage-specific stuff shouldn’t be co-located with your BEs, it should be in a storage-specific project.  Like a Data Access Layer project.

No problem.  Create or move your map files in your DAL project.  Make sure the map files are embedded resources, not content.  (Check the “Build Action” field in the file’s properties.)  Ensure the DAL project references NHibernate.dll — but you figured that out already since you’d have had beaucoup problemos with your “using” statements, so why am I beating a dead horse?

Now mod the constructor of the class you’re using to do all your data access, adding in a statement to add the DAL assembly to NHibernate’s Configuration.  Here’s what I’ve got for my PersonTypeDA class:

public PersonTypeDA()

{

   Configuration cfg = new Configuration();

   cfg.AddAssembly("nUGSoft.DAL");

   factory = cfg.BuildSessionFactory();

}

You’re now telling NHibernate to look at the current assembly where you’ve embedded the mapping files for your BEs.  The single statement cfg.AddAssembly("nUGSoft.DAL");  loads all maps in the assembly, so you don’t need to worry about trying to keep straight which BEs are referencing which others are referencing which others are referencing which others… Nevermind.  You get the picture.

Poof!  Everything’s happy, and you’ve got your persistence-specific stuff separated out where it belongs.

Shiny.

Now Playing: Neutral Milk Hotel — In the Aeroplane Over The Sea Nifty stuff with lots of very different musical instruments (flugelhorns!), odd lyrics.  Lots of fun.  I told James it was kind of like goat meat.  Interesting once, but I’m not sure how often I’ll eat it.  Wait, that was either Rage Against The Machine or System of a Down.  Nevermind.  But it was a cool analogy all the same.

Tuesday, October 18, 2005

Rhapsody: Terrific Music Service!

I’ve been griping about all the money James has been costing me via his music recommendations.  Now he’s gone and made a recco which will not only save me significant bucks, but allows me to check out scads music I haven’t had the opportunity to before: Rhapsody online music.

Rhapsody’s “Unlimited” service costs $10 per month, but gives you unlimited browsing of their huge online library — something like over 1 million songs.  I think their UI is a bit sucky, and it’s a performance hog on my older, slower PC (1.3Ghz, 512MB RAM), but the service itself is incredible.

In the three days since I signed up I’ve been scattered all over the music dartboard: Springsteen’s Born to Run and The Rising, The Who’s Quadrophenia and The Kids Are Alright, Dengue Fever (Cambodian rock), The Clash’s Give ‘em Enough Rope, Knickelback, Sigur Ros, The Kinks, Drive By Truckers, Coldplay, and about 20 other interesting things I can’t remember.  (One of my gripes is the lack of a useful history indicator in Rhapsody’s UI.)

This really is great stuff, because for $10 per month I’m able to chase down all kinds of stuff I never would have looked at before.

The final drag is that they’ve got nada, zilch, zero Tubes in their library.

Philistines.

<disclaimer>I get no money or any comp from these folks.  They’ve no clue who I am. I just like the service!</disclaimer>

Wednesday, October 12, 2005

Manly Man Blogging: Burley New Mower

Being a stay at home Dad who takes care of the vast majority of cooking, kid transportation, diapers, and laundry, I fight for every instance where I can assert (defend) my Male Role Modelness.  Today is just such a glorious day.

I now have in my shed one of these beauties. It’s actually a used older model, but still basically the same masculinity-loaded piece of machinery.  9.5 horsepower motor.  Enough noise to require ear protectors.  (Which is a bummer, since I normally listen to my iPod while mowing.)  A real gearbox with four forward and one reverse speeds.

It will also cut much higher than my soon to be retired mower.  This is nice because I try to keep my lawn fairly long as part of my mostly-organic lawn program.

Best of all?  A 33” cutting path via two, count ‘em, two blades.  My lawn usually takes me 65 – 75 minutes to mow with the old mower, and I pushed that thing fast as a workout.  Using my new toy today it took me 30 minutes.  30 friggin minutes!  And that was with having to figure out how to efficiently get this monster around the flowerbeds and trees throughout the yard, plus the usual distractions of my daughter showing me how well she’s learning her cartwheels.  (A distraction, but what a good one!)

There are a couple downsides to this.  First, it’s a monster to get around corners and curves in the yard, but mowing the lawn’s one of the few regular exercise events I get, so that’s not a bad thing.  Secondly, because it’s such a monster, I won’t be able to shovel off mowing to my kids until they’re a few years older than I was planning on.  (Six isn’t too young for my daughter to use a mower, is it?)

Now Playing: Franz Ferdinand — Franz Ferdinand.  Another great recommendation from James. He’s really starting to annoy me with his recommendations for music.  I’m blowing much of my discretionary budget (fun money) on stuff he’s pointing me to, curse him.

NHibernate Update

Still slogging away at NHibernate, still learning many good lessons.

First off, start with a small data model.  Get that working, then add in other related chunks. This will save you many headaches while you get NHibernate’s complex mapping properly created.

The project I’m working on has a moderately complex data model:

12 tables, 11 of which have various relationships.  NHibernate requires that you have all dependent relationships mapped out before it will work properly.  This means you can’t just wire up a few of these entities, say Person, PersonType, and PersonTypeLink, and press on.  You need to get <bag> or <set> elements defined in your maps for all relationships, not just the ones you’re interested in.

I’m most of the way through getting all entities mapped; however, if I had to do it over again, I’d literally drop tables I wasn’t concerned with, get maps and tests running on a subset, then proceed with wiring in other related tables.  For example, following on the group I listed above (Person, PersonType, and PersonTypeLink), I’d drop everything else, get maps and tests working on those three.  Then I might add in Post and PostType, followed by Subscription, SubscriptionLink, and SubscriptionFormat.  Next would come Location, Event, and Attendance.  Then I’d have Newsletter as the last table — an easy one with no links as dessert.

In one sense, this is sort of what I’ve done.  I went so far as to create another database and built in tables one by one with the appropriate references (but none of the “fluff” fields), then I used ObjectMapper to generate classes and NHibernate’s mapping XML.  This let me check what I was getting from ObjectMapper when reverse-engineering my existing table and classes.  (ObjectMapper calls that “syncronization.”)

Two more semi-major modifications have to happen to my business entities:

1) I have to add members to store other business entities for tracking relationships (one-to-many, many-to-many).  NHibernate works with both a Parent and Child object at the same time, so it gets/sets them via a Property.  I really didn’t want to add this weight to my business entities, plus this ties the entities somewhat to NHibernate’s concept of operations.

2) I have to implement GetHashCode() for all my business entities, or at least any entity based on a link table with composite IDs.  NHibernate needs GetHashCode() for its various Dictionary and List functions.  Implementing GetHashCode() is fraught with peril, and I’ll have to carefully think how to get this done correctly.  (Read Wagner’s Effective C# for problems with GetHashCode().)  I’m not looking forward to this because it’s a difficult piece of work and it looks like it’s a showstopper until I get it done right.  Bother.

One of the most irritating things about NHibernate has been some less than clear error messages.  I beat my head on the table for a few hours trying to figure out why a completely sane map file was generating schema errors telling me that the <id> element wasn’t a valid child of the <class> element, and that a <discriminator> element was expected.  (Discriminator elements let NHibernate, well, discriminate between different types of an entity, such as when you’ve got a Person table which holds Professor and Student entities, but is keyed off of a PersonType field.  See Justin Gehtland’s article on the ServerSide for details.) My Person table didn’t store different types of Person entities, it just referenced a link table to store that information — and I’d already mapped that table.  Those schema errors finally cleared up when I got all inter-related tables mapped, so it wasn’t really a schema issue, it was one entity missing dependent relationships.  Arrggghhh.

I like NHibernate’s concept, and I like the clarity of its use once you’re past the initial stages.  Setup and knowledge building stinks, though.  I’m nearly done with this mapping (finally!), and I’m looking forward to pressing on with getting some actual implementation done on my system.

Now Playing: The Killers — Hot Fuss.  Nice stuff, funky sound, good beat.  No clue what they’re singing half the time, though.  Hopefully they’re not singing the praises of Howard Dean, Ann Coulter, or some similar idiot.  <shudder>

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.

USB Issues Under XP

I’m running an ASUS P4P800 Deluxe motherboard in the system I built at home.  I installed XP Pro a couple weeks ago after having run Win2K for awhile.  XP wouldn’t recognize the USB ports as 2.0 and would only work with the sucky 1.0 slooooowwww format.  I put off investigating until now, and it turns out it was an idiotically quick fix.

Open up Device Manager, scroll down to the USB controller — whoops!  what’s that yellow question mark showing up?

Seems the USB controller wasn’t recognized during installation.  A quick right-click to select “Update” fixed things — after I let XP search for drivers.  The USB controller is now (correctly!) recognized as an Intel 8280 controller and I’m back up with the more better more better USB 2.0.  Whew.

Should have put the nail in that coffin earlier!

Wednesday, September 21, 2005

Newegg Rocks!

Yesterday I was whining about my crappy Linksys router dying.  I spent an hour or so trying to get sessions surviving long enough to get a new firewall router ordered through Newegg.  (They don’t take orders over the phone, only via their site.)

Thankfully I was finally able to get an order placed at about 5:30 Eastern.  Newegg’s got a “rush” option on their orders which will hopefully get your order out the door that day — as long as you get the order placed by noon Pacific.  I checked the rush option just in case; it was worth the $3 for a gamble.

Surprise, surprise, the new router and an external disk for backup showed up here today.  That’s just incredible work on Newegg’s part.

I’m finishing up preparation work for our .NET Developers Group meeting tonight, so I can’t play with my new toys.  Maybe after I get back home.

Again, I’m awfully impressed with Newegg’s terrific delivery times.  Way cool!

Blog for Federal Developers

Check out this blog if you're a developer working for, or on contract to, some branch of the federal government.

Tuesday, September 20, 2005

My Lousy Linksys Firewall Router

I’ve had a Linksys DSL firewall router (BESFX41 is the model, and no, I won’t link to the piece of junk) for three years now and I’ve had to replace it three times.  It’s an annual occurance, and it appears to be that time of the year again.  I’m having to power cycle the damned thing about every 20 minutes to keep it working long enough for me to research its replacement.  Criminy, what does it take for a company to build a moderately reliable device which lasts more than 12 months?

I’m not a fan of Belkin stuff, so now I’m looking at some of D-Link’s DSL firewall routers.  I’ve not had any experience with D-Link equipment, but Jerry Pournelle seems to be a big fan of them and I think he knows a thing or three about solid home networking.

I’m also not looking at any wireless routers simply because I’m a paranoid security freak.  Besides, I don’t have a wireless laptop so it doesn’t matter anyway.  I can always get wireless at some point down the road.

In the meantime, leave me a comment if you’ve got suggestions on firewall routers to use or avoid.  Minimum requirements for me: four ports, stateful packet inspection, DHCP server.

Saturday, September 17, 2005

I'm Published! (Sort of)

I’ve been asked to write occasional posts for James Avery’s Visual Studio Hacks website.  The first article, on Morrison Schwartz’s SharpTools, was just posted today.

If you’re a Visual Studio user and you haven’t read James’s book, well, go read it!

(BTW, I posted a review of James’s book on Slashdot.  Give the review and its comments a read.  Slashdotters are always loads of fun with their comments.  Or not…)

Recipe Blogging: Cinnamon Ice Cream

First off, if you’re not familiar with Penzey’s Spices do yourself a big favor and head over there for a looksee.  I’ve been using spices, herbs, and whatnot from Penzey’s for years.  They’re just plain amazing.

This ice cream is something I came up with four or so years ago as a side to a roasted pineapple (I’ll post that some other time).  It’s wonderful stuff, and really worth the effort to search out good vanilla beans and cinnamon.  Did I mention Penzey’s is a great place for spices?

Cinnamon Ice Cream

 3 c. Half-and-half

2 sticks cinnamon, broken

1 vanilla bean, split and seeds scraped out

1/2 tsp. cinnamon powder

3 egg yolks

3/4 c. sugar

  • Pour the half-and-half into a heavy saucepan.  Add both cinnamons, the vanilla seeds and the scraped bean husk.  Bring to a simmer over medium-high heat, stirring frequently to avoid scalding.  Remove from heat, cover, and let steep for 30 minutes.
  • In a medium bowl, whisk the egg yolks and sugar together until the eggs are pale yellow and form a ribbon when you drizzle the egg/sugar mix back into the bowl.  Set the bowl in a towel rolled into a ring.  (This keeps the bowl from scooting all over the place during the mixing which is about to occur.)  Bring the half-and-half back to a simmer, then very slowly pour 1/2 c. of the hot cream into the egg mix, stirring constantly.  After this initial bit is mixed in, slowly pour in the rest of the cream, whisking constantly.  Pour the mix back into the saucepan.
  • Return the saucepan to medium heat and continuously stir the custard.  Cook until it just begins to thicken — at the point where it leaves a clear strip when you draw your finger across the back of the spoon or spatula you’re using to stir.  Remove from the heat and pour through a strainer into a bowl set in an ice bath.
  • Cover with plastic wrap, pushing down onto the surface of the custard, and chill overnight.  This overnight resting is critical to the outcome of the ice cream.  The stuff will be very good if you skip this and go straight to freezing, but it will be wonderful if you’re able to do this the night before.  The additional resting time gives the proteins and other smart-sounding stuff time to bind.  I don’t know what really happens, I just know I followed Alton Brown’s suggestion from years ago on FoodTV and it makes a helluva difference in the final texture.
  • Process as usual in whatever ice cream maker you’ve got.  We’ve got an old Krups which has served us very well over the years.

Pictures:

Here’s a shot of the eggs at ribbon stage:

 Eggs and sugar at the ribbon stage.

Here’s the custard after it’s been cooked just enough:

Custard when it's been cooked enough.

 

Thursday, September 15, 2005

Development Philosophy and Long-Winded Software Pundits

Roy Osherove has a very interesting post on his frustration with folks who want to spend too much time blathering away about minutia instead of just rolling up their sleeves and getting coding. (That's my paraphrasing, not his exact words, BTW.) I'd have to put myself dangerously close to the group of folks who like to spend more time blabbing about something than actually getting it done -- but that's because I'd been stuck in lousy job positions for nearly five years where the majority of my tasking was, well, to spend loads of time blabbing about crap with customers and management. That's fixed now with my move to an independent consulting role. Now I get to do actual coding, or at least I will once I get steady work. :) Having just proven my point about blabbering, go read Osherove's post.

Wednesday, September 14, 2005

NHibernate and .NET 2.0 Nullables

UPDATE: I screwed up on this post.  See a correction here.

NHibernate is an object persistence system, enabling you to bypass oodles of data access layer and SQL code, directly storing objects in a database.  It’s a pretty slick concept, and I’ve been fooling around with getting some business entities stored via NHibernate.

The first problem I’ve run into is .NET 2.0 Nullables.  The BEs I’m working on use Nullables for various members, and NHibernate was most vexed with them since NHibernate only works for the 1.1 Framework.  However, all’s not lost.  Thankfully there’s a potential answer.  NHibernateContrib is modeled much like nAntContrib — a spot for handy tools which haven’t made it into the “real” release yet.  One of the tools in that project is support for Nullables.  Whoopee.

Ooops.  Not so fast.  The Nullables in NHibernateContrib are a custom type.  The examples show changing your BE’s public properties to these custom types.  That’s not so cool since it scatters a custom type throughout your code.  I’d rather stick with the native .NET 2.0 types.

No problem.  I can encapsulate everything inside the BE without too much trouble.

Here’s what one of my properties looks like before the change:

public Nullable<int> PersonID

{

get { return _personID; }

set

{

if (value != null)

{

if (value < 0)

{

throw new ArgumentOutOfRangeException("value", value,

"ID value < 0");

}

}

_personID = value;

_isModified = true;

}

}

My test for checking null functionality looks like so:

[Test]

public void CheckNullIDInputs()

{

PersonEntity pEnt = new PersonEntity();

pEnt.PersonID = null;

Assert.AreEqual(0, Nullable.Compare(null, pEnt.PersonID));

}

I got the BE’s property changed, but it took a bit of extra work since the Nullable types from NHibernateContrib use NullableType.Default for returning a particular null, i.e. NullableBoolean.Default.

Here’s what the BE property code looks like after my edits, with all tests running green:

public Nullable<int> PersonID

{

get {

// return _personID wasn't working correctly without this

// HasValue test due to apparent issues with how the

// NullableInt32 type is handled when it's Default.

if (_personID.HasValue)

{

return (int?)_personID;

}

else

{

return null;

}

}

set

{

if (value != null)

{

if (value < 0)

{

throw new ArgumentOutOfRangeException("value", value,

"ID value < 0");

}

_personID = (NullableInt32)value;

}

else

{

_personID = NullableInt32.Default;

}

_isModified = true;

}

}

So now everything’s green and shiny with my BE tests.  Now to press on and see about getting them successfully in the database!

 

Longhorn Install == Molasses

or maybe watching paint dry.

I’m putting Longhorn on a Virtual PC in order to try and nab the Consolas font out of it.  The install’s been running an hour now and it’s only ~ 50% done.  zzzzzzzzzzzzzz.  Things don’t appear to be hung because there’s still activity showing on the drive and the progress bar appears to be progressing, but boy, is this sloooooow.

nUnit Minor Diety Now Blogging

Charlie Poole, the current driving force behind nUnit, now has a blog. This is great stuff for anyone interested in any form of testing. Charlie's a big proponent of Test Driven Development and has lots of great insights. Check out his blog if you're at all interested in high-quality testing. (And you ought to be!)

Sunday, September 11, 2005

9/11 Memorial

Take a look at this online memorial to the people who died on 9/11/2001. Regardless of your feelings about the war, watch this and keep in your minds the heroes of the day: the first responders in NYC who continued climbing up the second tower after the first fell. (NOTE: It's a 7MB download, but it's worth it.) (Via Instapundit)

Saturday, September 10, 2005

Great Potential Addin for VS.NET!

Here’s something I’ve been dreaming of:  viAddin at GotDotNet.  “Native vi emulation in Visual Studio .NET,” says the description.  Wow, boy have I missed those vi command strokes!

Oh, wait.  There’s been zero file checkins and zero releases.  Rat farts.  Guess I’ll have to wait.

Maybe the folks at Vim will get their great editor wickered up so I can use it inside VS.NET!

(Seriously, folks, I love Vim [not vi] and have done quite a bit of development with it.  There’s no better lightweight POTE [Plain Ol’ Text Editor] around, especially if you’re looking to do quick regular expression hacks of a file.  Yes, I know, I’m a sick person.)

Wednesday, September 07, 2005

Recipe Blogging: Jim's Heretic Fusion BBQ Sauce

I call this “Heretic” barbecue sauce after my “Heretic Chili,” which is pretty much guaranteed to aggravate any chili purist. There are plenty of BBQ purists around too, and I’m sure some would be beaked about this.  Tough.  I really like the play of sweet and sour in this sauce, plus I enjoy the depth from the Chinese ingredients.

Jim’s Heretic Fusion BBQ Sauce

2 slices bacon, finely chopped

1/2 medium onion, finely chopped

2 cloves garlic, minced

1 small can (4oz?) tomato paste

3 Tbs hoisin sauce (Chinese sweet soy bean paste)

1/4 c. black Chinese vinegar

1/4 c. cider vinegar

2 c. port  (See Notes)

1 c. apple jelly

3 Tbs honey

  • In a tall saucepan over medium heat, saut�e the bacon until it begins to render its fat.  Raise the heat to medium-high and add the onion and garlic.  Saut�e for 3 – 5 minutes until the onion is starting to caramelize and turn brown.
  • Add the tomato paste and hoisin sauce.  Stir frequently and cook for 2 – 3 minutes.  (This caramelizes the tomato paste and hoisin sauce, really popping their flavors out.)
  • Add the two vinegars, port, jelly, and honey.  Lower heat and simmer for about 30 minutes.

NOTES:

  • Port: Avoid the dreck Gallo bottles as port.  Look for something like Sandeman’s Reserve, Warre’s Warrior, or Graham’s Six Grapes.  You only need part of the bottle for this sauce, so you’ll have plenty of nice port to sip on after you’re done grilling.
  • Usage: This sauce is killer on pork chops and great on burgers and chicken.  I wouldn’t get BBQ sauce anywhere near a steak just because I like my steak pretty basic so I can enjoy the flavor of the unadulterated beef.  Dunno how well it would work with goat.  Let me know if you try it.

UPDATE: Vlad in the comments mentioned using balsamic vinegar in place of the Chinese vinegar.  This really is a terrific substitution if you can’t find Chinese vinegar.  I’d meant to write exactly that in my original post but forgot.  Be sure you use a condiment grade balsamic — don’t waste your precious “real” stuff!  Check out this recipe post from the past for more info on balsamic vinegar.

Tuesday, September 06, 2005

The Only Good Katrina Blogging

Tired of Keith Olberman's, Geraldo's or much of the other media's lousy coverage of the devastation in New Orleans? Check out this clip from Ill Will Press. WARNINGS: 1) Skip this if foul language offends you. 2) Turn down your sound if you're in an environment where folks within earshot are offended by foul language. (Via Instapundit)

Housecleaning: Blogroll Update

For those of you still awake and reading my blog out there, I’ve updated my Blogroll off in the right margin.  No deletions, a few additions.  I still read Ben, James, Christian, Clemens, and the other folks I had previously.  I’ve added Hanselman, Sara Ford, James’ Visual Studio Hacks, and a couple other geek sites.  (What, you wanted hyperlinks in this post?  Go click on the sidebar you sluggards!)

For society stuff, check out John Scalzi’s Whatever.  Great stuff from a helluva author, although I’m disagreeing with him rather strongly on his post-Katrina content.

I still don’t waste time with Sullivan, Alterman, or Right-Thinking From the Left Coast.  So there.

UPDATE: Looks like some spambot found this post for comment spam. Dipshits. I'm shutting off comments for this post. Hopefully the SOBs will forget about me for other posts. Bastards.

Saturday, September 03, 2005

Hurricane Blogging

I’ve kept quiet about the catastrophe in New Orleans and along the gulf coast simply because there’s already enough being posted in the blogosphere already.  Do your own searching for idiotic, asinine commentary about who’s to blame — there’s plenty of stupid rants from all sides of the political/social spectrum.  There’s plenty of blame to go around.  (The one comment I’ll allow myself is that you should read this post on the buses of New Orleans before you go solely blaming the feds and Bush’s administration for the horrors in the Superdome and the convention center.)

Better yet, focus on something positive, like donating money and/or time to help those in need.  Instapundit has a huge list of charities focusing on hurricane relief, as does NZ Bear.  Bear’s also got a idea: log your contribution to show how much the blogosphere is contributing to helping relief efforts.

Thursday, September 01, 2005

Agile Podcasts

I’ve posted a review at Slashdot on Tom and Mary Poppendeicks’ Lean Software Development.  There’s been the usual mix of comments: many useless, many snarky (I even got called “clueless” and “dangerous” for my review!), and a few gems mixed in with the rest of the crap.

One of the gems was a pointer to podcasts on Agile topics from iTunes, plus an entire site dedicated to Agile podcasts.  As Keanu Reeves would say, “Whoa!”

The iTunes podcasts aren’t searchable from the iTunes Music Store browse/search bar.  You have to log onto the Music Store, then hit the “Podcasts” link on the left sidebar.  A podcast-specific searchbar there lets you search for the “real” stuff.

Right now I’m listening to Mary P.’s interview from the Agile 2005 conference.  Great stuff!

Wednesday, August 31, 2005

Swanson's Unwritten Rules of Management

William Swanson, CEO of Raytheon, has written a great little book of management rules.  You can get it from Raytheon for free and it’s worth filling out the web form to request it

The pocket-sized, spiral bound book has plenty of gems not just for improving your leadership, but for improving professional relationships.

A couple of my favorites:

Rule 5: Presentation rule: when something appears on a slide presentation, assume the world knows about it and deal with it accordingly.  I’d say this extends to any form of communication, especially e-mail.  Don’t expect your e-mails to remain private.  Save your ranting and disparaging, negative comments for private, face to face communications.  Sending out unprofessional mails, or mails containing sensitive content, is flat out foolish and you’re risking showing your ass big time.  Trust me, I learned this lesson the hard way years ago.  (Luckily the stupid comments I sent out were about a co-worker I actually had a good relationship with.  A face-to-face apology wasn’t easy, but smoothed things over.)

Rule 32: A person who is nice to you but rude to the waiter  – or to others – is not a nice person.  Be very, very wary of folks who speak sugar to you but snub others they perceive as lower than them.  These folks are usually carrying a large knife to stick in your back.

And my personal favorite, one I’ve believed strongly in for years:

Rule 1: Learn to say, “I don’t know.”  I have never felt uneasy saying “I don’t know,” because that’s immediately followed by “but I’ll find the answer.”  I detest people who blab on in meetings trying to contribute to make themselves look better when they’re really making themselves out like fools.  I’ve had the misfortune to work for a couple managers (not leaders) like this.  I was happy to leave those jobs.  “I don’t know” is a powerful phrase because it shows confidence in yourself.  That’s right, confidence.  I’m not bothered by admitting I don’t know something.  So there.

Grab this book and give it a read.  It’s powerful stuff.

(I stumbled across a reference to this book on a blog some months back.  I don’t remember whose blog it was, so I can’t give credit.  Sorry.)

Sunday, August 28, 2005

GDBN Saved My Bacon

One of the tough things about having just started my company is that I've had to make hard choices about what to spend capital on. One of the things I was waiting on a paying job before buying was an external hard disk for backups. Unfortunately, I ran into a lousy situation where one would have been helpful: my new 300GB disk lost its partition mind while trying to install a fresh copy of Win2K on the first partition of a two-partitioned disk. The data and VS projects I had weren't irreplacable, and it's not like I was under any deadline pressure (I'm still not officially on a contract, so I'm not doing any "real" work yet), but the idea of having to lose some work I'd done was still irritating. Winternal's ERD Commander 2005 is a cool tool, but it didn't recognize the second partition I had my data and projects on. Had I paid more attention to their download page I would have read that their disk commander tool isn't included in their ERD Emergency Download. What a bunch of crap. Why wouldn't they include that, or at least make it available as an option? Yeesh. A quick Google pointed me to Runtime Software's GetDataBack for NTFS. Wow, what a great tool! It did a lengthy scan of my crashed partition and built a complete tree listing all my files on both partitions. I got back all my lost files, and could have recovered a bunch of deleted things as well. The interface isn't perfect, but the bottom line is that it saved me a lot of work reconstructing projects, data, etc. This tool's a steal for $80, and would have been a real lifesaver had I been on paying work. (But then I would have had a backup device had that been the case!)

Thursday, August 25, 2005

Great Parenting Book

I’d meant to write about this when I read the book last year, but never got around to it.  (Uhh… Besides, I wasn’t blogging then.)  Confessions of a Slacker Mom by Muffy Mead-Ferro really is a terrific read for just about any parent.  What makes it such a great read is that, despite its title, it’s not a snarky, sarcastic commentary on the sad state of parenting these days.  Rather it’s a calmly written short book full of stories on what used to be common sense parenting.

It’s something Dr. John Rosemond might have before he went mental and turned into a mean, scathing columnist.  (Chill, Dude!)

A review on Amazon.com sums the book up pretty well.  Paraphrasing now: Don’t waste so much time and money on useless crap, don’t spoil your kids, have a life of your own, and listen to your instincts.

There’s another point not listed by that reviewer: Don’t overprotect your kids.  It’s good for them to figure out the world has sharp edges.  Cuts, bruises, and the occasional broken bone, while heart-breaking, aren’t fatal.  My buddy Josh and I were talking last night on some childhood incidents.  One tale involved a bike jump off a levee of the Sacramento river and ended up with that kid getting a nasty concussion.  That kid went on to accomplish a thing or or two.  Another story included a broken tree branch, a long concrete screw, and a trip to the emergency room for stiches 1/2” away from the eyeball.  The recipient of those stiches has since moved on to pretty good things as well, so I’d say a few knocks don’t have horrible, awful long-term effects.

In any case, the book’s really a good read for current and future parents.  Chill folks, you don’t need that baby wipe warmer.

Tuesday, August 23, 2005

More Flickr Photos

I've uploaded a bunch of photos to my Flickr pages. Some are restricted to friends and family, a bunch are public. Feel free to poke around and have a gander. Also, drop me a note if you're a friend, colleague, or online pal who'd like access to the friends and family section (anything with pix of my kids, basically, per She Who Must Be Obeyed). We don't necessarily have to have corresponded, even -- just let me know who you are so I can have some faith it's not Al Franken, Howard Dean, or Sean Hannity looking at my offsping with evil intent.

Monday, August 22, 2005

An Odd Take on C#'s "Struggle"

Calvin Austin has a very odd article C#: Is The Party Over? at the Java Developers Journal. The article's full of weird statements and flat-out innacuracies. Among the groaners: "The C#, C++, and C compilers are now free, although not obviously as optimized as the professional edition." Dude, they were always free, and there's not a gnat's heinie's difference in the professional edition of the compiler. Maybe Austin confused the IDE, but there was never a free version of it, so who knows where he was going. I think he's also nuts with his assertion that "The .NET platform has been under constant development, often too fast for many corporate users to adopt." What's tough about adopting the 1.x platform? The changes to 1.1 weren't that large of an impact, and the release of 2.0 three years later certainly isn't so troublesome. How many releases of Java have come out in the same timeframe? Some of the JVM releases managed to completely bust previously working browser apps I had -- and I"m talking about upgrading from releases like 1.4.02 to 1.4.05. Gimme a break. Dino Chelsea, the PM of the .NET group, rebuts in a great fashion. Michele Leroux Bustamante, vetran of plenty of work in both .NET and J2EE worlds, also has a few good thoughts.

Sunday, August 21, 2005

Good Debugging Tale

Scott Hanselman gives a good walkthrough of how he and his colleagues tracked down a difficult bug.

Great Developer/Architect/Testing Blog Article List

Rob Caron has a terrific list of blog posts to check out on everything from data in service oriented architectures to a single bug costing Trend $8 million bucks. (Via James)

Microsoft Doesn't Listen, Part II

You say Microsoft doesn't listen to developers and customers using their products? Look at the rippling change made to C#'s Nullable<T> support, requiring changes to the Common Language Runtime. Scott Wiltamuth talks about it here, Somasegar here, and Cyrus here. There are many things I don't care for about Microsoft (XP Home Edition's piece of shit Network Sharing Wizard which zorched my Father's network while I was on vacation thousands of miles away at his home and had to get to the airport before I could completely fix things is one rant I'll save you from, at least for a day or two until I get it figured out), but one really, really must give credit when such a massive undertaking is, well, undertaken. The ripples from changing the CLR's implementation are huge. It's gratifying that MS was willing to jump onto this solely because of feedback from C# developers. Specifically, go read Cyrus's post and his mention of Stuart Ballard's detailed blog post on the issue.

I'm All About World Domination

I check Technorati a couple times a month to see who's linking to me. The last check brought a funny reference from Kevin Dangoor who says I'm "seeking World Domination" with the .NET Developers Group I've started. World Domination? Hell, I'd settle for my five-year old going to bed without a fight. Still, his "opening volley" of items desired in a Users Group looks like a good list. I'd add to it, but I've got my daughter to get ready for bed and the rest of my world takeover to plan. Busy day, you know.

Great Snippet Tool

Check out CodeKeep from Dave Donaldson. Dave's one sharp dude, and has spent plenty of time the last few months getting this set up right.

Know When To Bail

Kate Gregory has sage words on being smart enough (and confident enough!) to know when to quit an approach. You shouldn't ever be afraid to admit you were wrong. What you should be afraid of is not bailing out of a dead-end approach. Even better, you shouldn't be afraid to bail early rather than later.

Neat Geek Event Aggregator

Catherine Devlin's created a neat Python aggregator to find geek events in your region. Pretty slick!

Wednesday, August 10, 2005

Going Dark

From blogging, that is, not because I'm going to the Dark Side. (Yet) We're off for a nice vacation to California. My family is having our first reunion in five years. Better yet, we're having it at our cabin at Echo Lake, right on the edge of the amazing Desolation Wilderness. Part of the Pacitic Crest Trail goes nearby, and you can practically spit and hit Lake Tahoe. (OK, it would have to be a helluva spit...) This cabin's shared between the three branches of my Dad's family. It's been in the family since the mid- 1930s and it's a very special place. I haven't been back there since 2002 when my daughter was two. Now we're taking my year-old son off for his first visit to the Lake and I can't wait. I'll Flickrize some photos when I get back.

Great nUnitASP Overview

James Shore has produced a killer video on how nUnitASP does its tricks. It's a great intro to nUnitASP and points out both pros and cons of using that test framework. (Via Roy Osherove's ISerializable)

Real World Site Migration

SourceForge has just finished what must have been a very well-planned migration of their entire CVS server onto new hardware. They finished it in a little over 13 hours, which I find pretty amazing. I've done server migrations in my life as a network geek. They're never easy and you'd best have come up with a great plan and tested it several times. You can read a few blurbs about it on the SourceForge status page. Said blurbs will scroll off before long. I'm going to try and see if there's any blogs talking about this, or news elsewhere on SF. Congrats, SF geeks. Job well done!

Monday, August 08, 2005

Neat Article on Firefly and Freedom

Sara Hinson's got a great article talking about how the wonderful series Firefly is all about freedom. The article's a great analysis of the show's themes, just the kind of stuff I loved doing in Lit classes. It's also an interesting read even if you aren't a Firefly nut like I am. (via Michael Totten subbing at Instapundit.)

Tuesday, August 02, 2005

VS2005B2 Woes -- an Ugly Fix

I've been having ongoing problems with my VS2005B2 losing its mind. The keyboard will stop working, it won't launch, etc. etc. What seems to fix the problem, temporarily, is to delete the entire profile folder under Application Data\Microsoft\VisualStudio\8.0 in your home directory. That sucks because you lose your window settings and some other layout stuff and it's a PITA to reload that every time. It's not quite so much a PITA if you save a copy of that folder off somewhere immediately after entering a new VS2005B2 session. You can then use a batch file to delete the corrupted profile folder and copy a fresh one back over, like so: rmdir /s /q "C:\Documents and Settings\Jim Admin\Application Data\Microsoft\VisualStudio\8.0\" xcopy /s /e "C:\Documents and Settings\Jim Admin\My Documents\VS 8.0 Backup Settings" "C:\Documents and Settings\Jim Admin\Application Data\Microsoft\VisualStudio\8.0\" Note the trailing slash on the target folder -- saves a prompt asking if the target's a folder or file. This all goes pretty quickly, especially if you're using SlickRun for quickly launching such utils.

Subscribe (RSS)

The Leadership Journey