Wednesday, July 20, 2005
ReSharper 2.0 EAP Has Started!
Great news if you want to get in on helping drive the next version of ReSharper: the v2.0 Early Access Program has started!
This is an Early Access Program, so you'll be in front of the bleeding edge. Expect "issues." That said, traffic on the ReSharper newsgroup makes it look like the folks at JetBrains are really quick to respond to problems.
I'm downloading it as I type.
Recipe Blogging: Fennel Salad
Fennel's great stuff. I use it in soups and stews, I'll braise it as a side dish, and it's terrific as part of a summer salad.
Fennel Salad
2 bulbs fennel, stalks trimmed 1 head red leaf lettuce, well rinsed and torn into pieces (substitute whatever's on hand) 1/8 c. thinly sliced red onion 1/8 c. chopped pecans (pine nuts are a good subsititue) 1/4 c. crumbled feta cheese 2 Tbs rice vinegar pinch sea salt fresh ground black pepper 1 tsp Dijon mustard ~3 Tbs good extra virgin olive oil 1 tsp. minced fresh rosemary Trim the root end off the fennel. Peel off the outer layer if it has any brown spots. (Save the stalks and outer layer in a bag in the freezer for your next batch of stock.) Cut the bulb in half lengthwise, roll the bulb onto the cut side and thinly slice. Repeat with remaining fennel. Toss the fennel, lettuce, onion, pecans, and cheese into a large bowl. For the dressing, in a small bowl mix the vinegar, salt, and pepper until the salt is disolved. Add the mustard, olive oil, and rosemary. Mix well. Drizzle over the salad mix. NOTES: Fennel bulbs are male and female. No, really. The female bulbs are rounder and squatter. The male bulbs are more elongated. The female bulbs are preferrable. Orange slices make a great addition to this salad.Tuesday, July 19, 2005
Has Your VS 2005's IDE Lost Its Mind? (A Potential Fix)
My VS2005B2 lost its mind this morning. Keyboard shortcuts for bookmarks weren't working and I couldn't copy/paste anything. Rather frustrating, especially since I hadn't yet had my second cup of good coffee.
Restarting VS2005 didn't work, nor did bouncing my system. (No, I don't mean tossing it across the room, I mean recycling it. Really. Some people.) Thankfully James had two suggestions:
1) Run "devenv /setup" which resets many of Visual Studio's settings. That didn't work, and I was getting out my DVD for a reinstall when James mentioned
2) Delete Visual Studio's local settings under C:\Documents and Settings\<your homedir>\Application Data\Microsoft\VisualStudio. You'll lose VS-specific settings, but of course solution and project settings aren't impacted.
Thankfully #2 did the trick and I'm back running.
Geeze, you'd think that guy wrote a book or something.
Testing Nullable in NUnit
I've been learning about Nullable types in .NET 2.0. They're very handy, especially in the case of Business Entities (Data Transfer Objects) which interract with a database. Database fields may have null entries, which are a pain in the keester when it comes to value types like int, bool, and structures.
I've also been figuring out how NUnit deals with Nullable types. It's not clear in the documentation I saw, so I had to do a bit of trial and error. Assert.AreEqual() won't directly compare two Nullable types, but you can use the Nullable.Compare() method and check its return as needed.
Below is an example of a underborder test using Nullable.Compare(). I'm testing that my bounds checking in my PostEntity's PostID property correctly barfs when it sees a negative number. (I don't want negative IDs for my posts.) PostEntity.PostID is a Nullable<int>. Note that you've got to pass it a Nullable int as well; Plain Old Int won't work.
Note that Nullable.Compare() returns the usual suspects for a compare operation: 0 if equal, -1 if the first param is smaller, 1 if it's larger.
[Test]
public void CheckPersonIDNegative()
{
PersonEntity pEnt = new PersonEntity();
Nullable negVal = -1;
try
{
  pEnt.PersonID = negVal;
  Assert.Fail("Expected ArgumentOutOfRangeException");
}
catch (ArgumentOutOfRangeException ae)
{
  Assert.AreEqual(0, Nullable.Compare(negVal,
  (Nullable)ae.ActualValue),"Failed compare");
}
catch (Exception ex)
{
  Assert.Fail("Unexpected Exception: " + ex.Message);
}
finally
{
  pEnt = null;
}
}
Monday, July 18, 2005
NUnit 2.2 and VS2005 B2: BadImageFormatException
Getting BadImageFormatException errors when trying to use NUnit 2.2 with VS2005 Beta 2? There are several spots with the answer on the web. I found my solution at IdentityCrisis.
Edit the nunit-gui.exe.config file and add support for the latest framework. Move it to the top of the list of supported runtimes or it won't fix the issue.
<startup>
<supportedRuntime version="v2.0.50215" />
<supportedRuntime version="v1.1.4322" />
<supportedRuntime version="v1.0.3705" />
<requiredRuntime version="v1.0.3705" />
</startup>
Sunday, July 17, 2005
Garden Blogging: Glorious Tomatoes!
My favorite part about summer: wonderful tomatoes fresh from the garden sliced up with a bit of real mozzarella cheese, fresh basil, some top-notch olive oil, a bit of good sea salt, and a dusting of fresh ground pepper. A bit of leftover grilled chicken rounds out a simple, light summer meal.
Now I'm hungry again.
Friday, July 15, 2005
VS 2003 Post-Build Events
I'm sure this is old hat to folks experienced in Visual Studio, but it's something new for me. Maybe someone else will find this useful.
Post-Build Events in Visual Studio let you handle things like moving or copying files around your build environment. Very handy stuff if you need to do a little massaging of your solution/project's output.
I'm working on a CodeSmith template project which has a Helper class to do string manipulation, type parsing, etc. (I wasn't the guy who did the initial work, that was another fellow more smarter than I am.) The DLL generated from the Helpers class needs to land in the template directories for use by CodeSmith.
Create Post-Build events on a per-project basis by right-clicking on the project and pulling up the Properties dialog. Click on Build Events under the Common Properties folder. The Post-Build Event Command Line field is where you can enter your commands at. You can enter in any command-line executable in this field.
Use the field's elipsis to pull up another dialog where you can enter longer commands. The "Macros" button on this dialog also gives you access to a handy set of properties for the build -- you'll find a list of directories, paths, etc. Construct your commands, one per line, using free text and macros as needed. Use any regular command like 'copy', 'move', etc. You can also call other batch files via the 'call' command.
Important: Remember to surround paths with quotes in case your paths have spaces in them.
The Post-Build Event actually creates a batch file in the project's output directory, then calls it after the build is complete. All macros you use are expanded when that file's written, so it's a good source of information when trying to troubleshoot a failed post-build event. You can quickly see if you forgot to do something like surrounding your path with quotes. Not that I know anyone who'd make such a basic mistake. I'm just tossing that out there for others.
"Microsoft Doesn't Listen to Their Customers"
Yeah, right.
There have been and will continue to be plenty of things I don't like about Microsoft, but take a look at this blog post from Josh Ledgard. Then tell me that Microsoft doesn't want input from its customers.
I realize that one fellow isn't Microsoft in its entirety, but I still think this is 1) a great thing to see for Microsoft and 2) an amazing use of blogs.
FreeMind Mapping Software
Ben Carey wrote about MindManager, a terrific visual planning/productivity/organizing package. I've been evaluating it for the last month and think it's absolutely terrific. Mind maps are wonderful things, and I've used them for outlining projects, brainstorming, and task breakdowns. MindManager also has a killer save to website feature which produces a terrific HTML output showing the visual maps, richly linked web of great information. I used this feature to export some project thoughts to a potential client.
MindManager's only problem: its price. I'm at the point with the startup of my company where I really need to pay attention to expenses. There are a lot of terrific productivity enhancers I could use (this comes to mind, as does this, or even one of these), but I've got to be extremely disciplined about the number of cool $300 - $500 things I buy.
Reality sucks.
Thankfully, Phil from geekyinfo.com left me a comment about FreeMind, an open source mind mapping package implemented in Java.
I loaded it not long after his recommendation, but didn't play around with it much. Now that my MindManager eval is finished, I'm taking another look at FreeMind. It's actually going to fit the bill for what I need now very nicely. I'm using it for task breakdowns, to do lists for development, and it's doing just great in that role. It's also just as handy for brainstorming as MindManager is, although MM's "brainstorming" mode is really handy. Overall, FreeMind gets a big thumbs as an interim solution.
Plus FreeMind's price is right.
Wednesday, July 13, 2005
Tips and Thoughts on Founding A User/Developers Group
It's been something like three or four months since I started working on founding the Dayton .NET Developers Group. It's been a heck of a fun roller coaster ride so far, and I thought I'd pass on some lessons learned in case anyone out there happens to look for info on starting a user group.
First off, make sure you understand where I'm coming from. This post is supposed to be a bit of realistic advice from someone who is absolutely enjoying the process. Having a realistic picture of an effort before starting is an important thing! This is written from the point of view for a .NET group; however, many things are applicable to starting any group regardless of its specific theme.
Commitment
Be damned sure you've got an inkling of the commitment you're making. Building up a developers group takes a heck of lot of sweat equity. You'll be spending a lot of time on the phone trying to publicise the group. You'll be spending a lot of time writing e-mails. You'll be spending a lot of time contacting other event organizers to try and get on their coat tails. It's sheer marketing hack work, but it's absolutely worth it.Organize, Organize, Organize
You don't have time and energy to forget or redo a lot of stuff. Get in touch with your organizational inner self by using methods from Take Back Your Life - Using Microsoft Outlook to Get Organized and Stay Organized. Another good book (so I've heard) along the same line is Getting Things Done. There's also a good-looking GTDTiddlyWiki if you want a non-Outlook tool.Vision, Vision, Vision
Create a mission statement for your group. Think about what you want to accomplish by founding the group. Think about what benefits your members will gain by joining the group. Think about the benefits sponsors will get by giving you funds to support the group. Think about what benefits employers will get by possibly cutting their staff loose a bit early once a month to attend meetings. Think about how your members will benefit from incredible networking opportunities and exposure to industry-leading trends and speaker. Write all that down in a clear, professional fashion. Use it to build a call script for when you start making calls to companies in search of new members.Get in touch with national resources.
First stop should be contacting your Microsoft regional developer evangelist. Drew Robbins, the DE for my region has been an incredible asset -- plus he founded the Columbus group so he's had terrific tips for me. How do you find your regional DE? Contact other .NET groups in the area and check with them! Second stop should be registering with CodeZone which holds MSDN user groups. Third stop should be registering with the International .NET Association (INETA). INETA has a moderately useful white paper on starting a user group.Get in touch with regional resources
Check out user groups in the region. Contact their leaders. Most leaders, not all, will be very happy to help you get your group going. I've had killer, fantastic support from the guys at the Columbus and Cincinnati groups. Smart menschen should see your founding group as an asset to the region, not as competition. Furthermore, think about pairing your meeting dates with a nearby group. I paired our meetings up next to Columbus's. This will let us work together to get speakers in for two meetings on one trip. I think this helps a smaller group get bigger names in to speak if they can pair up with a larger, better-established group.Get in touch with local resources.
Search out other user groups, particularly something like generic computer user or software developer groups. Heck, touch bases with other specific groups! Other good resources include local publications like your newspaper and local business journals. Also check to see if there's a IT-related talk show on any of your local stations. I was lucky enough to hook up with the guys at IT Matters, and they had me in the studio for an hour gig about our group. Make sure to look for any local or regional groups which have the mission of helping boost IT industry in the area. We're lucky to have the Greater Dayton IT Alliance here in the greater Dayton metro area. These folks are a terrific help.Hit the phones
Build a list of local IT companies to call. Search Monster.com, your local paper's job listings, and any other resource you can think of to build a list of companies who might be interested in, or are already doing .NET development. Create a call script talking about the group's mission (See Vision above) and why that company's developers and tech leads would benefit from membership. It's tough, but try to speak with IT managers or CTOs. Marketing people won't be much help, nor will secretaries. Important note here: the folks you're speaking with are very busy. Have your script ready and rehearsed so you can get your message across in as short a time. Conversely, your script should just be talking points, not something you read out word-for-word. Do you want calls from telemarketers? Nope. Don't do the same to the folks you call!Find a kickoff event
See if you can't find a local tech-related event to use as a kickoff for your group. Does your Chamber of Commerce or other organization have an event you can use? What about some Microsoft product launch? Is there an expo around? Research and find one of those, then latch onto that event's organizers like an alien on John Hurt's face. Cheerfully use every bit of publicity from them you can, and then some. See if you can inject publicity announcements into any mailing list they've got. Be a shameless leech. Smile while you're doing it, and be very sure to thank them repeatedly.Group resources
Keep polling your membership to see if folks are interested in helping out. The burden of running a developers group is a very stiff one. You need help to get it done. Break tasks out into small jobs so your members can nibble of pieces of your workload. Here's a tough bit of reality: You won't get anywhere near the help you might expect. Your new members are folks with lives outside of work, and they're not going to be willing to take on the huge burden like you are. You'll have folks who offer to help, but won't follow through when you pass on tasks. You'll have mass silence when you mention a few opportunities to help during meetings. Don't get frustrated. (OK, too frustrated.) Before long you'll find one or two folks to help out. Take advantage of them, but make sure you understand exactly what level of commitment they're willing to take on. Don't overburden them past their borders -- you don't want to frustrate those folks who are willing to step up.Load up on swag
Stoop to shameless bribery of your members. Round up as much loot as you can to give away. Several book publishers are great supporters of user groups. Check out programs from Apress, Addison-Wesley, and O'Reilly. I had lousy luck trying to get ahold of anyone from Wiley/Wrox: rude folks who couldn't have cared less. Let me know if you have better luck with them -- they've got great books. Furthermore, look to publishers of neat tools and other software. See if they'll donate a copy or three for you to give away.Closing Thoughts
OK, I've rambled on enough. There are undoubtedly many things I've forgotten (Should have used GTD more better!), but this is a pretty good list. Leave me a comment if you stumble across this and find it useful, or if you've got suggestions to add to it. My work over the last few months has been fairly staggering, but it's been tremendously productive and interesting. Founding a developers group gets you in the door with some amazing folks. I've found contacts which will help me tremendously in my career, learned a lot of great things, and most importantly made some good friends.Tuesday, July 12, 2005
Great Music Never Dies
Some songs are always classics. I was singing this to my daughter the other day and thought I'd look to see if it was anywhere on the web. Boy, am I glad it's still alive and kicking! Even archived on a Boy Scout site. Now THAT is posterity, folks!
Innovation is a Cold Fish in the Face
So I must be the last person in the .NET development world to run across Rory Blyth's blog. He's got a hysterically on target post about how "Innovation" is wildly over-used, over-rated, over-everything.
Wish I had the dude's artistic skills.
SourceForge CVS Configuration Tips
Here are a couple good links if you're needing to get access to SourceForge's CVS system. I haven't found any plugins which interface CVS to Visual Studio, but there are a couple good workarounds.
Haacked uses TortoiseCVS for his interface. (via James)
SourceForge's Survival Kit and their Introduction to CVS Services are great helpers too. SF's examples use WinCVS which is a somewhat confusing, overly complex interface to CVS. Hmmm... CVS often seems somewhat confusing and overly complex, so it's actually a good pairing.
It's been a couple years since I used CVS. It certainly takes a bit of getting used to again.
Monday, July 11, 2005
Garden Blogging: Lavender Wave
We love lavender! We had a wonderful bush in our garden when we lived in Germany during the last century. (Heh. Doesn't THAT make me sound like an old fart!) We've been looking for something similar since we moved to Ohio and finally found some great bushes from Goodwin Creek.
This wave of beautiful lavender is the result of three bushes planted two years ago. It's on the southern exposure and the ground's covered with weed cloth and a layer of pea gravel. The lavender just sucks up the heat radiating off the gravel and brick wall.
What's really cool is that the lavender attracts huge numbers of bumblebees. There are between, no kidding, 45 - 60 bees swarming on the bushes at any time during the day. The bushes are right out our French door, so we're able to watch the swarm working its way through the lavender during the day. My five year old daughter and one year old son love to sit (safely!) inside and watch the little critters go at it.
We've got several other bushes planted along the same wall, but none is as spectacular as these three.
We've got several other bushes planted along the same wall, but none is as spectacular as these three.
Friday, July 08, 2005
Bad Pundits, Part II
I missed a real howler in Gwynne Dyer's column I blogged about earlier.
Dyer says "The point is they're only terrorists, and they can't hurt all that many people."
I guess Dyer doesn't count nearly 3,000 dead in New York and Pennsylvania on September 11, 2001 as "that many." Maybe he doesn't count nearly 4,000 murdered by Islamic terrorists since 1993 as "that many." (Perhaps he missed the Sun's article Evil across our planet which details the terrorist attacks.)
Maybe polemics on the right like Ann Coulter and Sean Hannity are writing similar dreck from the other side, but I don't waste my time at their sites so I wouldn't know. Dyer's stupid column really got my goat though, as you can tell.
Enough of this. I'm back to having breakfast with my daughter, then it's back to the grindstone.
"You're Out of Your Tiny Minds"
This Letter To The Terrorists, From London may be one of the best things I've seen written about yesterday's horrible bombings.
One of the worst things (and there's inanity aplenty on both sides of the political spectrum) I've read was Gwynne Dyer's column in today's Dayton Daily News. (Sorry, it's not online at the DDN's site, nor can I find it elsewhere.) Dyer, who holds a doctorate in military and Middle Eastern history and a masters in history, talks about how the bombings of London in WWII were not because of the Brits' way of life, but rather because of British policies abroad. He goes on that "the people who organized teh bombs wanted Britain out of the Second World War."
Seems to me Hitler was pretty bent on putting all of Europe, and eventually the world, under his Nazi party's boot. The scum in Germany those days weren't just looking to be left alone, they were looking to take over the world. The fascist, murdering scum masquerading as Islamists these days aren't looking to be left alone, they're looking to take over the world.
Dyer's got education aplenty. It's apparent he's either got no smarts, or is one of the many talking heads who starts first with an opinion and then looks to distort facts to fit their assumptions.
Thursday, July 07, 2005
AVOID!!! vb.doc addin for VS.NET
I've been trying to find decent tools for generating XML comment files from VB.NET code. VB-Commenter only works sporadically in the IDE, and can't be used from command line tasks like NAnt. (The owner's suggestion? Call devenv.exe instead of NAnt's solution task. Not gonna happen.)
I also tried VB.DOC and it's nicely killed my VS.NET installation. The Visual Studio Add In appears to eat Ctrl-V and Shift-Ins for Edit -> Paste shortcuts. No remapping works, the keypresses just get eaten. I got bored of hitting Alt-E -> P (I'm a lazy SOB), so I decided to try deinstalling the plugin. (James was some help in pointing out Dave had the same trouble caused by an add-in James couldn't remember.)
One small problem: Uninstalling kills VS.NET. Uninstall the piece of crap add-in and you're unable to load any VB.NET projects because "the Visual Basic .NET compiler can't be created." I've tried several different methods for uninstalling the add-in, all to no avail.
I've submitted a bug report at the project's SourceForge site. Hopefully I'll get a bit of help. In the meantime, I'm forced to reinstall the cursed software because I don't want to waste an entire afternoon reinstalling VS.NET.
More on NUnit Config Files
I blogged a couple days back about the mystery of NUnit config files, and how they differ if you're using the command-line test or the GUI project. I finally stumbled across more documentation on the NUnit site: Under the "Documentation" menu, check out the Supplemental PDF file. [NOTE: that link's not working too well at the moment.]
Also, NAnt lets you point an
nunit2 task to an NUnit GUI's project config file. This saves a lot of mess trying to fool with linking or copying config files around to their appropriate location during a NAnt build, plus you can use the same project file for both GUI and NAnt runs. I believe there are some differences in how the two sorts of config files, but I haven't had problems so far.
Here's how my task looks:
<nunit2>
<formatter type="Xml" usefile="true" extension=".xml" outputdir="${core.reports}\" />
<test appconfig="${core.source}\MyAppNunit.config" >
<assemblies basedir="${core.output}\">
<include name="*Tests.dll"/>
</assemblies>
</test>
</nunit2>
Wednesday, July 06, 2005
Handy NAnt Target
NAnt's -projecthelp option only shows targets in NAnt.build or whatever you've named your initial build file. Targets in included files don't get shown. Here's a helpful widget using NAnt's "script" capability to write a C# function.
Paste this into your common or core build file and you'll have the ability to see all targets in your merged build files.
I can't take credit for this -- I found this snippet a year or more ago somewhere on the web, perhaps on the NANT-USER mailing list. I don't recall who wrote it, but here's a virtual beer mug raised in your direction.
<!-- 'nant -projecthelp' shows only targets in NAnt.build, not in included files -->
<target name="showtargets" description="Show targets in all included build files">
<script language="C#">
<code><![CDATA[
public static void ScriptMain(Project project) {
foreach( Target t in project.Targets ){
Console.WriteLine( t.Name + ":\n\t " + t.Description);
}
}
]]></code>
</script>
</target>
Moving Woes
Pal Ben Carey's had a horrible experience moving. It sounds like both Allied Van Lines and their agent Berger Allied have been the usual near-criminal scumbags that too many movers are.
We've moved six times in the last 11 years, all due to military relocations. Moving sucks. Most movers suck. Badly. There are also plenty of criminal thugs masquerading as movers -- they'll hold your household goods hostage until you cough up another $30K - $50K to cover "additional expenses."
Moving's is a crappy experience even if everything goes well. It can easily turn into your worst nightmare. Make sure you do a lot of preparation before the movers show up. Understand what you need to do to protect yourself. Clark Howard's website has plenty of resources if you search on "moving". He's also got resources if you get screwed as badly as Ben did.
Versioning Using NAnt
I've posted already on how much I'm getting out of Marc Holmes' Expert .NET Delivery using NAnt and CruiseControl .NET. (Marc's no relation to me, at least none that I know of.)
One of the topics within is versioning. Marc uses the
version task from nant-contrib to increment build numbers held in a Build.Number file. This gets used in the same work task to create the assembly information via the asminfo task. I found one mistake in his example code, plus made one enhancement to it. Changes are below. (I should say I think I found a mistake. I haven't heard back from him yet.)
The mistake seems to be that the incremented version number isn't used when generating the AssemblyVersionAttribute. The enhancement I did was wrapping the Build.Number file into Source Safe, checking it out before incrementing the version, then checking it back in afterwards.
Below is the updated XML for the task. I'm not going to fill in all the NAnt properties created upstream from this task-- they're pretty obvious. Note that Marc's strategy uses the debug property to control whether the build number's incremented or not. You don't have to increment build numbers if you're just testing additions to the NAnt scripts. I may rename this property in the future since "debug" means different things to me.
Marc also uses a CommonAssemblyInfo file which he links to individual projects within a solution, a great trick for cutting duplication of redundant information. ("Duplication of redundant..." Clever, no?)
<target name="version1" description="Increments version number in CommonAssemblyInfo file.">
<property name="sys.version" value="0.0.0.0"/>
<ifnot test="${debug}">
<!-- Enhancement: check out Build.Number file from source control -->
<vsscheckout
username="${vss.username}"
password="${vss.password}"
localpath="${core.source}\"
recursive="false"
dbpath="${vss.dbpath}"
path="${vss.path}\${solution.name}.Build.Number"
/>
<version buildtype="Increment"
revisiontype="Increment"
path="${core.source}\${solution.name}.Build.Number"/>
<!-- Bugfix: store version task's output back to sys.version property if we're incrementing -->
<property name="sys.version" value="${buildnumber.version}" />
<!-- Enhancement: check Build.Number file back into source control -->
<vsscheckin
username="${vss.username}"
password="${vss.password}"
localpath="${core.source}\${solution.name}.Build.Number"
recursive="false"
writable="false"
dbpath="${vss.dbpath}"
path="${vss.path}\${solution.name}.Build.Number"
comment="Incrementing for version ${sys.version}"
/>
</ifnot>
<attrib file="${core.source}\CommonAssemblyInfo.vb" readonly="false" />
<asminfo output="${core.source}\CommonAssemblyInfo.vb" language="VB">
<imports>
<import name="System" />
<import name="System.Reflection"/>
</imports>
<attributes>
<attribute type="AssemblyVersionAttribute" value="${sys.version}" />
<attribute type="AssemblyProductAttribute" value="${solution.name}" />
<attribute type="AssemblyCopyrightAttribute" value="Copyright (c) 2005, ${company.name}"/>
<attribute type="AssemblyCompanyAttribute" value="${company.name}" />
<attribute type="AssemblyTrademarkAttribute" value="Trademark by ${company.name}" />
</attributes>
</asminfo>
<attrib file="${core.source}\CommonAssemblyInfo.vb" readonly="true" />
</target>
This approach may not work for everyone. In particular, the linked CommonAssemblyInfo file won't work with Web projects because of their pain-in-the-ass broken up directory structure. It also doesn't give granular control down to each assembly. That's OK, because Marc says frequently in his book that his topics aren't solutions for everyone, they're guides to get you started.
So there you have it.
UPDATE: Marc pointed out that sys.version is the property set by nant-contrib's <version> task -- in earlier versions of nant-contrib. I'm using 0.85RC3 which defaults to buildnumber.version. I should have checked that from the get-go!
Monday, July 04, 2005
"Refactoring" Web Sites
OK, so I've spent a couple hours refactoring my LLC's website. Can one refactor HTML and CSS? It's not really code (I once saw a shirt which said so, hence it must be true), but I do think one can indeed refactor the stuff. More tricks learned from Meyer's wonderful Cascading Style Sheets: The Definitive Guide, 2nd Edition, more fun playing around with site design. (And it's obvious that I'm no graphics wiz like this incredible lady.)
Meanderings aside, this was a good chance to fix a couple things which had been bugging the heck out of me. Text size changes don't bust everything now, the content's centered in a floating box thanks to
margin-left:auto and margin-right:auto plus a new <div> surrounding my content, which means my menu bar, title, and other elements stay nicely tied together when resizing. The only small hitch is a slight bounce if content runs off the bottom of the screen and a scrollbar appears. Can't fix everything right now, what would I have to do later?
I also got rid of the transluscent tan color box for the left sidebar list and just made that a separate background-color property. Having some transluscency let the background image show through which I thought was cool; however, the resizing text issues just made it a mess, so now it's a solid background color. In the earlier version I'd cheated and made the tan box transluscent by overlaying it on the background image while working in PaintShop Pro. That looks cool until somebody resizes text or gets funky with aspect ratios and the sidebar text ends up somewhere in Puerto Rico sipping rum on a beach.
Unfortunately, there's no good way to do transluscency in images -- at least according to The Zen of CSS Design: Visual Enlightenment for the Web. Leave me comments if you know otherwise.
So there you have it. More refactoring to make my site look more better more better. I'm still a long way off from being a sharp web designer, but that's not where I'm going. I'm pretty satisfied with what I've got now!
(By the way, my rose graphic logo was done by my friend Jenn Farington. She's a great artist who makes wonderful handbags, scarves, etc. from beautiful materials. Check out her great works at Piece Lily.)
Wonderful Web "Standards"
I've just noticed that my LLC's site looks like crap in IE. The left sidebar doesn't display, only the colored background, plus the margins are all crappy. Arrgghh. I thought I'd checked all this out in both IE (sucky) and Firefox (killer). My CSS and XHTML all validates, so now it's off to delve into the subtle "feature" CSS handling of IE.
Hopefully this was something in one of the last couple changes I did, otherwise I'll have had a long period of lookign like the web design bozo I really am. Ptooey.
Happy July 4th!
Celebrate the founding of our country on July 4th, 1776.
Celebrate the founding of a creaky, ever-developing, wonderful experiment called representative democracy.
Celebrate the founders who risked all to create this beautiful thing called the United States of America.
Celebrate a land where lefty polemics like Michael Moore can make anti-government propaganda films staggering in their dishonesty (see also Leni Riefenstahl) and not only stay out of prison but make millions while doing so.
Celebrate a land where conservative polemics like Ann Coulter write empty hyperbole and get action figure dolls modeled after them.
Celebrate a land holding cities like New York, Los Angeles, Chicago, and a myraid of others where people of amazingly diverse backgrounds live in relative tolerance. (Sure, we have issues here, but compare us to Rwanda, Boznia, etc.)
Celebrate a land reviled by students of hate-filled Islamic massadrases, yet so loved by masses of others around the world that they'll risk stowing away in cargo containers to escape oppression in their native homelands for a chance at opportunity in this land.
Celebrate a land where a Hungarian immigrant can create a wealth of billions by shady dealings in financial markets and spend 28 million of those dollars creating disengenuous, hate-filled organizations in an attempt to unseat our President. Hey, Soros: I'm a starving developer with a family and a mortgage. How about giving me some of that money?
Celebrate a land where an Austrian immigrant can land on our shores with lint in his pocket, yet rise to the top of Hollywood and govern the nation's most populous state. (And have an action figure doll made after him.)
Celebrate this land called the United States of America. Long may her amber waves of grain and alabaster cities serve as a shining beacon to those wanting liberty and freedom.
Friday, July 01, 2005
Great NAnt & CruiseControl.NET Book
I'm working my way through Expert .NET Delivery using NAnt and CruiseControl .NET from Apress. Holy smokes, what a terrific book! This is real world stuff diving deep into details, not a light fluff overview.
What's cool is that the author, Marc Holmes (no relation), approaches the process of designing a good delivery system/methodology just like designing good softare: a few use cases with expected outcomes which are used as guidelines for building up the various scripts needed to get delivery tasks done. Marc also uses refactoring to get the scripts up and working: build something a bit kludgy to test your assertions, then refine it.
Marc shows off some pretty cool stuff about the NAnt, including how to wrap in third-party tools (FxCop, before its inclusion as a nant-contrib task, e.g.), plus he walks through some good tutorials on extending NAnt.
Right now I'm in the chapter on getting a database into the picture for testing and it looks pretty impressive so far. Marc covers using the Red Gate SQL Bundle, a set of tools which ease integration of database activities into the test and delivery processes. The package isn't chump change ($350), but it's most likely worth it if you're doing at least a moderate amount of SQL work in your projects.
An important note: I think this book is really applicable to cross-platform use. Sure the specific tools are NAnt and CruiseControl.NET (plus many other widgets), but the concepts are applicable to folks doing Java development using Ant and CruiseControl. Furthermore, I think this book pairs up terrifically with Steve Loughran's Java Development with Ant. Loughran's book was a terrific eye opener to me for specifics of laying out projects with abstracted build files, plus he hits testing, deployment, and library inclusion too. Both books together really help out folks using Ant/NAnt and CruiseControl/.NET.
I'm looking forward to finishing up Marc's book. Everything's been great so far, and I've gotten some terrific ideas so far.
<disclaimer>I got this book free as part for giveaways at the Dayton .NET Developers Group. If you think my opinion gets skewed because I got something for free, well then, you haven't gotten a good feel for who I am. Check out the rest of my blog and maybe it will convince you otherwise.</disclaimer>
NUnit and Config Files
I'm writing NUnit tests using System.Configuration.ConfigurationSettings.AppSettings to read in database connection strings. NUnit needs a configuration file, but the documentation's confusing on where it needs to go. Thankfully, Ross Pressner posted a clearly written description to microsoft.public.dotnet.general back in September, 2004.
If you're testing using a dll holding your tests, then your config file needs to be co-located with that dll. If your tests are located in an NUnit project file, then your config file needs to be co-located with that file.
For example, tests in the assembly
D:\projects\MyApp\DataLayerTests\bin\DataLayersTests.dll
needs a config file like so:
D:\projects\MyApp\DataLayerTests\bin\DataLayersTests.dll.config
Tests in the NUnit project file
D:\projects\MyApp\MyTests.nunit
need a config file like so:
D:\projects\MyApp\MyTests.config
Be sure to carefully note the naming variants.
Thursday, June 30, 2005
Automated Web UI Testing
Scott Hanselman is using Watir, an open source Ruby library, to do his Web App testing. He says it's "the bomb." It wires together with NUnit by spawning a new process on Ruby's shell to run asserts from Wasir. Looks pretty neat.
Hanselman also points out how to use Firefox's Web Developer extension to help out. Another +1 reason why Web Developer's so cool.
I've got some upcoming work which will need some web testing. I'll be sure to look at this!
Wednesday, June 29, 2005
Forgotten Passwords for MSDE 2000 or SQL Server?
I know I never have, but here's a fix in case you have: while logged on as a user with admin privileges, change the login security mode to Windows Integrated. Use
osql -E to log on, then use sp_password to change the sa account's password. Remember password or note it in a secure place. Change back to the appropriate security mode and you're set. You'll need to first stop the MSDE or SQL service, plus close out any apps (including VS) which might be using the services.
There's a good article covering this on Microsoft's help site. I stumbled across this while looking for something else, because I'd never, ever forget a password.
That's my story and I'm sticking to it.
My "Effective C#" Review on Slashdot
I wrote a review for Bill Wagner's Effective C# and posted it to Slashdot. Slashdot actually gives a hoot about how reviews read. Tim Lord is a tough, but fair editor who helped me to polish up my review. He's a tougher editor than my wife, even, and I didn't think that was possible! The end result was a much stronger product and the editing process was actually enjoyable because Tim edited the structure of my review, not its voice or style.
So the review's finally up on /. and the reaction from the crowd ranges from insulting to insightful to amusing.
Insults include the normal Microsoft bashing from folks who can't get past C# being a Microsoft product and look at its many benefits. A couple folks also didn't like that I'd gotten the book for free as part of the Dayton .NET Developers Group, or that I'd tried to pull Wagner's company in on a consulting gig some years ago. I put forth both those points in a disclaimer section at the front of the review just to be clear about it. How many others are up front about similar situations? Give me a break.
Amusing includes the folks who blew off Wagner's book as just another syntax or design book. A couple folks preferred works from Herb Schildt whose books, in my opinion, have numerous errors or bad practices and clearly demonstrate that one doesn't have to be a good programmer to write vast numbers of books. More folks said something along the lines of "Just get a design patterns book, that's all you need!" No, dudes, Wrong Conclusion.
Insightful points included one fellow remarking I'd missed an important point by associating Wagner's book with Scott Meyer's Effective C++ which really is a seminal work for C++ developers.
Thankfully there appear to be quite a few folks who understand that Effective C# isn't about syntax and it's certainly not just a replacement for design patterns. Syntax and pattern references have their required places on the bookshelf, but books like Wagner's are just as vital on the bookshelf. Good developers/engineers/geeks need to understand the ramifications of specific choices for the language they're working in. Wagner's book hits this on the head.
I had a feel for what the crowd reaction on /. would be when I wrote the review. All the same, it's an amusing thing to see in reality!
Tuesday, June 28, 2005
VS2003 Solution Templates
More stuff everyone else most likely knew ages ago, but since I'm just starting out in this envronment...
Here's a good MSDN article on creating your own solution templates in VS2003. This shows how to nicely break out solutions in n-Tier format, plus there's some good discussion on architecture and application modelling. Very useful stuff.
Documenting Code with VS Macros
There's an interesting-looking article on MSDN about using Visual Studio macros to document source code. It appears this is only applicable to VS2005, but the macros support VB.NET too.
It will be interesting to check this out and see how it compares to Roland Weigelt's killer tool GhostDoc. GhostDoc (C# only) generates all the comments for fields, methods, etc., plus fills in the comments by deducing text from the names and types of the target. You get near-perfect complete comments -- as long as you've done a good job with your naming. (Go read McConnell if you aren't doing a good job naming!)
There are also a couple widgets which will allow you to get XML document files produced from VB.NET code in VS2003. Check out VBCommenter and VB.DOC. I'll be exploring both these, and how well they wrap into NAnt, as part of my upcoming project.
Monday, June 27, 2005
Virtual PC & CD/DVD Issues: RTFM
I spent a couple hours this morning trying to figure out why Virtual PC wouldn't recognize my Win2K CD I'd created from an MSDN ISO image. I couldn't get the d@mned thing to boot off the CD, even though the host system would recognize the disc and boot just ducky. I've used VMWare for several years and never had any similar troubles.
Finally, I right-clicked on the image of the CDROM in the VPC's left tray. Lo and behold, a context menu with "Capture ISO Image" appears. Duh. A simple browse to the image file on the host system's hard drive and POOF! I'm off and running. A quick search of the VPC help file said as much.
Scott Hanselman had a good post on the importance of starting out with fundamentals when troubleshooting an issue. His team lost half a morning for ten folks. I just lost a couple hours, but it was a good kick in the pants reminder to what I'd learned the hard way from some very tough sergeants when working on radar systems while flying on E-3s years ago: RTFM and KISS. Start with the basics, check the manuals. Usually not said in such a mild manner, though.
Sunday, June 26, 2005
Recipe Blogging: Brined Pork Loin
I was turned on to brining pork some years back when watching a show by Ming Tsai on FoodTV. I've come to the point where I brine most all larger pork cuts, be they thick chops or hefty loins. Brining's a great technique for keeping the pork very juicy and tender, plus it's a great way to infuse the cut of meat with great flavors. I've got a couple different riffs I use for pork. This one's my psuedo-Eastern variant. Check the Notes section for a psuedo-Southwestern variant.
Brined Pork With Bitter Vegetables (psuedo-Eastern Style)
Serves 6 - 8
1 x 2 lb pork loin, trimmed of fat (NOT a pork tenderloin!) ~1 qt water 1/3 c. kosher salt 1/2 c. sugar 2 bay leaves 5 - 8 green cardamon pods, cracked open 5 - 8 black cardamon pods, cracked open 2 star anise 2 - 4 pieces dried orange peel 2 Tbs Chinese style soy sauce 1 large bunch arugula (~2 c.) (radicchio works well here too) 1/4 red onion, cut into 1/4" slices- Pour the water in a heavy saucepan. Add the salt, sugar, bay leaves, both cardamons and star anise to the water. Bring to a simmer over medium-high heat, stirring frequently until the salt and sugar are dissolved. Remove from heat and leave to steep and cool.
- When the brine is cool, place the loin in a large ziplock bag. Pour in the brine, squeeze the air out of the bag and seal.
- Place the ziplock bag in a shallow bowl and leave in the refrigerator overnight. In the morning, turn the bag over. (Often the top side of the loin peeks out of the brine. Turning keeps the little bugger evenly brined.)
- About 90 minutes before serving, pull the pork out of the brine and rinse well. Pat dry, cover with a bit of plastic wrap and leave in a plate on the counter to allow it to get a bit closer to room temperature. (See Notes.)
- Get a HOT fire going off to one side, not the center, in your grill. I use charcoal and don't have any experience with gas grills. (See Notes for info on my charcoal use.)
- When the coals are hot, place a small disposable aluminum pan near the center of the grill.
- Working directly over the coals, sear the meat on all sides. This usually takes about 1-2 minutes per side depending on how hot your fire is and how close it is to the grill. Make sure to get all sides of the meat, including the ends.
- Pour liquid in the aluminum pan (beer, apple juice, or orange juice all work very well, all with subtle differences), then place the meat over the pan. Cover the grill and cook for 30 - 45 minutes until a quick read thermomneter reads 145F. (See Notes)
- Remove the meat from the grill, tent with aluminum foil, and cover with a couple kitchen towels to help preserve the heat.
- Let rest for 10 minutes. The meat's temperature will continue to rise a few degrees, plus the meat will firm up and won't lose all its juices when you cut it.
- While the meat is resting, place a sautee pan over high heat. Rinse the arugula and let drain a bit. Sautee the onions for a few moments in some olive oil. Toss in the arugula and sautee until slightly wilted. Remove from the pan. (See Notes)
- Slice thinly the pork and place on a platter. Cover with the arugula/onion mix and serve.
- Do NOT leave your pork loin out in a blisteringly hot spot in the kitchen, okay? Please?
- I use a charcoal chimney starter filled with briquettes (mine's even cheaper than the Weber). When those are hot I dump them in my grill and pour on a large heap of hardwood lump charcoal. The lump charcoal gives the food great flavor, the briquettes longer lasting heat.
- I have a passle of lava stones in my charcoal grill which are normally used for gas grills. I do a lot of indrect cooking where the meat's off to the side of the coals. The lava stones make a great heat mass, distributing the heat from the coals evenly throughout the rest of the grill.
- Overcooked meat is awful, but undercooked is nasty and potentially unhealthy. Various chefs I've heard have all said 137F is the magic number to kill off the nasty bugs which may live in your cut of pork. The extra temp here is for security, but still leaves the pork nice and moist -- plus the brining helps ensure moistness.
- The bitter arugula or radicchio gives a wonderful contrast to the pork's sweetness. This is an Italian cooking trick I learned from another FoodTV cook: Mario Batali.
- Southwestern variant: Leave out the cardamons, star anise and orange peel. Instead use 1 tsp cumin seeds, 1 tsp mustard seeds, 1 tsp black peppercorns.
- Last bit of TV chef wisdom: Don't panic if you char one side of the meat. Make sure to let the meat rest after removing from the grill. Then use a good, sharp knife and cut the meat very, very thinly. We're talking nearly lunchmeat thin. Having the meat so thin really reduces the impact of any char I mean slightly overdone portion. I learned this from Iron Chef Sakai who I saw once badly zorch a cut of pork. He never let on that he'd overcooked the meat. Instead, he sliced it very thin and got terrific compliments from the tasting panel. Who says TV ain't educational?
Code Metrics Tools
Dave Donaldson posted on NDepend, a good-looking metrics tool. I'm excited about checking it out; hopefully it supports VB.NET as that's what my upcoming project will be in.
A couple other good metrics-related tools which I've found handy:
NCover's got a spate of widgets to go along with it, making it a very handy metrics tool for seeing unit test code coverage.
Other good tools:
- DevMetrics' community edition
- CRPlugin for DXCore. I haven't fooled with this in some time, so I'm unsure of its status. The Project Page has said they'd have more content up in "the next week or two" for the last several months...
Thursday, June 23, 2005
Wal-Mart Wants Your Home
The Supreme Court has decided that your community leaders can evict you from your home in order to build shopping malls and hotel complexes in order to increase tax revenues. The Fifth Amendment, which allows the government to take private land for "public use", has taken a beating in the last decade. Wal-Mart, Costco, and numerous developers have persuaded local community leaders that "public use" really means taking away the home you've been paying for and raising your family in, only to increase the community's tax base.
I doubt that any of these community leaders have evicted themselves from their homes...
(Via Instapundit)
Daily Finds #149
OK, so I'm off by a couple.
All right, I'm off by 148 Daily Finds.
- From Scott Hanselman: some killer music.
- From Eric Gunnarson: A horribly addictive game. Stay away if you value your sleep and sanity. I mean it.
Wednesday, June 22, 2005
Palm 500 Woes
I bought a Palm 500 around four years ago. I'm a cheap SOB and didn't want the flashy colors or extra widgets associated with the higher-end models. Plus I had to buy it out of my own pocket because the company I was with at the time were even cheaper SOBs who didn't seem to think I needed to have any mobile device when I was onsite with customers. (One of the many reasons they're the company I used to work for.) The 500's been a terrific servant and I've had a great experience with it.
Unfortunately, the damned thing's not working well with my new install of Office 2003. The m500 is PalmOS 4.x and DataViz's Documents To Go/Inbox To Go doesn't work well with the newer Office. Well, to be more precise, DTG's latest version works fine, but not v6.x which I have and which is the only version which will run on PalmOS 4x. Crap.
So now I'm going to have to look around for whatever newer low-end model will work with my mishmash of software. Bother.
I'd love to hear any feedback any of my four readers out there might have. What kind of PDA are you using, and more importantly, are you happy with it?
Tuesday, June 21, 2005
Great Tool: MindManager
Ben Carey blogged about how useful Mind Manager is here and here. All the other tips I've gotten from Ben's blog have been great, so I decided to give Mind Manager's demo a try.
Holy smokes. Ben wasn't kidding. This is what Microsoft's One Note wished it was half of. It's terrific for rapidly brainstorming out ideas, organizing them into a sensible map, assigning tasks, and showing interrelationships. I love the visual aspect of it, and I think it's a good start for a Big Visible Chart. I've played with it for outlining a couple book reviews, laying out infrastructure tasks and knowledge building I need to do, plus have started an initial map of a potential project I may be working on.
MM Pro even links tasks from maps into Outlook, so it's a great organizational help for keeping your work straight. I've just scratched the surface of this neat tool. I'm sure I'll find more great stuff in the next couple weeks.
The brainstorming aspect of MM is what really attracts me. I've sat in plenty of BS (brain storming, not the other BS) sessions where I wished I had a good tool for capturing ideas flowing out. MM helps with not only the capture of ideas, but I believe it would be a terrific helper in keeping creative ideas pouring out.
The professional version's not cheap: $350, but the standard version just doesn't seem anywhere close in comparison. I can't foot the bill for Mind Manager until I get some steady revenue coming in, but it's definitely on the list for future tools to buy. Until then I'm stuck with the crappy Mind Manager wannabe One Note which came with my MSDN subscription.
ASP Apps Without Web Projects
I've just started working with Web applications in VS.NET 2003. One big gripe: I hate the mess with Virtual Directories scattering files all over the place.
Thank goodness I picked up a copy of Expert .NET Delivery Using NAnt and CruiseControl.NET by Marc Holmes. I found a gem of a reference tucked in all the other great info in the book: Swapping Web Projects for Class Libraries. None other than Fritz Onion has a Wiki site explaining the steps involved. He also gives a bit of background on why he does web apps this way.
Fritz's hack I mean trick gives you the web component wizards within class library projects.
Much cleaner, much simpler.
Monday, June 20, 2005
Book Review: Wagner's Effective C#
Here's a review I posted on Amazon.com regarding Bill Wagner's Effective C# from Addison-Wesley. The review's been slightly edited from what I posted on Amazon.
Disclaimers: 1) I got this book for free from Addison-Wesley as a regular giveaway for our .NET Developers Group (www.DaytonDevGroup.net). 2) I attempted to get SRT Solutions, the author's consulting company, involved in a software development project several years ago. The project tanked due to customer constraints and other business issues not related in any way to Wagner or his company. End Disclaimers.
Wagner's book is a terrific companion to books like McConnell's Code Complete, 2nd ed., or Kernhigan and Pike's The Practice of Programming because it's specific to C# and hits hard the implementation details of working in that language.
I also think this book speaks to a wide range of readers. Certainly, seasoned developers will blow through this content, fine-tuning their coding methods or starting new ones. Wagner specifically points out how practices experienced C++ developers may use aren't good practices in C#. New developers also can greatly benefit from this book by using it to properly form development habits early in their careers.
There are a large number of typos which really stinks because it needlessly detracts from an otherwise terrific work. A-W obviously had lousy proofreaders for this task.
Wagner's writing is clear, concise, and targeted to helping developers understand the ramifications of various choices when working in the .NET Framework and C# specifically.
Which brings me to a point: Don't skip this book as Just Another C# Reference. It most certainly ain't that. It's a terrific book on specifics for implementation. I also think it's got content which spans the gap from C# to other .NET languages. Not everything's applicable to VB.NET or COBOL.NET (Ick!), but there are still some sound general .NET principles.
Good developers need to understand the ramifications of choices they make designing and implementing a system. Wagner's book is invaluable for this, and it certainly belongs on any C# developer's bookshelf.
Tuesday, June 14, 2005
Legal Guide for Bloggers
The Electronic Freedom Foundation has an interesting-looking guide to legal issues for bloggers. It runs the gamut from liablility issues to FAQs on issues you might face when doing political blog coverage of campaigns. (Thank the reprehensible actions of our federal government, elected and not, for vague restrictions on your First Amendment rights regarding election and political coverage.)
(Via Jeff Jarvis.)
Bread Blogging: Garden Herb Bread
This is is adapted from Electric Bread, a great book full of good recipes for your bread machine. I do a lot of rustic loaves, but it's nice to pull out the machine once in awhile too, although I most often tend to start a batch on dough cycle, have it knead, and then do the final rise and bake in a regular loaf pan.
Without further ado,
Garden Herb Bread
1 1/8 c. water, warm (~90 - 100F) 3 tsp active dry yeast [see NOTES] 1 c. white bread flour 1 c. whole wheat flour 1 c. amarath flour [see NOTES] 2 Tbs dry milk 1 Tbs honey 1.5 tsp salt 2 Tbs butter 1 Tbs minced fresh chives 1 Tbs minced fresh marjoram 1 Tbs minced fresh thyme [see NOTES]- If using a bread machine, pour the water in the dough bucket. Sprinkle yeast on top. Let the yeast bloom about five minutes. If mixing by hand, pour water into a large bowl, sprinkle yeast on top and let bloom five minutes. [see NOTES]
- Keeping aside 1/4 c. of the white flour, add in the remaining ingredients and turn on the bread machine's dough cycle. Keep a close eye on how the dough's progressing, adding in extra white flour so that the dough is barely tacky. If mixing by hand, do the same -- keep aside some of the flour, add the rest of the ingredients and knead for ~10 minutes. I won't go into details of hand mixing -- please see Reinhart's The Bread Baker's Apprentice: Mastering the Art of Extraordinary Bread. [see NOTES]
- Let the dough finish rising in the dough cycle if you're using the machine. If hand mixing, scrape out the bowl, lightly oil it, plop the dough in, roll it around, cover with a plastic sheet and let rise in a slightly warm place for ~60 - 90 minutes until doubled in size.
- Remove the dough from the machine or bowl and place on a lightly floured surface. Gently pat into a rectangle 8" wide. Roll the rectangle up, pinching the seam as you go. Gently plop into a bread loaf pan. Spritz the surface with cooking spray and cover loosely with plastic wrap. Leave to rise until the loaf is about one inch above the lip of the loaf pan. This will take about 30 minutes if you used a bread machine (the dough will be very warm and the yeast very active), or about 60 minutes if you hand mixed.
- Well before the loaf's rising is complete, preheat the oven to 375F.
- When the rising is complete, remove the plastic, and set the loaf in the oven. Bake for 30 - 45 minutes until an instant read thermometer shows 195 - 200F in the center. Remove from the oven, wait five minutes, then remove the loaf from the pan.
- Now comes the worst part. Let the loaf cool completely on a cooling rack. Avoid slicing into the loaf immediately because it's finishing up its baking as it cools. Slicing into the loaf right after it comes out of the oven will leave you with a slightly soggy center.
- OK, you can't wait an hour and neither do I, but at least give it 15 minutes to cool. The bread will still be warm enough to melt some butter or margarine, but will have gotten past the slightly soggy center stage.
- Amarath flour. Good stuff. From an ancient grain (woo, that sounds impressive!), it lends a neat, nutty flavor to loaves. Best used as 25% - 33% of the flour in a recipe. Find it at Trader Joes or better supermarkets.
- Herbs. Try to use fresh herbs, but not everyone's got them at hand. 1 tsp dried (not ground!) of each would work fine, but be sure to smash the dried herbs in the palm of your hands before adding -- it helps to bring out the aromatics in the dried herbs. Cut the measurements to 1/4 tsp if you have ground herbs.
- Yeast. Use a good quality yeast like SAF if you can find it. Fleischman's is fine, but SAF is a wonderful step up. Letting the yeast bloom, or proof, is a critical step in getting the best performance from it, especially if you store your yeast in the freezer.
- Kneading/Mixing. Take care with the texture and feel of the dough if you're used to making rustic breads. Rustic doughs are sloppy sloppy wet wet mess messes. This loaf should be barely tacky at the most, and absolutely not sticky. Add more flour as kneaded. Heh.
Saturday, June 11, 2005
Dayton .NET Developers Group News
Today I had the neat experience of appearing on IT Matters, Dayton's local talk show on 1410, WING AM. Dave Donaldson of the Columbus .NET Developers Group joined me to help publicize the great .NET developer communities we have in Columbus, Cincinnati, and Dayton. (OK, it was mostly to help me publicize Dayton's group.)
Brad Proctor and Bob Kwater took great care of us and provided a terrific venue for pushing the value of joining a .NET developers group. The downside is that the IT Matters show is on Saturdays during baseball season -- normally it's on during prime weekday evening commute time. Still, I'm hoping we'll get a fair amount of interest generated from this show. I'll be continuing to appear on a monthly basis to talk about each month's upcoming topics.
Me big radio star. Ugh.
UPDATE: Fixed spelling of Bob's name. Also, Michele asked for info about the group -- here's the Dayton .NET Developer Group's site. Should have put that up from the first. Duh!
Garden Blogging: Rose Squatters
A robin family built their nest right on the rose trellis by our front door. Last year a family built a nest in the Japanese Maple right in front of our reading room window which was great for our daughter to watch the little babies -- until our cats cleaned out the nest. We came close to felinecide on that day, let me tell you.
This family chose a much better location. Our cats are tough decendants of farmyard cats, but I don't think even they could scale this trellis into the nest protected by the New Dawn's aggressive thorns!
Look closely to Momma Robin's left (your right) and you'll see two beaks poking out from under her protection. Pretty cool!
Garden Blogging: More Roses
Yes, you have to suffer through lots of pictures of my roses. I've worked hard with them. The least you can do is suffer through a few pictures of them. Be thankful my wife's forbidden me from posting pictures of my kids on my blog.
This shot is of my New Dawn climbing rose at my front door. I planted it three years ago and it's really exploded. There's a neat quip about climbing roses: the first year they sleep, the second they creep, the third they eat your house. This one's certainly doing that. In addition to all the growth in this photo, the rose wraps around a corner to the right and spreads over the front of the house as well.
Be sure to check out the next post/photo for an interesting detail of the rose bush.
Friday, June 10, 2005
Recipe Blogging: Carnival of the Recipes #43
Songstress7 has outdone herself with this week's Carnival of the Recipes. I'm there myself with my FrazzledDad Fajitas, but check out all the other great stuff contributed to this episode of COTR.
Check out Beth's site for the complete list of COTRs on the right sidebar.
Current Reading
Books I'm currently reading:
John Steakley's Armor. Looks to be several parts with varying central characters. Centers on a horrible war with "ants" on a poisonous planet. Loved the first story, am very tired of the second. Hope the remainder is as good as the first. (Via DonXML)
Test-Driven Development By Example by Kent Beck. I'm late getting to this standard bearer. Enough glowing stuff has been written about it elsewhere. I'll just say I'm very impressed and like the practical approach.
Developing Web Applications with Microsoft Visual Basic .NET and Microsoft Visual C# .NET and the Exam Cram version of the same title. The Exam Cram is much better than the Windows Apps in C# version which I found way too shallow. The Microsoft product seems pretty good so far.
In the pipeline
Design Patterns by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Way overdue on getting to this critical piece of work. I took a quick look at the abstract/concrete factory discussion and found it pretty impressive. Agile and Iterative Development: A Manager's Guide by Craig Larman. Got this one from Ben Carey's blog. Every reference from Ben has been golden, so I'm looking forward to this one too.Thursday, June 09, 2005
New Federal Bill Against Municipal Broadband
Congressman Pete Sessions (R-Texas) has decided municipally-sponsored broadband networks aren't innovative enough, so he's sponsoring a bill to block all municipalities from establishing any broadband networks. (Stories here and here.)
Sessions' bill is titled "Preserving Innovation in Telecom Act (H.R. 2726)". Apparently, Sessions feels local municipalities shouldn't have the ability to spend taxpayer monies on such infrastructure, leaving this line of business only for private industry to monopolize without competition from the government.
This is one area where Dayton is actually on the leading edge of a neat trend. Dayton's got an ever-increasing Wi-Fi hotspot and it's a neat resource. (Uh, I've never used it, but it's still a cool concept.)
Sessions said his goal was to "discourage municipal governments from wasting taxpayer funds". It's not like the Feds waste any money. My Republican party has moved from the party of small government to the party of can't-be-big-enough government. God forbid local municipalities and their citizens figure out for themselves if tax dollars should be so spent.
Why the hell should the Feds stifle this? Gee, maybe it's because Sessions spent 16 years at Bell Labs, then followed on as a district marketing manager for Southwest Bell in Dallas. Think the telecom industry isn't worried about such competition? We're not far off from the turn of the 20th century where the rail barons came to Washington, DC, literally carrying steamer trunks stuffed full of cash to give to our elected officials.
Via Instapundit
Wednesday, June 08, 2005
Good Presentations vs. Bad Presentations
Need any more convincing that you shouldn't run your presentations by simply regurgitating the badly-formatted content you threw up in awful colors on your PowerPoint slide? Check out Jason Olson's comments covering Tech Ed Day 1, VS Team Systems, Connected Systems, and Software Factories.
You may have great ideas, and you may be smarter than the average bear, but you ain't doin' nobody no favors if you can't get your message across to the audience. Do some research on presentations. Tom Peters' "Presentation Excellence" is a good start, or Drew Robbins' tips, or Hanselman's.
If you don't, you'd better hope you don't have folks like Olsen in your audience who will skewer you on your feedback form, or worse yet in a public arena like a blog.
Tuesday, June 07, 2005
ReSharper 2.0 Early Access Program
Earlier I posted about ReSharper, a great refactoring tool. A new version is in the works.
ReSharper 2.0 is in an Early Access Program (EAP) -- pre-Beta, but it's accessible for developers who want to try it out and give some feedback on where the software should go. Check out the Resharper 2.0 EAP site if you're interested in getting on board.
Monday, June 06, 2005
Me.MCP = True
I just passed my Windows Apps in C# cert test. Woohoo! One test down, four more to go for my MCSD.
D-Day Anniversary
I'd completely forgotten today's the anniversary of D-Day until I stopped by Power Line's blog. Power Line links to a great column by professer David Gelernter: "Too Much, Too Late."
Gelernter's column is about the rampant hypocrisy by many in the "cultural establishment" (whatever that is), but what I found good reading was his recital of four important, long-forgotten issues of the war: The major battles, the bestiality of the Japanese, the attitudes of the American intellectuals, and the veterans' neglected voices. Of these, I think the last point may be the most important.
World War II produced a huge amount of material written by soldiers on the front lines. It was the first war where there were enough literate folks in the trenches to be able to effectively document the horrors they lived through. I think we as a nation have lost track of those voices and those stories. That's a shame, because I think we ought to have a better understanding of the terrible sacrifices made to put down fascism and keep our world safe.
Reading List: Lucky or Smart?
Lucky or Smart?: Secrets of an Entrepreneurial Life, by Bo Peabody.
I got wind of this from Ben Carey's blog and I'm glad I did. It's a very short book, perhaps an hour read (I'm a fast reader) and well worth the time. Peabody makes some great points which are very applicable to anyone's work situation, regardless of whether you're trying to start up a restaurant, get a startup .com going, or just trying to get along with your co-workers and bosses.
Peabody's salient points include checking your ego at the door when dealing with customers, building an environment which fosters creativiting, and a very interesting discussion of A students vs. B students. Peabody's contention is that B students make great entrepreneurs because they're well-rounded while A students make the brilliant geeks and managers because they're tightly focused in one domain. That's poor treatment of his great discussion, so go read the whole thing.
Recipe Blogging: FrazzledDad Fajitas
We loves fajitas with grilled chicken or flank steak, but I don't have energy and time on weekdays to do the entire production of marinating, getting the grill going, charing the flesh, etc. This recipe's a quick and easy variant that's probably guaranteed to irritate the Authenticity Police. Too damned bad.
FrazzledDad Chicken Fajitas
2 chicken breasts, boned and skinned olive oil fajita seasoning (see Notes) 1 lime, cut in half- Lay one chicken breast out on your cutting board (see Notes) and cover it with a sheet of plastic wrap. Using a meat mallet or wine bottle (see Notes), smack the breast until it's nicely thinned and flattened. Work from the center out.
- Smear the breast on both sides with a bit of olive oil, then cover liberally with fajita seasoning. Repeat the smashing and seasoning with the other breast. Cover the breasts with the plastic wrap and set aside for a few minutes to let the flavors develop a bit.
- Heat a skillet to medium-high. Drizzle in a bit of olive oil (boy, oh boy would a bit of bacon grease be wonderful here!), then slap in the chicken breasts. Cook for 3 - 5 minutes, then flip. Continue cooking for 2 - 4 minutes until nicely caramelized and cooked through.
- One or two minutes after flipping the breasts, squeeze the juice from the lime over the top. Don't do this right after flipping the meat -- the liquid will interfere with the meat caramelizing and getting a nice brown color. (Caramelization's vitally important for developing the best flavor from the meat, too!)
- Remove the breasts from the pan, cover with aluminum foil, put a couple kitchen towels on top of that (better heat insulation prevents the meat from cooling off!), and leave to rest for a few minutes.
- Slice into strips and serve with tortillas, sour cream, seared onions, salsa, and the kitchen sink.
- I prefer fajita seasoning from Penzey's or Bolner's/Fiesta.
- If you don't have a meat mallet (and I don't), a wine bottle works great for tenderizing and flattening. I don't use the side of the bottle, but rather the bottom of it. I think that best imitates the action of a real meat mallet. YMMV. I'd also say one should use only bottles from the Savennieres, Chinon, or Barolo regions, but that may be overly picky.
- Regarding cutting boards and poultry: Things being what they are with poultry, I'm an advocate of not working with poultry on wood boards. I've got a plastic cutting board I use whenever I'm working poultry. It also gets an occasional washing with a bleach/water mix to kill off any nasty buggers leftover from the poultry.
Saturday, June 04, 2005
Tech Ed: My Photo
Friday, June 03, 2005
Resharper: Great Tool
So everyone else and their mother most likely knows this already, but Resharper is a killer tool!
I've just been playing with it a day and I'm in love already. Resharper gives you much better control over code formatting, including lots of options for brace placement. (My personal pet peeve is braces on a new line from their method, loop, etc. Whitespace is good. More whitespace isn't.)
The code completion is much more functional than VS, and the templates give me the kind of snippet generation capabilities I had when using the Java Development Environment in Emacs. (Abreviations where you enter "iter" and you get a context-appropriate iterator loop, for example.)
Plenty of refactoring tools, too -- and the 'rename' option actually digs down into .resx files, unlike Velocitis' Flywheel which I've been playing around with off and on for several months.
Another great thing is Resharper's error support. You'll get suggestions on how to fix issues, plus there's a green/orange/red status indicator right next to the vertical scrollbar in the code window. Problem lines get their own marker, so it's quick and easy to see where you might think about changing something.
I've just scratched the surface of Resharper, but I think it's going to be very helpful to me!
Thursday, June 02, 2005
Don't Ignore Exceptions!
I found a great post on Gregg M's blog talking about the importance of reporting exceptions instead of ignoring them.
A couple years ago I started some code reviews of a software package littered with sections like this:
try
{
//Do semi-important stuff here
}
catch (Exception e)
{
}
Gee, do you think any Exceptions generated in the try block might have actually been, oh, maybe important? The same code ignored return values from many API calls, including database transactions. It's not like we're worried whether or not a transaction was successful or not, are we? But that's a rant for another time.
Check out Gregg's post for some good reasons why Exceptions should not be handled as per the example above, plus a few suggestions on how to go about notifying the system about unexpected Exceptions.
(On a side note, I really appreciate the experience and smarts of the MSDN bloggers, but would it be too much to ask that they put an "About" section on their blogs? Am I supposed to slog through a year's worth of posts to try and figure out who Gregg M or Cyrus are? They've got great content; I'd just love to know where they fit in the picture. Rant off.)
Garden Blogging: Blooming Roses and Wildflowers
Wednesday, June 01, 2005
Do You Want Smarts, or Do You Want a Laundry List?
I sat in on a security presentation from Alan Holub at last year's SD West and was very impressed by Holub's mindset. He's also stirred up several pots with provocative posts on how getters/setters and extends break fundamental aspects of object-oriented programming -- and scathingly pointed his critics to the article Unskilled and Unaware of It: How Difficulties in Recognizing One's Own Incompetence Lead to Inflated Self-Assessments by Justin Kruger and David Dunning as a defense that some of the more vocal folks were just to ignorant to understand what he was getting at.
Today I ran across an older article of Holub's, When Hiring, Smarts Beat Skill Lists on the Software Development Times site. (Registration required.) Holub makes some great points about how many companies really are clueless when trying to bring on good developers. "Required" skills are often laundry lists of often-conflicting disciplines -- are you really looking for a C++ developer who is an accomplished system and network admin for Windows, Linux, and Macs?
Holub goes on to talk about how a company should go about looking for above-average developers: Have them show you code. Have them talk about core features of object-oriented methodologies. Have them talk about patterns, and how they might be used to avoid designing a procedural-based system instead of an object-oriented one.
Much of his article hit home with me, but from the other side. I don't consider myself a great programmer (yet!), but I would place myself firmly above average in that I've got solid understanding of many of these fundamental, critical areas. Not long ago I had a frustrating months-long back-and-forth with a company I'd initially been very impressed with. They liked my broad experience, liked my detailed test background, liked my general approach to design and development.
What fell through? It turned out their real, sole criteria for hiring was scoring rather highly on a certain online skills certification test -- and I'm brand new to .NET. No credit for design smarts, no credit for a solid approach to coding, no credit for critical thinking in solving problems, just points off because I didn't yet know a DataView's RowFilter property uses SQL WHERE clause syntax.
From hindsight, it was pretty clear that this company didn't care about those fundamentals which I think make up above-average developers. Do you want smarts, or do you want a laundry list?
Recent Reading List
James Avery posted up a list of his recent books. I added mine to his comment section, then realized "Dude, you run a blog and should post this there." Duh.
Fiction
* Scalzi's Old Man's War. Great sci-fi on the costs of war.
* Tolkein's The Hobbit. Hadn't read it in many, many years and wanted to refresh after seeing Jackson's extended set of LOTR.
Non-Fiction
* Littman's The Watchman about cracker Kevin Poulsen. Makes me even more paranoid about all the security crap I still don't know. Makes me want to unplug everything from my house and live like the guy in Varley's short story "Press Enter".
* Jimmy Carter's An Hour Before Daylight. I have nothing but vitrol for Carter's career as President and his post-presidency's idiotic, harmful meddling as an "election monitor". I needed to try and get some balance in my view of him since I have great respect for his work with Habitat for Humanity. This book's done great wonders for helping the balance, but my opinion of his horrid semi-professional involvement in the world hasn't changed.
Geek Books
* Microsoft's MCAD/MCSD Self-Paced Training Kit, coupled with Que's Exam Cram MCSD series. Both are helpful study guides, although I'm generally down on Que products.
* Thompson & Thompson's Building the Perfect PC. Whee! Fun stuff. Convinced me to get off the fence and put my own system together from parts.
* Just started: Wagner's Effective C#. 50 points to make your C# better. I'm only up to point four and I'm blown away. Wagner's prose may strike some as brusque, but the content is killer. Detailed text breaking down each point with great justification why you should write your code this way. Dave Donaldson would like this book because Wagner also goes into Intermediate Language (IL) from time to time. Heh.
Tuesday, May 31, 2005
"I Have Lusted in my Heart"
The quote's from the Playboy interview with President Jimmy Carter while he was in offer. I can't remember whom he was talking about, but here's what I've got lust in my heart about.
Now all I need to do is get a huge gig or win the lottery.
(BTW, Carter didn't use that exact phrase in his interview, but the title phrase has pretty much become the psuedo-standard. [Link is worksafe for that page only.])
Monday, May 30, 2005
Memorial Day Thoughts
James Avery and Alex Lowe both have thoughtful notes on what Memorial Day's really about. Grilling and relaxing in the back yard is a great thing to do on Memorial Day, but take a moment, please, to keep in mind those whose sacrifices have kept tyrants, fascists, and despots at bay.
My family's been kept safe by everyday Joes and Janes struggling in far off lands to improve the lives of strangers they've never met in a land they most likely hadn't read much about.
War's not glorious, except to those naieve and far behind the lines. War is blood, tears, shit, missing limbs, missing friends and fathers, innocent children dead in the street as collateral damage. War is men and women standing in front of a stone wall on the Mall searching for the names of their fallen comrades.
Still these amazing troops get their jobs done, sacrificing more than most of us will ever understand in order that our nation continues its wonderful, creaky, flawed role as a shining beacon to those wanting a better life.
By far the best words I've ever heard to describe the importance of what these men and women do comes from the Arborath declaration where in 1320 a group of Scottish barons gathered to draft a letter to Pope John XXII asking for his support of the Scottish independence war. The declaration concluded "for it is not for glory, riches or honours that we fight, but for freedom alone, that no man of worth yields up, save with his life”.
AFTERTHOUGHT:
I should also add that most in the front lines fight for something few others away from the lines understand: they fight for their comrade next to them in the foxhole or trench. Read Ambrose's Citizen Soldier or watch Band of Brothers and you might get an idea what that bond's like. Those who never served, or those of us who served only in peacetime, can't truely understand the depth and intensity of that bond.
Subscribe to:
Posts (Atom)

