Thursday, March 30, 2006
I’d let it roll for a couple weeks simply because it was low on my frustration list and I was trying to roll through other things. It finally pissed me off enough tonight that I spent some time nailing it down. Turns out ATA/IDE controllers will often revert back to PIO mode instead of Ultra-DMA. (MS KB article on the problem here.)
Check the problem by examining the controller’s Primary and Secondary IDE settings: Device Manager -> IDE ATA/ATAPI controllers -> Primary or Secondary IDE Channel -> Properties -> Advanced Settings. Look at the Current Transfer Mode field. If it’s “PIO” then it’s a FUBAR PITA and you’ll need to uninstall the driver, reboot and let XP do its magic reinstall.
Sucky, but fixable. Now I’ve got my shiny system back shiny again.
Now Playing: Olu Dara — In The World: From Natchez to New York. Wow, jazzy/bluesy/folksy goodness. Amazing clarity, terrific vocals, killer guitar and harmonies.
Wednesday, March 29, 2006
I mean a new set of headphones, you filthy-minded philistine. These terrific Sennheisers, to be precise. They’re just amazing plugged into the headphone jack on my semi-cheesey Logitech speakers. They’ll be a complete knockout when I get one of these Bithead amps in a few months.
Now Playing: Pink Floyd — Dark Side of the Moon. There is absolutely no better music for checking out a good set of cans.
Holy smokes, I’m actually going to be doing a few talks at places other than our DevGroup!
I’ll be giving my Intro to Security talk twice in the next few months, once at the Day of .NET in Ann Arbor on May 15th, and I’ll be heading over to Columbus for the Central Ohio .NET Developers Group to talk on April 27th.
Speaking at the C-Bus meeting will be a neat deal for me personally. I came back from the Software Development Expo West in 2004 all fired up about getting back into software development. I’d been doing lousy system analysis/customer relations work and was burned out and sick of it. Unfortunately things didn’t work out for moving back to fun development at the time. I was getting very discouraged until I found out about the C-Bus group. I got over there and saw Ben Carey and Drew Robbins give a gig on Continous Integration and Test Driven Development. Instant re-energizer, and a serious motivator for me to get out of that lousy spot I was in.
That kind of motivation is the biggest benefit of user groups for me. Such communities are a great source of energy to revitalize oneself. Plus you get to learn cool stuff and occasionally you get free food.
Tuesday, March 28, 2006
I didn’t know you could do this in Word…
O’Reilly provides authors a Word template with specific styles in it. Pasting in formatted text from another source can be a complete PITA in Word because odd styles get carried over if you’re not careful — and now you have to go and find those nasty styles and fix them up.
Word’s “Find” will actually search out style occurances for you. Pull up the Find dialog with Ctrl-F and make sure you’re displaying “More” options via the, uh, “More” button. Click the “Format” button at the bottom of the dialog, then select “Style.” Select the troublesome style in the list you’re presented (“CellCode Char” in our case) and click OK.
Make sure you clear out any contents from the “Find What” field, then click “Next.” Off to the races you go. Notice you can leave up the Find dialog while you’re fixing up the bad, bad, bad styles in your document.
Monday, March 27, 2006
Amanda, Barbara, and [%from_name%] [[%from_email%]]: I’ve got all the OEM software I can use. Please save yourselves the obvious effort you’re putting into the mails you send me. Especially you, Ms./Mr. [[%from_email%%]]. Really, it breaks my heart to know how much your fingers must be aching from all that typing.
Mrs. Williams, I’m very happy you’ve received Christ, but I’m sorry that your husband Peter died in Kenya. I’m doubly sorry since you wrote me last month about your husband Phillip who had died in Nigeria. As much as I’d like to help you out with those two $20 million dollar bonanzas sitting in European banks, but I’m unable to help you. Good luck with that esophageal cancer you’re fighting, though.
Dear William, Alexander, Walter, and Rogert: Please stop sending me all those mails for Cialis and Viagra. I appreciate your thoughts, but really, I’m not in need of those particular pharmecuticals. (Robert, that Prozac e-mail you sent. We may need to talk.)
Now Playing: Essex Green — Cannibal Sea
Mark Russinovich at Sysinternals has done it again, this time with a killer Zoom application. It freezes your display while zooming, but it adds, get this, drawing capability both in the zoomed and unzoomed modes. Killer, killer, killer!
The only nit is that small pen widths mean the drawing point is almost invisible. Otherwise, this is a terrific addition to a presenter’s toolkit. This won’t replace Magnifixer; it’s more complimentary.
Two other presentation tools for me: Slickrun and TaskSwitchXP. The former gives me quick hotkey access to anything I’ve set up, the latter makes it easier for me to see what apps I’m changing between.
Shiny tools. Love ‘em.
I just realized it’s been a year since I got my last paycheck from the company I had to leave due to their inflexible telecommuting policies. They forced me to make a choice between putting my kids in daycare or leaving the company, so it was time to bid them adieu.
(BTW, I’m not criticizing those of you with kids in full-time daycare. It’s a choice each family has to make based on their own priorities and how they want to raise their kids. This was the road my wife and I chose when we first started talking about having ankle biters in the house.)
It was the company’s loss, and frankly, I was ready to leave after nearly a year of busting my ass scrambling for three and four weeks’ coverage at a time doing proposals and white papers. Ick. Talk about stressful, crushing work — it was all stifling, endless process without any rewarding or creative accomplishments. (OK, one of my solely-authored papers was used as an implementation plan for rolling out an extensive, complex electronic documentation system to about 7,000 users. That was cool.)
Plus, I’d been far too long in boring system analysis and customer relations management, and far too long away from the technical, interesting work I much prefer. (My former boss, a good friend, and my wife, a very accomplished program manager, both say I’ve got great talent in the program management domain, but I want to do more fun stuff before moving back to the Dark Side.)
Without getting too Dr. Phil or Oprah on my few readers, everything in life is an opportunity, and that’s how I approached this last year. The following list of accomplishments and things I didn’t get done isn’t so much for readers here as a reminder of positive things to myself when I’m in my occasional whiny funks.
Stuff I Really Meant To Get Done but didn’t quite finish…
- Certification as an MCSD. Got one test done, got wrapped up with life on the others. (Side note: I don’t view certifications as some Holy Grail. I’ve used them in the past when changing into new careers — it shows I’ve got base knowledge of a domain even if I’m lacking practical experience in the field.)
- Any number of projects around the house. I got several rooms painted, some major repairs acomplished, and a fair amount done around the yard, but there are always items on the To Do list which just seem to hang there and hang there and hang there…
Stuff I’m pretty happy to have accomplished
- Started my company
- Took and passed one MCP test for Windows Forms in C# (let’s not talk about the other five tests…)
- Started the Dayton .NET Developers Group
- Started writing articles for James’s Visual Studio Hacks website
- Got on contract with O’Reilly for writing a book
- Worked with James to put on the Dayton-Cincinnati Code Camp (For some astounding reason, James keeps referring to the Camp as the Cincinnati-Dayton Code Camp instead of by its proper name. Inconcievable.)
- Gave several short Grok talks at the Dayton DevGroup
- Gave two full-lenth presentations at the DevGroup
- Moved a couple bushes around in the yard
- Had a fair crop of peas and beans
- Had a good crop of raspberries
- Had a great crop of tomatoes
- Fixed up the rotten back siding on our shed
- Installed a new water softener
- Bought a propane torch for soldering pipes for the softener. (The real purpose of buying the torch was so I would have something to do a serious job for caramelizing sugar on creme bruleé.)
- Spent a week working with some great folks in St. Martin
- Watched my son grow from a lauging blob to a laughing, crawling maniac to a laughing, running maniac
- Watched my daughter continue to grow into a wonderful little girl
- Started this blog and watched its readership grow to a massive audience. (OK, that’s exaggeration, but it’s nice to know that there are a few folks subscribed to my RSS feed.)
Being a camp follower (my wife’s active duty military), I’ve had to take a pretty long-term view and very flexible approach to my career. There are a few things I want to knock off for my career as well as other areas.
Stuff I want to knock off Real Soon Now
- Deliver a killer book to O’Reilly (Proceeds from the book will help pay for the therapy my kids will need after having gone through their formative years with me as their stay-at-home parent.)
- Knock off a few more things from the To-Do list on the house. Fixing the front door jamb is high on the list, as is repairing the #&*@!! street light.
- Give a presentation at some venue other than our DevGroup
- Squirrel-proof the #&*@!! shed
Number two on the priority list, after writing material for the book, is to continue building my network of contacts in the region. I’ll be heading back to full-time employment in a few months, and I want to find a great environment to work in.
I’m also looking forward to seeing how this blog continues to develop. Looking back through some of the archives has been a funny experience. Content here is rather schizo, but it’s been a fun journey.
Josh Ledgard writes about another major move to transparency at Microsoft: the Internet Explorer team is opening up their database to public view!
Two points here: 1) it’s a terrific move, and 2) look hard at Josh’s mindset. His passion about having an open view into Microsoft’s product workings is refreshing and killer.
Sunday, March 26, 2006
Friday, March 24, 2006
I’ve gotten my materials (slides and code) from my Open Source Test Tools together and posted up on my biz’s website. There are two different solutions for the demos — I didn’t have enough time to gather everything into one shiny package, so I just snarfed stuff from a couple existing widgets I had together.
The UGSignup solution is a seriously kludged-together set of apps for working a couple events. It’s not pretty, but it was me working a couple nights tossing together an extension of something Greg Huber worked a couple nights tossing together. (And I just realized I’d been missing his blog on my feed. Oops.) Pile that on top of the EventRegistration project (my work) being my first effort in dealing with WinForms in 2.0, which meant it was really a spike effort for me.
OK, enough excuses — use it as a demo for test code, not as an example of how you should bite off things…
Anyone out there know of good material on VB.NET or VB 2005? I’m looking for something much more than just a this-is-how-you-write-VB-code book. I want something along the lines of Bill Wagner’s Effective C#, in that the book’s on solid idioms for VB, not just how to use ADO.NET or write ASP.NET code-behind.
I’ve started Paul Vick’s The Visual Basic .NET Programming Language, and it seems like a decent enough work, but (so far) it doesn’t really light my fire in the same way Wagner’s book did.
(Maybe that’s just because it’s VB and I’m not particularly enthusiastic about it in the first place…)
Thursday, March 23, 2006
Phil Haack, one smart guy and the “Benevolent Dictator” behind SubText, posted a comment on my “Exploring MBUnit” note from last week. He kindly pointed out the TypeFixture class, linking to a great blog post he wrote back in October of last year.
That post hits something else which I definitely should have covered in last night’s presentation at the Dayton .NET Developers Group: The RollBack attribute, which lets you roll back database actions in any test you run.
Whoof. I should NOT have missed that one! I spent a bit of time talking about Roy Osherove’s COM rollback approach in NUnit’s TestFixture Setup/Teardown. It would have been a perfect addition to have covered this bit of shiny goodness in MBUnit.
I really think I’m going to be moving future efforts over to MBUnit. There’s a lot of great stuff in it. I’ve read some of Charlie Poole’s calm, well-reasoned posts about NUnit being able to do much of what MBUnit does, but the latter seems much clearer and easier than the former.
I gave another talk at last night’s meeting of the Dayton .NET Developers Group: Open Source Test Tools. I spoke about all the goodness available in a passle of open source or freeware tools. It was tough to smash everything into the time allotted. (I’m the president/founder of the group, but I don’t figure I can just blather on for three hours about things I think are Really Cool.)
The tools I hit were:
- NUnit (quick overview as a foundation for unit test concepts)
- Fitnesse (followed an example of having the developer create test data in NUnit vice a customer or domain expert create data and tests in Fitnesse)
- MBUnit (demo’d the RowTest and CombinatorialTest features, talked about Pairwise/All-Pairs support can drastically reduce effort for generating good coverage data)
- Mock Objects (Rhino.Mocks for simulating inputs from stuff you don’t have access too)
- Watir (Drive IE through exercising a simple web form with validating text fields)
- NUnit’s test runner
- MBUnit’s sucky test runner (hey, even the guys running the MBUnit project are looking at killing the GUI off)
- Zanebug’s killer test runner
Folks seemed to like the presentation, but I really have to rework the portion where I try to describe setting expectations on mock objects. It’s a very tough concept to understand — it didn’t click with me until 12:30am one night after beating my head against the wall for several hours. I think I’ve got a new approach for it which will hopefully be clearer and less sleep-inducing.
I’ll have links to the presentation materials posted up after I get a few things polished up.
I submitted this gig along with my Intro to Security presentation to the Day of .NET conference up in Ann Arbor in May. Hopefully one or the other (both??) will get selected.
Wednesday, March 22, 2006
Take one slice of good bread such as a Ciabatta or Pugliese and nicely toast it. Grab it immediately when the toaster pops it up and rub a small clove of garlic over it. (Rub lightly if you’ve a meeting in the afternoon, rub more heavily if you don’t care who your breath offends for the next few hours.) Sprinkle a tiny bit of sea salt over the bread (sea salt, I said! Not that Morton’s garbage.), then drizzle lightly with a bit of top-notch olive oil. Plop a slice of salami or proscuitto over the still-hot bread and wait a moment for the bread’s heat to warm the meat and release the wonderful aromas. (And melt the lovely pork fat!)
Repeat as necessary.
Late August iteration: replace meat with a slice of vine-ripened tomato from the garden. Eat in a well-napkined fashion.
Monday, March 20, 2006
Scott Hanselman’s participating in a walk for the American Diabetes Association to try and earn $10,000. Think about spending some of your charity fund budget (you do have one of those, don’t you?) and help him out for a good cause.
Update: Here’s the trackback link. Should have used that the first time. Ooops.
Sunday, March 19, 2006
I’ve vaguely mentioned a big project in other blog posts, but here it is in cleartext: I’m on contract to write a book for O’Reilly! This has been in the works for several months and things finally got to the Sign-The-Contract phase a few weeks back. It’s a pretty amazing thing for me, none the least because I’m co-authoring it with my good friend James Avery, author of a couple pretty darn good books himself.
We can’t discuss the focus of the book yet because we’re sneaky SOBs. Actually, we’re not sure how far we can go into details yet, so we’ll just be talking about general authoring things from time to time. You may be able to figure bits and pieces out from the content of some of my previous posts over the last several months. (Hint: It will not cover rose gardening or gnocchi. I don’t think.)
One of the neatest things is that we’ll hopefully get our book into O’Reilly’s Rough Cuts program. This lets folks buy a pre-publication version of the book and read through chapters as they’re being reviewed and finalized. Folks who get the Rough Cuts version get a chance to pass feedback to us, which will help improve the final version of the book.
37signals talked about early book feedback in their Getting Real book and offered up a couple books which used this same approach. The authors were all very, very happy to have gotten feedback early in their writing process. Gee, kind of like Agile software development, no?
James had the terrific idea to get a Basecamp site up to manage the project. That’s been a blessing so far and has given us a great medium to work on chapter contents, track deadlines, and toss general communication back and forth.
We had our first milestone delivery of two chapters a couple weeks ago. Much of that content went by a couple good reviewers and all were happy with the general aproach and focus of the book. We’ve got what I think is an absolutely killer list of technical reviewers built up and their input will be invaluable for polishing the final product. (Steve McConnell declined, but he was very nice about it.)
I’ve been seriously twitterpated about all this, alternating between Danger Mouse mode (“Panic!!”) and giddy enthusiasm. Enthusiasm trumps most every time, although I’m sure there will be a few grumpy evenings and weekends to come.
I look forward to being able to pass on more details about the project before too long. Hopefully we’ll have some content up on Rough Cuts before too many more months — I would love to get feedback from any and all readers.
So there you have it. The latest big news from around here, and it doesn’t even concern my coffee roasting habits, rose garden, or son’s diapers.
What a great-looking tool Fitnesse is for wrapping your customers into the entire development process! I think it’s also got some interesting promise for difficult combinatorial testing scenarios. I've been plunking away at Fitnesse part of last night and this morning and finally got something working just now.
Several things weren't readily apparent on getting it going in the .NET environment. First off, you'll need to grab the source and compile the FitServer project for the 2.0 Framework if you're using that environment. I also ended up rebuilding the fit library project just to be sure. (“System.ApplicationException” errors stating your test fixture assembly couldn’t be found are the result of trying the 1.1–compiled server on 2.0 assemblies.)
Secondly, and this one's a head-slapper, you don't need to start the dotnet\FitServer executable separately. I spent 30 minutes or so Googling the heck out of things before finally realizing the answer was staring me right in the face on the DotNetFitServer Wiki page. Duh. Just fire off the run.bat file in the fitnesse root, add the lines noted on the DotNetFitServer line, create your tests and fixtures. FitNesse's goodness spawns the FitServer all on its own.
One last issue: set the “Copy Local” property of the fit.dll reference to “False.” Otherwise you’ll get odd messages about “Couldn’t cast XYZ.ABC to Fixture. Did you remember to extend Fixture?” (Thanks to Heinrich for the answer on that one.)
FWIW, here’s my first table:
!|JHSCR.FitFixtures.HourlyWagesFixture| |hours|rate|Wages?| |20 | 33.22| 664.40|
and the corresponding fixture:
public class HourlyWagesFixture : fit.ColumnFixture
public double hours;
public double rate;
public double Wages()
IEmployee emp = TestFactory.CreateDefaultPerson();
emp.WageType = Employee.WageTypes.HOURLY;
emp.HourlyRate = rate;
Payroll pay = new Payroll();
return pay.ComputeWages(emp, hours);
Note that you can use namespaces, you’ve just got to use them in both the test fixture code and the test table itself.
(Yes, it was green!)
UPDATE: Fixed the busted formatting on the test table. Sorry.
Wednesday, March 15, 2006
My ISP is in the middle of various upgrades and I’m already seeing some improvements. Current stats from my ISP’s bandwidth test page:
Admittedly, your own ISP is not an unbaised source, but I confirmed similar results at PC Pitstop. I’m hoping that I’ll end up with 3Mbps by the end of the month. If I’m lucky, really lucky, I may get as high as 6Mbps.
My ISP is DONet, Inc., a local Dayton firm who has killer service and great rates. I was with SBC for a year and they sucked rotten bong water. I’ve been with DONet for around four years and they’re just terrific.
<Disclaimer> They’re not paying or comping me in any way for this plug. They’re just great folks with great service. </Disclaimer>
I’ve been playing around with MBUnit for only a few hours, but I’m way impressed with it so far. Its table-based testing via the [RowTest()] attribute is killer. I love that I can combine rows of input and catch Exceptions all in one test:
[Row(33.22, 80, 3322)] //border top
[Row(33.22, 20, 664.40)] // middle
[Row(33.22, 1, 33.22)] // border bottom
[Row(33.22, 0, 0)] // border bottom (zero)
[Row(50, 81, 0, ExpectedException = typeof (ArgumentException))] //border over max
[Row(50, -1, 0, ExpectedException = typeof (ArgumentException))] // border under min
public void CheckWagesHourly(double rate, double hours, double wagesExpected)
IEmployee pers = TestFactory.CreateDefaultPerson();
pers.WageType = Employee.WageTypes.HOURLY;
pers.HourlyRate = rate;
Payroll pay = new Payroll();
double wages = pay.ComputeWages(pers, hours);
Assert.AreEqual(wagesExpected, wages, 0, "Wages/hourly/normal + border + OT");
I get a normal value and five border tests (top, bottom, over, under, zero) all in one fell swoop. This same test would have taken me six separate tests in NUnit. You can also put in a delta parameter for a row, enabling the test to pass if it’s within plus/minus of the delta factor. Wow.
Note that I’ve got a TestFactory class creating objects for my tests? MBUnit has a [Factory] attribute which lets you mark a method as providing basic input for other test methods, all in a much cleaner fashion. I’m off to explore that next.
MBUnit looks way cool. There are several cons about it (transition of project personnel, sporadic availability of the project’s Wiki, a few odd behaviors), but Andrew Stopford has taken over the project and is very responsive. He bailed me out of a couple hitches and provided an update, all in the space of a couple hours today.
Better yet, support for it is wrapped right into TestDriven.NET which you ought to run and install Right This Very Instant if you’re not using it already. There’s also a very nice HTML report which will pop up right inside VS if you’re using TestDriven to execute your tests.
I think this will be a great part of my open source test tools presentation next week.
One self-inflicted wound I gave myself today: I ran into a MbUnit.Core.Exceptions.NotEqualAssertionException and a “FailedLoading(Parameters count are not equal Equal assertion failed” message in the report. It took me a bit of time to figure out I’d left in a [Test] attribute from an NUnit test I copied over and changed to a [RowTest()]:
[Row(33.22, 80, 3322)] //border top
public void CheckWagesHourly(double rate, double hours, double wagesExpected)
Oops. Hey, I make the mistakes so you don’t have to.
Tuesday, March 14, 2006
I’m exploring Watir as part of my presentation I’m developing for next week’s DevGroup meeting.
I ran into one hitch when trying to install Watir right after installing Ruby via the One-Click: you need to exit the Explorer and shell sessions you may have open, then restart them. Do this in order to get the PATH environment variable updated — Watir has to find Ruby on the path or it dies out with a “windows installer error” and complains about not being able to write “\watir\AutoltX.chm”. Note the path — suspiciously like a web path, which keyed me into the idea about not being able to find the Ruby executable.
Am I one bright guy or what?
Sysinternals is the source of some amazing free tools. I've played around with various odds and ends from them and have loved all their stuff. I didn't realize until this morning that Mark Russinovich has a blog. It's not frequently posted to, but the few things he writes are gold.
Check it out: Mark's Sysinternals Blog.
I've meant to blog about this earlier but kept forgetting. Running Explorer (not Internet Explorer, just the My Computer variant) from an admin prompt when you’re a developing as a normal user takes a bit of trickery. Aaron Margosis has a couple good tips for working around this. I use the registry hack he mentions in the article, plus I’m a fan of his PrivBar add-in.
Check out his post: Aaron Margosis' WebLog : RunAs with Explorer.
Sam Gentile’s writing a series on how he spiked into a WinForms project to see whether the Composite UI Application Block (CAB) would help out. Interesting stuff on how to help refactor really evil, complex WinForms to a better Model-View-Controller flow.
(On a name-dropping, bragging side note, Sam will be speaking on Web Services at our .NET Developers Group meeting here in June. Woo!)
Monday, March 13, 2006
I’m in the process of rebuilding my development system, always a sucky process. Hopefully it will go faster after this round: I’m going to get all my shiny toys installed on the box, then use Acronis TrueImage to make a snapshot of the clean system.
TrueImage lets you build a CD-based recovery disk to boot off of. I’ll use that to restore my snapshot from my external USB drive. I’ll most likely end up doing this once every couple months for the next half year or so — I’m working on a project which will have me loading and unloading a lot of tools, something guaranteed to drag down a system after a bit.
The list of tools I’ve got to load as part of my baseline is pretty cool. You never realize how much stuff you end up using on a regular basis until you’ve got to reinstall all the goodies. An uncomprehensive, schizophrenically-ordered list would run something like this:
- GVim (“Yeah, baby!”)
- Cool Firefox extensions: Auto Copy, BlogJetThis, LastTab, ColorZilla, IE View, Blog This, WebDeveloper, Moust Gestures, deLico.us
- The N series: NUnit, NCover (and NCoverBrowser), NAnt, NDoc
- Tortoise SVN/CVS
- Cygwin (see comments for GVim)
- Reflector (see comments for GVim)
- ProcessExplorer / TCPView / RegMon / FileMon (SysInternals, you guys rock!)
- Aaron Margosis’s gold security tools: MakeMeAdmin and PrivBar
- Jeff Key’s Ruler
- SourceMonitor, Vil
- Omea Reader
Visual Studio Extras
- VSNet*CommandPromptHere tools
There has to be more than this, but it’s all that comes to my list at the moment.
- MindManager (see comments for GVim)
- ReSharper (see comments for GVim)
- PaintShop Pro
- Norton Anti-Virus
- Visual Studio 6.x, 2003, 2005
- MS Project
- SQL Server
- SQL Express
- Acronis True Image
I’m part way through VS2003 as I write this. Thankfully a lot of the utils are simple xcopy installs from the backup I made.
Via Jason Haley's Interesting Finds, a good read on NHibernate and ASP.NET with Generics.
Sunday, March 12, 2006
Wednesday, March 08, 2006
NMock is a great tool for simulating (ok, mocking) objects for your unit tests. Say you want to avoid messy database or web service interractions — NMock gives you an avenue to do that. You can also simulate services which might not be consistently available.
Documentation on NMock is sketchy at best, so you need to hit Google and search around for smart folks who have gotten the arrows in their backs already. Here are a few links I’ve found helpful so far:
- NMock homepage, seems mirrored at the often unavailable www.nmock.org site.
- MockObjects. Loads of great info on mocking in general, specifics on Java APIs.
- Carter Software’s Mocking Patterns page. Nice overview.
- Jeremy Miller’s series of five posts on mock objects (He’s only got three done…)
- ThoughtWorks’ intro to NMock. Cursory, but another good example of the basics.
More as I figure it out myself!
Interested in learning about Windows Vista, WinFX, Windows Communication Foundation, and/or Windows Workflow Foundation, but don’t know where to start? Yeah, me either. Thankfully I ran across this blog post: Eric Nelson - Development for WinFX for ISVs : Getting Started with WinFX and Vista.
Unfortunately, I’m not sure where I ran across it at, otherwise I’d give a reference. “Sorry,” whoever it was that pointed me to the post.
I’ve been very lucky to have gotten such great input from great folks over the series so far.
Got an idea for an ATP article? Got something you’d like to know how “the pros” do? Drop me a line, either via the contact link on the right or here in the comments. I’ll do my best to get answers and write up an article.
Tuesday, March 07, 2006
Nino’s post on the Four Things Meme mentioned gnocchi as one of his favorite foods. That kicked me in the pants and reminded me that I hadn’t fixed any gnocchi since last winter. Unacceptable!!
We were lucky enough to have about a pound of venison hamburger given to us by a hunter friend, so I thought that would make a killer sauce. (Plus my daughter had just watched Bambi. How could I resist??) Enough tangential blabbering. On to the good stuff.
Potato Gnocchi With Venison Ragu
- 1 lb venison hamburger (ground lamb makes a killer ragu, too)
- sea salt
- freshly ground pepper
- 3 cloves garlic, chopped
- 1 small onion, peeled and finely chopped
- 1 carrot, peeled and finely chopped
- 1 stalk celery, finely chopped
- 2 x 28oz cans whole tomatos (See Notes)
- 1/2 bottle decent red wine (See Notes)
- 2 bay leaves
- 3 large sprigs thyme
- 3 large russet potatoes (NO Yukon golds or other starchy spuds!)
- 2 eggs
Making the Ragu
Brown the venison with a bit of olive oil in a heavy pot over medium-high heat. (I’ve got a Le Creuset Dutch I mean French Oven which I bought years ago and has been worth every penny.) Season with the salt and pepper as you go. After the meat is browned, add the garlic, onion, carrot, and celery. Continue cooking until the vegetables are softened, then add the crushed tomatoes.
(Here’s a trick for hand-crushing tomatoes without making a huge mess as the tomatoes explode: Drain the juice from the tomatoes into the cooking pot, leaving the tomatoes in the can. Use a long knife and poke all the tomatoes in the can — this will let the internal juice come out through the holes without exploding when you squeeze them. Now invert the can over your pot, stick one hand up in the can, and crush the tomatoes into goop, letting crushed bits fall out around your hand. Figured this one out all by myself.)
Pour in the red wine, add the bay leaves and thyme springs. Cover and cook for at least two hours. Crack the lid off the pot and cook for another hour until the ragu is thick and wonderful.
Serve with pasta or whatever. Leftovers around here get vacuum packed with our FoodSaver and tossed in the freezer for later use.
Making the Gnocchi
Keep in mind that I’m a California Farm Boy, so authenticity on these may be lacking. My technique comes from having watched Molto Mario twice a day when my daughter was younger. Food TV had his show on right as I was fixing her lunch and dinner, so we’d watch his show as we were getting ready to eat. One of her earliest phrases was “Ciao, Mario!”
Cut the russets in half and put in a large pot, covered with 2” water. Bring to a boil, lower to a simmer and cook for 30 – 45 minutes until the potatoes are soft when pierced with a fork. Remove from the pot and peel as soon as you’re able to work with them. Immediately pass the potatoes through a food mill or potato ricer, mounding the processed potatoes on the counter. Try to work the potatoes before they cool too much — the texture of the gnocchi will be much better.
Clear a hole in the middle of the potato pile. Break the two eggs into the center and stir them up with a fork. Spread a couple handfuls of flour over the potatoes, then start mixing up the pile. This is sort of like mixing bread dough on the counter: just keep gathering it up and kneading it a bit. Add more flour as needed. The mix should still be sticky, but workable. A dough scraper is invaluable for this process! You’ll end up with a smooth ball of dough after five to ten minutes of kneading.
Get a large pot of water on to boil. Get a *large* bowl of water with a bunch of ice cubes in it. Put a strainer over the bowl so the strainer is in the water. Put a bunch of lint-free towels on a counter or kitchen table (not on a wood table!). Scrape off the counter you’re working at and sprinkle a bit of flour over the working area.
Start to make gnocchi by cutting off a hunk of the dough. Roll it out into a rope about the thickness of your thumb. (OK, I’ve got marginally big thumbs. Maybe 3/4” thick?) Use your scraper or a knife and cut the rope into pieces roughly 3/4” long. Using your thumb, flick the pieces off the back of a fork, rolling them along the tines and smooshing them a bit with your thumb to make a bit of a dimple.
Working in batches of 15 – 20 gnocchi at a time, drop them into the boiling water. You’ll need to tinker with the heat a bit to maintain the water at an aggresive simmer, not a rolling boil. A rolling boil is a Bad Thing because the gnocchi will fall apart! I leave my lousy electric burner on high heat, but pull the pot partway off. Cook the gnocchi for 3 – 5 minutes until they’ve all released from the bottom of the pot and have been floating for a minute or two.
Remove from the pot with a skimmer and transfer to the ice water bath. Let rest there while you cook the next batch, then remove with the skimmer and spread out on the cloths to drain.
At this point you can divide up the gnocchi into meal-sized portions. Continue as below for cooking. Place the unused gnocchi on cookie sheets and freeze overnight. Vacuum seal, or tightly seal in Ziplock bags, and store in the freezer for a couple months. If you can wait that long.
To finish cooking the gnocchi you’re about to eat, float them in gently boiling water for a few minutes to reheat. Put some sauce in a non-stick skillet over medium heat. Remove the gnocchi from the water and place in the simmering sauce. Gently stir to coat and cook for a few moments — this final touch of cooking in the sauce, rather than just coating, is critical because you’re getting the sauce’s flavors into the gnocchi instead of just on them.
Serve on plates dusted with good Parmesan cheese and drizzled with a bit of top-notch olive oil. (I’m talking the $25 per bottle stuff you use in sparing amounts as a finishing oil, not the stuff you use for frying and sauteeing.)
Tomatos. Use imported San Marzanos if you can find them. They’ll be more expensive than your standard Hunt’s ‘maters, but this is one of those cases where you really, REALLY want to spend the extra bucks. Italian San Marzanos have a depth of flavor that’s just amazing.
Wine. Cooking wine is evil dreck. You wouldn’t drink the garbage, so why put it in a nice dish? You don’t need to pour in half that bottle of ‘85 Tiganello, but use something you wouldn’t fall over dead from if you found it in your glass.
Friday, March 03, 2006
37signals is the great bunch of folks behind some amazing stuff: Basecamp, Backpack, Writeboard, and even Ruby on Rails. I haven’t used Ruby/ROR, but I’ve been really, really impressed with Basecamp and Writeboard. These folks are golden.
They’ve just released a PDF-only book titled “Getting Real” about the process and mindset they use to push out all this amazing stuff. I haven’t bought it yet, but I’m definitely putting it on my booklist.
Not sure what happened to cause Blogger’s corrupted RSS ATOM feed, but I needed to kick Blogger in the pants. It wasn’t tough — reset Blogger’s site feed “Descriptions” field to “Short,” republish the blog, reset it back to “Full” and republish again, then head over to Feedburner.com and resync the feed there.
Looks to be working more better more better now.
From Jamie Cansdale’s TestDriven.NET blog, pointers on how to install TestDriven.NET and NCover to run as an LUA (Limited User Account). The quick fix? Grab a couple command files from Aaron Margosis’ blog. (“Command Files” is waaaay more impressive-sounding than “batch files.” Batch files are for goobers. Command Files are for Real Developers.)
Margosis has some great text on why running as an Admin is a Bad Thing.
Thursday, March 02, 2006
I don’t mean to pick on DotNetNuke, but there’s a reason to run metrics checkers on your code. There’s a reason to avoid having single methods with 432 lines of code. There’s a reason to avoid having methods with cyclomatic complexity scores of 79. There’s a reason to avoid methods with a Maintenance Complexity measurement of 3,176. There’s a reason to review and refactor code, somehow, anyhow, to avoid this kind of stuff.
I’ve got one method in NUGSoft which has a CC of 26 or something, but that’s a comparison method for a moderately complex business entity and it’s stuffed with a bunch of statements like
if (left.FName != right.FName) return false;, so there are a passle of paths and conditioinals in it. (That pattern is straight out of Wagner’s book, so don’t give me grief, either!)
Here’s part of what I had for lunch on the last day of the trip I blogged about earlier.
This beast provided enough meat to give 15 hungry folks a couple forkfulls each. Whoof. Caught the morning of lunch by one of the Pastor’s friends.
Yeah, life sucks sometimes.