Wednesday, December 30, 2009

Technology revamp

It's almost a new year, and it appears that all-of-a-sudden I have this need - almost a compulsion - to revamp some of my most highly entrenched tech habits.

Firstly, I've used Firefox since it was called Phoenix/Firebird.  What a great browser!  I'm typing in it right now.  One of the main things I use Firefox for is my RSS reader.  But lately, I've become dissatisfied with that feature.  I found myself expanding each feed individually 10+ times a day just to check and see if I could get my "what's new on the 'net?" fix.  Any idle moment caused me to be drawn to my bookmarks toolbar.  I finally said, "enough" and succumbed to Google reader.  I'm still not entirely thrilled with the whole "read/unread" e-mail metaphor for RSS feeds, but it solved my problem - now I only check my feeds once a day, and no longer get pulled away from Visual Studio by the need for a quick-fix-link-fest.  And for low volume blogs, I don't even have to click through to see if I've seen everything.  For the high volume stuff, I mark huge swaths of uninteresting junk as "read" while clicking on the occasional nugget here or there.

But then - something strange started happening.  Without the draw of the Firefox Bookmarks bar, I started getting interested in Google's Chrome browser.  And things have snowballed from there.  So, in honor of a new year I've decided to enumerate my top 10 major tech swings of late - really more for my benefit than yours - so here they are in no particular order:

  1. Switched from Firefox to Google Reader for RSS feeds - outcome: Satisfied
  2. Started using Chrome more since Firefox isn't my RSS reader - outcome: Scared of Google's continued hold on me
  3. Switched from Zune to iPod nano 5th gen for my tunes/podcasts - outcome: LOVE IT
  4. Switched from Windows Media Player to iTunes because of the need to manage my iPod - outcome:  iPod == good... iTunes == evil.  I miss WMP, but since not even my Zune let me use it, I'd given up on it long ago...
  5. Switched from OpenOffice back to MS Office - with the home edition being sold for only $100, it finally seemed worth it to me to use Office - outcome: Satisfied
  6. Received a Garmin for Christmas - switched from old fashioned hand-written directions and Google maps printouts.  Amazed at how much I really like it despite my previously mixed feelings from last summer's trip.  - outcome: Strangely addicted to it, and slightly happy to reduce Google's hold on my life in one small area
  7. Switched from buying mostly paper tech books to buying mostly PDFs for tech books.  Uploaded them to a private Google docs account  outcome: Meh.  I don't read the PDFs as thoroughly.  But being searchable, readable on my phone, accessible anywhere (yeah... there's Google again), and taking up no physical room in my house are big wins for me.
  8. All family contacts are now managed via our family GMail account, which should make it easier to keep up-to-date and do our Christmas cards next year.  outcome: Why didn't I do this before!?
  9. We finally are going to get a texting plan for our cell phones.  outcome: Yet to be determined.
  10. Strongly considering ditching the land-line and getting an iPhone or Android phone this Summer. Especially after reading  this news and this news which came out today.  outcome:  Still deciding
And here are some tech trends I've managed to avoid this year:
  1. Facebook - (mostly)
  2. Twitter - I've no desire what-so-ever
  3. Craigslist

 


Thursday, December 24, 2009

Blessed is the man...

Blessed is the man who does not walk in the counsel of the wicked or stand in the way of sinners or sit in the seat of mockers - Psalm 1:1

What a powerful statement from the opening words in the book of Psalms!  I taught my Sunday School class this a few weeks ago, and God has been teaching it to me since then.  It has permeated my thoughts, and I cannot shake it loose.

How often do we walk in the counsel of those who are not righteous?  We seek those who will tell us we're justified in our actions and thoughts so that we can go on doing our own will.  Perhaps we don't even do it actively, but passively accepting the world's standards for our beliefs and behavior.

How often do we stand in the way of sinners?  We would rather not be "set apart" as the Bible commands, but instead seek acceptance and to fit in.  We see the short-term "delight" of sin, rather than its true nature - the Addictive Consuming Destroyer. We would rather be silent than have fire in our bellies.  We would rather sacrifice standing up for what's true and good and right for comfort and acceptance and the status quo.

How often do we sit in the seat of mockers?  Concentrating on the negative.  Sarcastic.  Back-biting.  Gossips.  Hiding behind the guise of "constructive criticism".  It's a whole lot easier to be a critic than to actually produce something of value.  It's easier to mock failure than to risk it ourselves.

Notice the progression... walking, standing, sitting.... we move progressively down the path towards complacency.  Towards redefining our true identity.

Thank you God for sending your son to earth to redeem me from that path.  For showing me my true identity in you and who you created me to be.  I pray that that truth is real to others this Christmas as well, and that we would walk with you, stand with you, and sit at your throne.  Amen.

Wednesday, December 23, 2009

Random thought for the day - 12/23/09 edition

The spelling of the word committee appears to have been decided by one.

Saturday, December 19, 2009

The Gore Effect



Reading some blogs today, I was just introduced to a new term I hadn't heard before - "The Gore Effect".  Essentially, the concept is that wherever there is some large gathering to talk about global warming and climate change, there seems to be some unseasonably cold weather or there are huge snowfalls.  It started in '04 at a rally in New York where Al Gore spoke during one of the coldest days on record, and apparently the trend has continued since then.  The Gore Effect apparently struck again in Copenhagen during international climate talks, and a blizzard hits the East coast this weekend as President Obama flies back from the talks.

Obviously there is no scientific basis to the Gore Effect, and just because there are very cold days doesn't mean that global warming isn't true.  However, this sort of thing does serve as an embarrassing sidebar to the significantly more serious infractions of global warming "scientists" that have been in the news recently.

Whether global warming is scientifically proven - I don't know, but I suspect it can't be proven with the limited data we actually have.  Whether global warming is true despite being unproven - I don't know that either, but I do believe there is an very real impact to the Earth from deforestation and pollution.  But, what I do know for sure is that we didn't create this place where we live, but we were given dominion and stewardship of it by the one who did create it.  And while we should do everything we can to take care of it for future generations, it is folly to think that we have all the power over the Earth ourselves.  I believe the Gore Effect to be a good reminder of that, with a dash of God's sense of humor thrown in for good measure.

Monday, December 14, 2009

Christmas party games

We had our annual Christmas party with our adult Sunday School class on the 5th.  As the host and hostess, Beth and I had to come up with some activities.  Last year, we did the Christmas Song Quiz which was quite fun.  This year, it was Christmas Carol Pictionary.  I looked online to see if anyone had posted something printable.  There's a version of it for $7.00 here, but I was unwilling to plop down any money for an hour long game I'd only be able to play once.  So, I got a list of songs by browsing the web, put the list in my most favorite text editor - TextPad, and recorded a macro to generate a three-column HTML table from the list that I could use for Pictionary cards.  I printed the result to PDF using CutePDF writer, and printed the cards and cut them up with a paper cutter.  The whole thing took me less than 1/2 and hour and saved me $7.00.  Though I'm sure that the official game has some topics outside of carols, I thought they'd probably all be too easy.  I'm sharing the results for you to enjoy at your Christmas partyInformation wants to be free.  Happy Holidays!

Friday, November 27, 2009

Black Friday?

On our trip to Thanksgiving dinner yesterday, my wife and I were discussing the day after Thanksgiving (Black Friday).  I still can't figure it out.  Yes, a lot of people have the day off so they can shop.  Yes, a lot of stores are having great deals and opening early - Kohls keeps advertising that they're open at 4AM... if you're at Kohls at 4AM Friday morning, it might be time to self-evaluate.  And, yes that pesky holiday where we practice thankfullness and only spend money at grocery stores is finally out of the way so we can officially declare the Consumerist Christmas season open for business.  But, with the rise of the internet, why would anyone subject themselves to the insanity.  No thank you!  My family will continue our tradition of putting up the tree, spending time together rather than money on each other, and preparing our hearts for the true meaning of the Christmas holiday.

Wednesday, November 4, 2009

ETL - 10 tips to a healthy data lifecycle

In my job, I do a lot of ETL.  A lot.  At my company, I handle more than 50 scheduled file receipts, and likely 50 additional one-off receipts a year.  For the uninitiated, ETL stands for extract, transform, and load.  It is the generic term used to describe the process of getting data from one IT system (typically a mainframe or database) and putting it into another (typically a database or data warehouse).  ETL usually involves things like data cleansing, conforming the data to a new model, key management, data type conversions, aggregation, and error logging.

There are a lot of different camps on ETL best practices.  In my experience, here are 10 of the most important tips for doing ETL right:

1.) Expect the unexpected

What you knew to be true yesterday is not necessarily true today.  Consider data from an outside source to always be suspect.  ETL adheres to the old adage - be liberal in what you accept, and conservative in what you emit.  You will get junky data, and you have to know when you can recover gracefully and when you have to fail hard.

2.)  Data should get cleaned upstream whenever possible

ETL happens downstream, and you know what flows downstream.  The source systems housing the data you're being fed may be under the control of your organization, or they may not.  But if at all possible, foster a good relationship with the maintainers of the source systems sending you data.  Garbage in, garbage out.  If they send you junk, your job will forever be cleaning up data and coding band-aids to mask problems at the source.  But, if you can get problems fixed at the source, you and your users will have more confidence in the data and fewer problems.  Also, it's always a good idea to go ahead and store the data as it was received, even if you store a scrubbed version too.  That way, if there's a flaw in your cleansing routines, you can go back and re-run against the raw data.  It's sometimes advantageous to show your users the data as it was received too.  Often they can apply some additional pressure when you are not able to make headway with the source.

3.)  Get file extracts into a database table or tables first before doing ANY data conversions.

The worst thing you can do is try to do too much in your initial process for loading the file.  It's tempting to start converting data types and begin scrubbing and conforming data, but you have to avoid that temptation.  There's plenty of things that can go wrong in just picking up the file, decrypting or decompressing it, parsing it, and reading it in the right character encoding.  The last thing you want is to have your ETL fail at 2 AM on some random field that's supposed to be an integer having an alpha character and blowing up your ETL in some difficult to find place in a very large file.  I suggest making a simple set of staging tables that match the file format with only (n)varchar fields.  Don't convert dates, or packed fields with implied decimals, or anything else.  Those files need to get into your database in the raw ASAP.  Yes - it may be an additional step, but it's so much easier to analyze and debug problem data fields if you get your files into a staging table first.  You can convert and validate the data in a later step, and at that point you'll have better options for recovering from the unexpected.

4.)  Choose your toolkit wisely

I've looked at Informatica, DataStage, and Pentaho.  I've used DTS and SSIS extensively.  Personally, I still prefer to do my ETL in .NET and T-SQL.  Call me old fashioned.  I'll use an ETL tool when appropriate, but I have an extensive library of good, well-tested, performant code that works well for my dev team.  There's nothing wrong with finding a good ETL tool.  But you have to ask yourself:
  • How do we do version control?
  • How do we deploy/rollback?
  • How do we restart the process after fixing a problem?  Must we start over at the very beginning?
  • How do we document the ETL?
  • Is this tool really worth what they're charging me?
  • How do I call out from my tool to other tools if my primary ETL tool is inadequate or unable to perform a particular function
  • Can I reuse custom-built transformation functionality, or do I have to recreate your transforms to use them in other ETL projects?
  • Even if the tool is drag-and-drop, is it still easy to really see what is going on or are there lots of hidden blackbox operations?
  • To borrow from Larry Wall, are the easy things easy and the hard things possible?
  • How do we find developers with experience with the tools we're using, or train newbies?
  • How can we get the best performance in the places where performance is key?
  • How will we handle all the different data or file formats we expect to receive?  EDI?  XML?  Mainframe files with copybooks containing redefines, occurs, and packed fields?
  • How long will it take to implement a file from a new vendor or source system?
  • Do I need massive parallelism or distributed ETL when processing, or can I make do with a single threaded ETL?
Your choice of toolkit has a direct impact on all these factors, and lots more.  Choose wisely.

5.)  Fail Gracefully

Consider every point at which your ETL can fail, and decide what you want to do about it.  Do you log an error and move on to the next record?  Who monitors the log and what log entries are actionable?  Do you wake up an operator in the night to handle the error immediately?  Do you fail and wait until the morning?  What's the process for starting back up after the problem is fixed?  Do you have to start from the beginning, or can you pick up where the failure occurred?  Is there a risk of duplicating your data or otherwise creating a bigger mess?  Is it possible that your load could silently fail without you finding about it until there's a big fiasco?  Does your process simply have to complete every time it runs?  Can you miss a file?  You have to put some thought and effort into failing gracefully.

6.)  Be a pack-rat

Space is cheap.  Buy some cheap disks and keep every file you ever load.  You just never know when you'll have to reload something or recreate a series of data.

7.)  Build in a buffer

Sometimes a file will go missing or some data will not be received.  Build in a buffer so that you can miss a file and the data will appear in the next couple of files.  It's a little extra work to build your ETL to be able to process the data overlap, but it pays for itself on the very first issue.

8.)  Get a balancing report from an independent source and build a set of watchdog processes

For goodness sakes, don't try to balance financials from the same files you loaded.  Of course you loaded what you received.  Those checksums and trailer records help verify that.  It's what you didn't know you didn't receive that will bite you.  Get an independent balancing file sent to you on a regular basis and double check.  Have a watcher process re-balance historic data nightly to be sure it isn't somehow inadvertently changing.  Have a watcher process look at your FTP or file share location and look for additional files you received that didn't get loaded.  Perhaps they were named incorrectly.

9.)  Practice good accounting

Do not change financials!  Ever!  Even if the source system is stupid enough to do that, you should not.  As part of your ETL, create offset transactions to negate the numbers of a canceled transaction.  Don't just overwrite the old record with new data.

10.)  Have a need for speed

This one is hard for me to advocate.  Typically I'm the guy who'll tell you not to sacrifice maintainability for performance.  I also like the KISS principle - Keep It Simple, Stupid.  And I'll also tell you that premature optimization is the root of all evil.  And these things are still very much true, but when it comes to ETL you can bet that you'll have to address performance.  The key is to discover what is slow.  Don't assume.  Build tests.  Do benchmarks.  Figure out what to generally avoid - T-SQL cursors, UDFs, over-architected OO designs are no-nos.  Cache data if you need to.  If loading a data warehouse, figure out a good, performant key lookup strategy for surrogate keys.  Figure out how to minimize I/O operations, and do work in memory.  Let the database do a lot of the heavy lifting, and think of how to process data as sets rather than as individual records.  Stage data in memory (after you've written to raw tables of course), and bulk-load production tables where possible.  Look at your processes critically, and decide if you really think something should be taking as long as it is based on what its doing, and comparing it to other processes.  Ask for another set of eyes from a trusted developer.

I hope this is helpful to someone.  I've not found a lot of good resources on the web for common-sense, practical ETL advice.  Mostly, it's pie-in-the-sky, big expensive tool, enterprisey jibberish.  Feel free to comment with anything you've found to be helpful when it comes to ETL.  And I just would like to take a moment to point out that you've now made it through a 1500+ word essay on ETL without once having to suffer the word metadata, no thanks to TDWI.

Monday, November 2, 2009

Caleb quotes

I found this one the other day from a long time ago, when Caleb was only 2.  As I recall, I was asking Caleb if something was driving him nuts.
"That drives me 'up a wall', not 'nuts'!
Caleb 4/5/08

And then this one is from yesterday.  We were having family movie night and watching Honey, I Shrunk the Kids.  Caleb was getting really concerned about the miniaturized children, so we were chatting him up a little to break the tension.  We asked him how he thought they were going to get big again, and he responds:
I guess they're going to have to have a lot of birthdays
Caleb 11/1/09

Saturday, October 31, 2009

Windows 7 and Windows Live

I received both of my $50 pre-order copies of Windows 7 Home Premium early this week, and upgraded our Vista laptops.  I could not be happier, and am considering forking over for 7 Ultimate on our DVR box.
Personally, I never really bought into the anti-Vista hype.  I think that was a result of Vista coming out more than a year later than it should have, with poor OEM/driver support, and high hardware requirements.  But technology-wise, Vista was Microsoft’s best OS ever.  If you wanted a 64-bit box, there was no question – you wanted Vista, not XP 64.  I thought the Windows Mojave experiment did a great job of highlighting that Vista’s problem was one of perception, not technology.  But you never get a second chance to make a first impression, and Vista never recovered.
So, Windows 7 gets all the advantages of piggy backing off its older brother Vista, but with none of the baggage.  It has the same Aero eye-candy, searchable everything, and stability.  There are some noticeable differences though:
  • If you’re already running Vista, you can do an in-place upgrade.  Leave yourself plenty of time though cause it takes 3+ hours.  But, it was really clean and easy and worked flawlessly on both our family laptops.
  • UAC (user access control) is actually usable in Win7!  It was the first thing I turned off in Vista, but I’ve found myself still using it with Windows 7.  You can configure it with a simple up/down slider to control its verbosity, but the default is reasonable.  I’ve only been prompted when I installed software updates, and otherwise it’s been properly quiet.
  • Windows 7 is snappy.  When you open the laptop lid, the OS is instantly up from sleep mode.  It’s so fast in fact that I had to verify that the laptops were actually in sleep mode when the lid closes, because I couldn’t believe that it was up so fast.
  • The new task bar is just wonderful!  It is worth the upgrade just for this.   The quick-launch bar went away, and I’m a huge user of that so I was initially concerned.  But the searchable start-menu plus the new task bar pinning feature make it really usable and intuitive.  Jump lists are cool, but no apps outside of MS’s stuff use them yet.
  • Window gestures are slick.  Drag a window to the top of the screen – it maximizes.  Drag a window to the right or left, it resizes to bisect the screen.  Did that by accident?  Drag the window again and it goes back to it’s previous size.  Want to get rid of all windows but the one you’re working on?  Shake the window left and right and the other windows will minimize.  Have 2 monitors?  Hit WindowsKey+Shift+right/left to move your window to the other screen.  For the short-cut junkie, this stuff is handy, but not really revolutionary.  But it’s a sticky feature - once you start using it, it just feels right and sticks with you and you’ll miss it when you go back to XP.
  • This is the first MS OS in 10 years where you don’t have to have IE installed.  If you choose not to, the rendering engine is there for Windows Help and other stuff, but you have no front-end browser.  It’s not just hidden – it’s gone.  I gave up IE years ago, and only use it from intranet sites at work, so this is nice.  They’ve also unbundled Messenger, Mail and probably some other things I never wanted or used.
  • Interestingly, absence makes the heart grow fonder – not having used those programs for awhile, I wanted to see where they wound up.  The answer is “Windows Live Essentials”, which is a really nice package.  You can pick and choose from an ensemble of apps, including IM, Mail, Movie Making, Photo management, family internet safety tools, and the tool I’m using right now called Windows Live Writer – a blog posting tool that ties in with all sorts of blog software and lets you write your posts offline in a nice editor.  It even downloads your blog’s theme so that you can see the correct styling and preview your post as it will be shown on your blog.  What a great little app!



There are a few problems and annoyances too.
  • The installer for Vista will do an in-place upgrade, but if you’re still on XP you’ll have to install from scratch.  Considering that XP is still the predominant MS OS, that may be a sizable barrier to the layman.
  • There’s no longer a nice little network icon telling me when I’m connected to my company’s VPN.  That’s annoying because I often forget to disconnect when I’m done working.
  • My computer still takes a little over a minute to boot from power-on to password prompt.  I’m not sure why boot times are never addressed by the Windows development team.
  • The name Windows 7 is even weirder than “ME” and “Vista”.  Windows 7?  Are we trying to compete with Apple and their OSX (ten) brand?  I’m not sure how we get there.  NT 3.5, NT 4.0, Windows 2000, Windows XP, Vista, and then Windows 7 are the OS releases using the NT kernel – that’s 6 total.  If you go by kernel versions numbers, that might work because Vista was version 6.0, but Windows 7 is kernel version 6.1.  It’s all very markety feeling.  Lucky seven.  I suppose that’s to be expected since Vista had a marking problem.
Overall, this is a worthwhile upgrade.  If your machine can run Vista, it’s a no-brainer – it’ll upgrade in-place and run 7 and you’ll love your PC again.  If you’re on XP, it’s a different beast.  You may well be better off buying a nice new $500 laptop or $400 desktop with 7 pre-installed.

Saturday, October 10, 2009

TI-85


When I was in High School, we started using graphing calculators in all my math classes and some of my science classes too - geometry, algebra, pre-calc, physics, and statistics are the ones I remember. There were a few choices for which calculator to use, but the teachers typically had the TI-81. It was about $75 at the time if I recall. They had a little device that hooked the calculator into the overhead projector and were off to the races.

I, of course, would never have been satisfied with the TI-81 knowing that there was another, more powerful alternative - the TI-85. It was more expensive, but way more powerful and included a BASIC-like programming language. Back in the time when there were no iPods or sub-5lb cell phones - back when pagers were just beginning to be all the rage for people other than drug dealers - the TI-85 was the hand-held device of choice at school. Disguised as a tool for learning, it doubled as a Gameboy during study halls with soundless black and white games like Breakout and Battleship. I knew mom and dad would have gotten me the TI-81 as a "school supply", but I wanted the 85. I wanted it bad enough I made the ultimate sacrifice for a kid - I asked for it as my only big Christmas gift.

While my brother and sister opened their toys, I unwrapped a piece of electronic school equipment that came with a 350+ page manual about levels of math that I didn't yet understand and some I had no intention of ever learning. But it had 20 pages of pure gold at the back of that manual that told me how to program with it. And I was hooked.

I had programmed before. My dad got the family one of these as a gaming system and gave me a book with BASIC code in it. The program was saved off to a tape. I made a game, not from my own imagination, but from the meticulous transcription of pages of code from some book for a game I didn't understand and didn't really enjoy playing once it was done. I understood what programming was, but not really how to program. We got an 8088 when I was in 2nd grade, so I was familiar with computers, but not so much with programming them. The TI-85 was a portable coding device where I was limited only by my imagination and the hardware.

The programming was actually quite awful. LABELs and GOTOs abound. A callable method was coded as a separate program, so you could have 10 different unusable partial programs whose only purpose was to serve one master program. Needless to say I quickly learned to use the GOTOs instead, though thinking of it now makes me cringe.

I made programs that calculated the present and future values of loans with compound interest. I coded up a brute force calculation to discover what fractions reasonably approximate PI (22/7 and 355/113 are good ones). And, I made an adventure game called Gack that took one whole weekend to build and nearly every bit of memory on the calculator.

The concept of Gack was simple - it was a Dragon Warrior style game. You were a warrior trying to survive and gain gold and experience so that you could buy stuff and level up. There were 4 maps, each with progressively more difficult enemies. Each map had two locations, and each location had two different enemies that would attack you at random. If you defeated an enemy, you got gold and experience and could eventually advance to harder maps. If you lost, you would lose 1/2 of everything and have to start over at the shop. There were really only a handful of images in the game - the maps and the picture of the shopkeeper. The rest was text.

The final battle was a shocker - once you finally had enough gold and experience to buy the last item you needed, you entered the shop and the image flipped back and forth progressively faster between the normal shop keeper and a negative image of the shop where the shop keeper was revealed to be a skeleton. Once the back-and-forth reached a seizure inducing rate, the image stuck on the negative and the skeleton used the final weapon against you. You only had a 30% chance of victory against him, which made it a little awkward starting back in the shop with 1/2 your stuff like nothing just happened when the evil shopkeeper offed you. Perhaps this was a subliminal venting of some frustrations with working retail... hmmm...

Anyway, you could share programs with others via a cable, but not many people were willing to wipe out everything they had to take on Gack. Truth be told, I never actually played it all the way through. I built the thing - but there was no magic in playing it.

My most popular program, by far, was a program that intercepted key presses and simulated functions within the calculator without actually performing them. The reason I wrote this was that our pre-calc teacher was afraid of cheaters, and so he wiped the memory on everyone's calculator before a test. I never cheated myself, but I know I enabled others to do so. But I put way too much work into my programs to have them deleted, so I would start up this program on test days. When the teacher made his rounds and wound up at my desk, he would press the keys for the memory wipe sequence and the calculator showed all the right prompts - pixel for painstakingly designed pixel - and reported the memory was gone. It even showed an empty program launcher in case he checked. But my precious code was completely in-tact in the one and only place it was ever saved.

I still have the calculator in my desk, and it still works. Though I don't keep batteries in it and never use it. It's funny to think of all the various languages I've programmed with over the years: BASIC, VB, Pascal, assembly, C/C++, Java, ASP/VBScript, JavaScript, T-SQL, Perl, Ruby, C#, Boo, VB.NET, and probably plenty of other little ones I've forgotten from college courses (I know I learned and forgot a whole lot of LISP at one point). But really, my love of programming all started with this little calculator. Best childhood Christmas gift ever.

Sunday, September 27, 2009

Where's Waldo?


I was at the store today because I had a couple of quick items to get for Caleb's birthday. I had no cart. What I planned on getting was carryable without one. My arms are fully loaded and I'm heading to the checkout. And then I got the call I dread - "Can you please pick up a few extras for me?". Okay, but please let them be easy. "Toilet paper, milk, and ... something else you've never heard of, never seen before, and can't possibly find with your arms full and in only 1/2 an hour". Gaahrr!

My wife can never find her keys or her sunglasses. For me, it's the requested leftover container from the fridge, or a microplane grater in the cupboard, or some bizzare cleaner from the store called Clorox Anywhere. Clorox Anywhere? Seriously? 'Cause I can't seem to find it anywhere. I demand truth in advertising people!

In the summer, we don't need to run the A/C. My wife will just ask me to please get her some salad dressing from the fridge and I'll cool the whole house as I stand there with the door open until I can see my breath. She'll politely tell me that it's behind the mayo, and then I all of a sudden have two things I have to find. She usually gives up on me about the time I start yelling "MARCO!" into the crisper hoping the requested item will respond back, "POLO!"

There's that rare occasion where we're actually out of the item requested, or it's marked "refrigerate after opening" and it wasn't opened yet so it wasn't actually in the fridge - this is the moment when I can pretend like I'm vindicated. "See, I told you it wasn't there". But more often than not it was there - plain as day - right in front of my nose. And at times, it's even wearing that garish hat with the red puff ball just to mock me.

Friday, September 25, 2009

Source control

I spent most of my day at work today setting up a new development server. SQL Server 2008, IIS, msbuild server and finally, Subversion. Our dev box died a few months ago and we had cobbled together some things on a bunch of different existing boxes and basically hobbled along.

So today I got a chance to consolidate everything onto a nice new box. And originally I wasn't planning on moving our source control onto it. But our SVN is on an old Linux box and hadn't been updated since 2006. It was humming along nicely the way Linux seems to do, but that particular brand of aging box has been dying on us quite regularly, so each day we leave it untouched we take a risk of an inconvenient server failure. And, since our lone sysadmin has little experience with Linux, the risk seemed even greater. So, off I went to see if I could get a Windows SVN server up and running.

I installed the Windows version of Subversion from here, but then wound up having to figure out how to set it up as a Windows service and get it configured. It proved to be more complicated than I expected. And I was left with a lot of questions:
  1. How do I make sure that SVN is running as a Windows service?
  2. How do I serve out my repositories via HTTP? With SSL?
  3. How do I use NT security vs having to manage separate SVN user accounts/passwords?
A quick Google search turned up VisualSVN Server. I've used their other product - VisualSVN - but didn't find it worth the cost and I wound up a happy Ankh user. I hadn't been back to their site since, but I wish I had because VisualSVN Server is free and it just works. I had it up and running and the first 16 of my repositories dumped from SVN 1.3.1 on Linux and imported to SVN 1.6.5 on Windows all within an hour. Amazingly, I knew the least about this at the onset of my day, but it took me the least amount of time of any of the things I had to set up on the dev box today. Highly recommended! 5 full stars!

Thursday, September 24, 2009

Trends


If we view our lives and our humanity as something that naturally trends away from perfection - as something that, left to its natural state, will break a little bit each day - it may just help us to see that we need to do something proactive each day to alter that trend. A boulder on a mountain will tend to roll down it given wind and rain and earthquakes and nature and time. Its natural state is not to climb that hill. If our internal self-engine is left to idle, it will naturally drift away unless we expend some energy daily to fight the trend. Some days we roll farther down the hill than others and need a bit more adjustment. Other days there's may not be much movement at all, but we will never go up that hill unless we're deliberate about it.

Tuesday, September 15, 2009

Teachable moments

I was up late the other night putting in the 4th water heater we've had in our house in less than a decade. That's another story entirely from the one I'm going to tell, but it sets the scene for how exhausted and short-tempered I was the next morning when Ian and Caleb got into their standard fight. It goes something like this:

  1. Ian constructs something amazing from his vast imagination.
  2. Caleb wants to play with his big brother and the latest creation
  3. Ian doesn't want Caleb anywhere near his labors of love, and responds by panicking
  4. The situation includes any combination of hitting, yelling, and crying
  5. Whichever parent is closest makes a ruling, and includes any combination of yelling, timeout doling, and general annoyance
  6. Repeat ad nauseum
This morning was no exception, and the fight was as silly as it ever was. A bawling Ian willed himself to verbalize his case to me, barely holding back the urge to restrain Caleb who was still on the move. His whole body shaking.

"Why don't you want him to play with it?"

"Because I worked hard on it and he'll mess it up!"

Hmm... isn't that interesting. It's not that he doesn't want to share, it's that he is anticipating Caleb's actions and attempts to avoid an outcome he believes is inevitable - which admittedly it probably is. He's set his expectation for Caleb's behavior, and Caleb doesn't disappoint. But it shouldn't be this way, and in fact I don't think it's biblical. If Ian wants to break the cycle, he needs to forgive past wrongs and just let Caleb play too. Ian's fear of what might be is depriving him of a valuable time with his only brother.

We are given second chances every day to do things differently. We aren't prohibited from an activity or an opportunity just because we blew it the last time. Or even when God knows we'll blow it this time too. Every day is a clean slate - a chance to try again. It's pretty hard to remember that when you're the one that has to do the forgiving. In diffusing the situation for Ian, I found myself in my own teachable moment.

Friday, September 11, 2009

QIF parser

As promised in this post, here's a simple parser written in C# for Quicken QIF files. I tested it on the output from a Money 2002 export, and from a Quicken 2009 export. Once the transaction objects are created, you can pump this data out to a .CSV file, or into a SQL database, or if you're feeling brave, a QFX/OFX file. This is step 1 in building my personal finance management suite. Enjoy: QIF.zip

Debt

The federal deficit has hit $1.38 trillion. If I started counting 1 dollar every second, it would take me over 43 thousand years to count that high.

$1,380,000,000,000 / (60sec * 60min * 24hrs * 365days)

The total debt is $11 trillion, which would take nearly 349,000 years to count that high at the rate of $1 per second. You can watch the debt clock spin here. And this is before we've funded the total health care overhaul.

Wednesday, September 9, 2009

Quicken 2009 first impressions

I mentioned in a previous blog post about the death of MS Money. I'm a long time user of MS Money - in the past decade I've used 3 versions - 97, 2000, and 2002. I never upgraded from 2002, and was still using it happily until very recently. Though to be honest, I always missed the simple interface from the '97 version. My only experience with Quicken was that I used it for about a week in 1997, but the software was only so-so, not exceptional. And when they started calling me after I registered their software, I was done with them. I switched to MS Money, which has truthfully never knocked my socks off. It was functional and easy and talked to my banks/credit cards, and my phone never rang with a pushy MS salesperson so I never had any reason to switch. It was easy, no-hassle financial management, which is what I still want today.

Even though I'm on a really old edition of Money, it still downloaded my bank transactions and just worked. However, the fact that MS no longer supports it meant that I needed to make a decision about whether I was going to stick with my really old version (which has no guarantees of working on Windows 7, and surely won't ever see updates as banks change their online offerings). Or I could upgrade to a new version of Quicken. Or, I could use Open Office Calc. Or I could build my own. I still haven't ruled out building my own, but for $25 and a money back guarantee, I decided to give Quicken 2009 a try.

The first thing I noticed was that Quicken still wants to force me to register, and claims that it's online offerings require it. I found this blog post which told me to hit CTRL+SHIFT when the registration prompt comes up, and that the online offerings are still available if I do this. I tried it on my 2009 edition and it worked. One 1997 mistake successfully averted.

So, now that I'm in, the interface looks smooth and the online banking transaction downloads seem very full-featured. The reporting looks easy, and the bill reminders will do what I want. This may just work for me, so I think I'm in business. Or not.

I have over a decade of financial transactions stored in the MS Money format. And Quicken says it can convert Money files, but not from the 2002 version... it's too old. No problem - Money has always been able to export to QIF - The Quicken Interchange Format. Except that Intuit (ironic name) appears to have decided that Quicken didn't need to support that import format anymore. They wanted to force banks to change over to a new proprietary format called QFX, which allows them to charge royalties for the privilege of using it. The long and short of it is that there are no free utilities out there to convert QIF to QFX, and I couldn't find a QFX specification published so I code it myself. I downloaded a QFX file from my bank to see if I could mimic it, but without a version of the file that includes split transaction examples, I can't fully mimic my QIF files.

So, off to Google - the all-knowing oracle of the internet. Except that it proved exceedingly difficult to find an answer. In fact, I've been at it off and on for two weeks. It appears to be nearly impossible to import a .QIF file into Quicken unless you are using a "cash account". Credit cards, checking, and savings accounts are arbitrarily not allowed. For no legitimate reason. At this point I'm just about ready for my refund. But, luckily I finally found this post, which led me to a workable solution.

Here are the step-by-step instructions for getting MS Money data into Quicken 2009:
  1. Create a "cash account" in Quicken. You won't need to keep this, but you must have one while importing your historic data.
  2. Create a single account for either your Checking, Savings, or credit card account. Whichever you're going to import first. For simplicity, name the account "Checking", "Savings", or "CCard" and tell Quicken that you'll manually add the transactions rather than connect to your bank. Even if you have multiple accounts of the same type, you'll only be importing one at at time.
  3. Export all the transactions for an account from MS Money to a QIF file. I recommend NOT exporting to "strict" QIF unless your Quicken import fails. Start with the loose QIF.
  4. Open the QIF file in a text editor (notepad). At the top of the file insert the following text, replacing "Checking" with "Savings", or "CCard" if you're importing one of the other account types. Be careful not to delete anything already in the file, and don't leave any empty lines.

    !Option:AutoSwitch
    !Account
    N
    Checking
    TBank
    ^
    N
    Checking
    TBank
    ^
    !Clear:AutoSwitch
    !Account
    N
    Checking
    TBank
    ^

  5. Import the .QIF file. You'll need to choose the "cash account" you created in step 1 as the destination. Of course, that's just a ruse to fool Quicken because if all goes as planned, the import should go to the account you named "Checking", "Savings", or "CCard". You'll likely get a dialog box that says your file has new categories in it - say "yes" to add the categories. If all goes well, you should get a success dialog. If you don't get a success dialog, you're on your own. This worked without a hitch for all my accounts. You might try the "strict" QIF in step 3.


  6. Double check your downloaded transactions and be sure that splits and amounts all worked out. Some things may not have imported exactly as you hoped, but this should get you really close. Once you've accepted all the transactions, now you can rename your account and enable the online transaction downloads. Repeat from step 2 for each account.
  7. Remove the "cash account" when you're done. It should never have received any of the transactions you imported, even though you chose it as the destination account.
At this point, I'm finally ready to start using Quicken. Of course, none of my saved reports or scheduled bills are there - I'll have to recreate those manually. This was a lot more effort than I had hoped. And, there's more bad news. Once you get the data into Quicken, you'll find that the one format they say they want you to use, QFX, is not a choice for exporting your data. And, even though you can export to a legacy .QIF file, it's a variant that MS Money won't be able to import without extensive modifications. So, for the layman, this is a one way migration... no changing your mind later. However, amazingly you can export to .QIF and Quicken will re-import it's own exported file. And exporting my data is a vital feature for me, as I'll need to get my data out once I've written my own financial management program. I'll post my C# version of a .QIF parser to the blog soon. (UPDATE: here it is)

Intuit has a lot of work to do to win over MS Money users to Quicken. Perhaps I'll post again after I've used it for real for awhile. For now, I'd rate Quicken 2009 a 6 out of 10 for user friendliness.

Monday, September 7, 2009

The President's educational address

There appears to be a little confusion in our school district about what's happening with Obama's educational address. One day, we're told that it isn't happening via an e-mail from Ian's school:

September 3, 2009

Good afternoon,

As many of you may already know, President Barack Obama is broadcasting an address to students online next Tuesday, September 8, at noon. The district has attempted to take a neutral position regarding the broadcasting of the address in school by offering students the option of viewing or not.

However, since yesterday we have received significant feedback from our school community regarding the broadcast in our schools. We also have just learned that the address will be available on C-Span for recording, as well as posted on the White House Web site (www.whitehouse.gov) for viewing at any time.

Parents will now be able to access and share the broadcast with their children at their own discretion. The district will not broadcast the President’s address in the schools on Tuesday {emphasis mine}. We hope this decision will address the concerns of all our parents and prevent the disruption of our students’ school day.


Then, the next day we're told via that same e-mail group that the address will be shown:

Message from the Superintendent

The {Name Removed} School District learned of President Barack Obama’s student address scheduled to air at noon on Tuesday, September 8, just two days ago from several concerned parents. Since then, we have been overwhelmed with phone calls and e-mails both in favor of and against airing the broadcast in our school buildings on Tuesday.

As a district, we take a non-partisan view towards this address. The President of the United States is our nation’s leader and a world power who will be addressing the youth of our country. The intent to speak to students is not unprecedented, as other Presidents have done the same. For educators, this address presents a teachable moment for our students. As a system, it is our responsibility to provide educational opportunities for our students.

As Superintendent of this district, I always make an effort to listen and be responsive to community concerns. This issue has resulted in a divided community outcry that cannot be ignored. In an attempt to bring some calm to our community and be responsive to the concerns on both sides of the issue, I have decided to permit our schools to air the broadcast on Tuesday {emphasis mine}. Students whose parents prefer they not participate will be provided an alternative activity during the 15-20 minute address.

I understand this decision will be met with mixed emotions; however, I believe it offers an educational opportunity that should be made available to students.

{Name Removed}
Superintendent


What a mess. And it didn't have to be this way. As president, what he has to say should certainly carry some weight and be worthy of attention. But the president made some rather serious errors in judgment with this address.

1.) The president should never have allowed the initial inclusion of the assignment-heard-'round-the-world in his auxiliary materials. Namely, that students were to draft letters to themselves discussing "what they can do to help the president." Here's a tip - if you don't want people getting creepy mental images of school-aged indoctrination videos, please don't blindly assume that everyone agrees with your policies or that anyone actually wants to help you achieve the goal of driving this country off a financial cliff, thanks. That material was since removed, but the damage was already done.

2.) If you want to talk about kids staying in school, that's a great message. But it seems to ring hollow as college tuition skyrockets and recent grads find themselves unable to get jobs. Staying in school isn't a message that's helping our kids achieve their goals. Many of them are now forced to limit their educational potential due to the faltering economy. Unemployment is at 9.7%, which is the highest in 26 years.

3.) When you subvert the usual channels of material distribution, and don't release a transcript of what you're going to say to our kids, then parents of elementary aged children will be rightfully concerned. Middle and High School students are certainly capable of filtering material and making up their own minds. However, elementary aged students are more impressionable, and less able to articulate what's happening to them at school when asked. Here's another tip - if you have a good message and want to present it to kids, put that material out there for parent's to review first! Otherwise, the apparently clandestine attempt to subvert parental involvement will undermine your cause.

As a parent, I don't have any problem with my children hearing differing viewpoints. In fact, I believe very strongly that censorship is a poor substitute for good parenting. One of the marks of a mature adult is the ability to recognize when you're wrong, and respond appropriately. Another mark is the ability to recognize when you're right, and boldly defend your point while showing respect towards those with whom you disagree. Those skills will never be learned without practice at genuinely understanding all sides of the story. I welcome exposure to age appropriate debate for my kids, but this situation is nothing short of a fiasco.

I'm reminded of the Cosby show episode where Vanessa brings home her new fiancé, Dabnis Brickey. See it here, and start playing at 2:15. It's all about the presentation. The president has taken a message that we can all agree on - "kids should work hard and stay in school" - a proverbial steak-dinner message, and he's presented it on a garbage can lid.

Sunday, August 30, 2009

Jagged Little Pill



A lot of people use it. This site tells us that these methods are by far the most common used. But do people really know how chemical birth control works? Birth control pills, patches, IUDs, and all other chemical birth control methods work in three main ways to prevent pregnancy.

  1. They make it unlikely that ovulation will occur
  2. If ovulation occurs, they also make it unlikely that sperm and egg will meet
  3. If sperm and egg meet, they also make it unlikely that the egg will implant in the uterus
That third item is a subject of much controversy, or would be if it weren't kept so hush-hush due to politicking, because it means that the pill interferes with a pregnancy and leads to the death of a developing fetus. When a sperm and an egg meet, life begins. A unique human being is created with unique DNA. No one who has ever existed before or will ever exist again has precisely the same genetic makeup - scientists have shown that even the DNA of identical twins differs slightly. There may be dispute over whether that particular human life has rights or value in those first moments (and this particular blog post makes no pretense about trying to address that particular question at this point in time), but there is little dispute that conception marks the beginning of human life.

However... an actual pregnancy may not begin for another 7-8 days as the egg travels through the fallopian tube to the womb. If the lining of the uterine wall, called the endometrium, is affected by use of The Pill, then the fertilized egg will not be able to attach and a pregnancy will not occur. Thus, the pill is not really a "contraceptive" in all its functions. For those who believe in the sanctity of human life, the fact that the pill can interfere with a pregnancy - that part of its function is as an abortifacient - should be unconscionable.

The pill is between 92 and 99.7% effective if used correctly. What we don't know, and the pharmaceutical companies will not tell us, is how frequently the first two methods of preventing pregnancy fail, and the third one succeeds. That third option terminates a life, and knowing how frequently that happens is information that should not be kept from women.

Though we don't know the exact effectiveness numbers, we can work with the math a little bit. Lets say for the sake of simplicity that the three functions that chemical birth control uses to prevent pregnancy are each effective 57% of the time. Thus, each function will fail 43% of the time:

43% * 43% * 43% = 8% of the time pregnancy will occur

So, we can see one possible set of values showing that previously mentioned 92% effectiveness number. Now, lets look specifically at how often that third method of preventing a pregnancy will happen.

43% * 43% = 18% of the time the first two functions will fail and the 3rd will have a chance to prevent pregnancy

18% - 8% = 10% of the time a fertilized egg will be destroyed with chemical birth control if these are the actual numbers

And this will all happen silently. Without the woman's knowledge. Now granted we don't really know for sure what these precise effectiveness numbers are for each of the individual functions that make up the whole, but the concept behind the equation holds. To achieve its overall effectiveness rating, the pill may be really good at blocking ovulation and fertilization, or it may be really bad at those two and really good at altering the lining of the uterus. We just don't know what goes into that 92-99.7% rating because no one will talk about those details.

There are other resources out there that explain this situation in clear, concise language. Here are a couple of quick Google results on the topic: Link one, and Link two. Regardless, you have to ask yourself and your partner if this happening - even once - is acceptable to you. If you look through the second link, you'll find this remarkable tidbit of information:
Q. So how do you prove that the pill acts as an abortifacient?

A. The answer to this question can be found by comparing the rate of break-through ovulation and the detected pregnancy rate. The ovulation rate has been reported to be about 27 ovulations in 100 women using the pill for one year. But the detected pregnancy rate is much lower at around 4 pregnancies per 100 women using the pill for one year.

As you can see, there is a big difference between the number of women who ovulate (27) and the number of detected pregnancies (4). What has happened within the woman’s body to reduce the high ovulation rate to such a low number of detected pregnancies? I suggest that one answer to this important question is that pregnancies have begun, because ovulation and fertilization have occurred, but some of these pregnancies are terminated because implantation cannot take place. The pill has damaged the lining of the womb, stopping implantation.

If these numbers are accurate, then depending on how effective the pill was at blocking fertilization after the egg was released, the pill could be acting at an abortifacient as high as 23% of the time.

There's a good chance that you're reading this and have never heard this truth about chemical birth control before. People are more likely to know that you're at risk for blood clots than that you're at risk for conceiving without getting pregnant. I won't go into all the specifics, but you don't have to dig very deep on your own to uncover the truth. It's no farther than page 2 in one of the product guides. But even with it right there in the open, no one seems to talk about it.

If you are pro-life and are on the pill, you cannot bury your head in the sand and pretend that this isn't a very real challenge to your beliefs. There are alternatives to the pill that are just as effective, though they may lack the convenience. Barrier methods and NFP are two options that do not affect a developing baby. If you are pro-life and don't use chemical birth control for this very reason, then maybe it's worth considering speaking up and sharing with other close couples in an appropriate way. Knowledge is power. And, if you are pro-choice or believe that life at these early stages is without rights or value, I challenge you to at least consider that all women should have the right to make a fully informed decision about their method of birth control. And that means that all the information needs to be available and actively communicated, and that doctors and drug manufacturers need to be truthful and forthcoming about birth control methods that employ an abortifacient.

Tuesday, August 25, 2009

Life's currency

Every day, we are given 24 hours to spend. We can't save it. We can't borrow against it. There's no such thing as a credit card for time. Whether we're intentional about it or not, we will spend our full allotment of time each day. Our daily income and outgo of life's currency will always balance to zero.

Obviously, on the larger scale, some of us will have more time on Earth than others. But daily - unless it's your last one - we all receive the same amount.

Much like taxes, we are compelled to spend some percentage of time on food and sleep. Often, we will waste large swaths of time here or there on meaningless drivel - spending it on things we will neither remember nor care about later. Anticipating tomorrow's allotment. Promising ourselves that we'll manage our time allowance better the next go around.

But we can invest it. And that investment usually produces the best return when we give our time to someone else. Serving. Teaching. Caring. Loving. Listening. Sharing.

Saturday, August 15, 2009

And what about a pirate voice option?

We've been using the Garmin my mom lent us (thanks mom!!!) during our vacation travels. Beth and I have used this little miracle of science before, but always with mixed results. This trip was no different - it (usually) gets us where we're going, and we don't have to stress out too much about it if we miss a turn. But this trip I think the Garmin was nothing but trouble.

Sometimes it can't "acquire the satellites" when we're beneath some trees in the park. It cannot seem to figure out that our hotel is really on the right side of the road as it keeps telling us to "turn left and arrive at our destination". It picked what I would consider to be the wrong Pizza Hut when asked to choose the closest one to our hotel - yes, there are two of everything down here and it chose the one 5 miles farther away. It is fully convinced that there's a road in the park which doesn't actually exist, and little Ms. Garmin gets really sassy with her "recalculating" when we choose to ignore her and not drive pell mell through the park's foliage on her imaginary road.

And, in her most egregious offense -the one in which I can't hardly bring myself to forgive this technological wonder - Ms. Garmin led a van fully of hungry, travel weary people a mile and a half down the road past our true lunch destination! A mile and a half to a Dollar Saver store which Ms. Garmin stubbornly swore was a Cracker Barrel. Not-uh, Ms. Prissy. Not-uh! At least she had the phone number right, and we called and explained to a confused hostess that the checkered flag we trusted is not right, and that we need assistance from a real human to fill our bellies. Perhaps Ms. Garmin is a little resentful that her head is full of restaurants, yet her secret pain is that she has no stomach of her own.

I'm glad I don't own one of these myself. It's nice to borrow (seriously, thanks mom!!!), and certainly it can be helpful at times, but it has a tendency to get you to trust it when it is not at all trustworthy. I seduces you with its maps and its apparent foreknowledge of your travel futures. And just when you turn your mind to something other than directions, she leads you astray. As far as directions go, you really can't trust her. But that is her primary purpose! Alas, she's just not good enough to be a real navigator. I wonder if Tom-Tom got this right, cause Garmin sure didn't. Or maybe I'm too apt to anamorphize my navigation tool and then expect too much. She's only human... er...

And seriously, what about a pirate voice option? "Turn to starboard ye land lubber!" "Land ho!"

Friday, August 14, 2009

Eye for Adventure

We've been trekking through Mammoth Caves in Kentucky for the past couple of days. It's been great fun, but we're all pretty tired by the end of the day.

Beth's been carrying her camera around, and she got a shot of a bat today quite by accident. But, for the most part, she's not had much luck with the camera. It's pretty wonderful to realize that our eyes are much better designed than the modern digital camera. This becomes most apparent in low light situations. While the camera struggles to focus, thirsty for light in these caves, we are still able to behold the wonders of creation, using one of the great wonders of creation - our eyes. Now, it's too bad the pictures in our minds aren't downloadable. There, the camera clearly wins.

Tuesday, July 21, 2009

Perspective

I just came home from my Tuesday night men's group. It's two hours every week from 8-10PM where we study the Bible, pray for each other, and hold one another accountable. We usually talk a lot about how we can be better husbands and fathers. And tonight was no different. I found myself asking God during our closing prayer to show us new ways to show love to our wives.

Then I biked home, and found that we have zillions of toys in the yard (including a snow sled) and the garage door is still up. I walked in the house and it's nearly 80 degrees. The kitchen was in bad shape from dinner. There were plates on the table, groceries still out, a pile of clean dishes drying in the sink with a stack of dirty ones waiting their turn. There's items scattered about from a trip to the pool, and the trash is full. The TV is on downstairs.

I'm exhausted and I really don't want to lift a finger at this point and I think that this should wait until tomorrow, which would mean that it's Beth's to fix. But then I look back at my day...
  • I rolled out of bed at 7:30
  • I worked from 8:30 until 6:00 doing something I love and am passionate about
  • I arrived home to two worn out, but happy boys
  • I constructed a (purposely) non-functioning slingshot out of a stick and rope at Ian's persistent request
  • I danced with my boys to some new MP3s I bought with an Amazon.com gift certificate from my birthday
  • I ate a nice, simple meal that Beth prepared
  • I started the bath-time/bed-time process with the boys
  • I went to my weekly men's group
Then, I try to imagine Beth's day.
  • Caleb crawled into our bed unbeknownst to me at 5 AM. She woke up and carried him to the potty to avert disaster.
  • She had to get herself showered and ready for the day with no help keeping the boys in line while she did it
  • She and the boys cleaned and picked up most of the house
  • She and the boys went to the grocery store
  • She took the boys to the pool and wore them out so that we could have an easy bed time this evening
  • She fixed dinner
  • She dealt with all discipline issues
  • She finished up the bedtime routine after I left
  • She did not complain once, nor does she ever really, about me leaving in the evening after having been away all day at work
  • And now, when I come home, I find that she's in the basement (with the TV on), finally able to do something for herself.
My day seems nothing like her day, and in fact seems ridiculously simple and pleasant. And so I wordlessly clean the kitchen, ashamed that I even considered abandoning her to it. And when I get it looking reasonable, I tell myself that "reasonable" isn't good enough if there's still work for her to do in the morning so I keep on keepin' on. And by no later than 10:45, it's pretty clean. It really was more effort to screw up my resolve than it was to do the actual work.

I head downstairs to see Beth and say hello for the first time after having gotten home, and discover that she's been folding laundry all this time. And, of course, if you're in our basement for more than 2 seconds, you turn the TV on because folding laundry is a pretty wretched activity otherwise.

So, instead of sitting down, I pick up a laundry basket and head up the stairs with it. On my way up, Beth tries to tell me what an awesome husband she thinks I am. She says - get this - "Why is it that when I come home to a mess I just get really mad, but you don't treat me that way", and then she tries to tell me how I'm a much nicer spouse than she is. Definitely not true. It's really all a matter of perspective.


Ephesians 5:25 - Husbands, love your wives, just as Christ also loved the church and gave Himself up for her

Philippians 2:3 - Do nothing out of selfish ambition or vain conceit, but in humility consider others better than yourselves.

Sunday, July 19, 2009

Groceries

Believe it or not, we shop at ALDI. If you've never been to ALDI, it's quite an experience. The stores are never out front on a busy street. You usually find them tucked off behind some of the more prime real estate. They don't accept credit cards to cut costs; it's cash only, though they do let you make a PIN purchase with your ATM/Debit card. In order to take a cart, you have to put a quarter into a release mechanism. If you return your cart instead of leaving it in the parking lot, you get a quarter back. There are four or five total aisles in the store, but you can walk out with almost all the essentials. You bag your own groceries. And, if you fill your cart as high as you can get it without stuff falling out, you might possibly just barely break the $100 barrier.

You can't get everything there. In fact, if you shop for groceries there you typically have to make another trip to a different store to get some of life's little extras, or things you're unwilling to settle for off brands of like pop or t.p. of reasonable quality. But usually you'll find some name brand stuff. It depends on what they can get deals on, but you can typically get fresh produce and pringles and baking mixes and that sort of thing. And all of it is less than the jacked up prices you pay at Kroger and Giant Eagle, even with their slightly-reduced-gouging-at-the-expense-of-tracking-your-every-purchase loyalty cards. The extra trip you have to make to those stores to fill the rest of your grocery list will fill only 1/2 our cart, but cost much more than the ALDI trip.

They don't advertise so that they can save money, but Unwrapped on the Food Network did a little blurb on them in one of their shows. You really can't go into ALDI with a list and expect to get everything you need, but if you're willing to forfeit a bit of pride and convenience, you save a ton! Your mileage may vary, but I track our family finances very closely and we spend 1/3 less a month on groceries for our family of 4 during months where we make it to ALDI. We save about $2000 a year by shopping here.

In addition to cutting me and the boys hair, being willing to drive older and used cars to bypass having car payments, working at our church's preschool so that the kids get free tuition, and finding us the greatest deal on a cell phone plan of anyone I know - my lovely wife sacrifices to make an extra grocery trip so that we can save. It's stuff we probably wouldn't do if we both worked full time, but it has a visible and significant impact on the way our house runs. I think that a lot of people forget that there are two sides to the family finance equation - income and expense. Income is the harder variable to tweak, but by controlling expenses our income goes much further.

Thursday, July 16, 2009

Vista SP2

Someone known only as Eman posted a link on this site that made my day. I've followed his instructions with a slight tweak to the .cmd file. So, the long and short of it for those who've been following my DVR posts is that I've upgraded my DVR box to Vista x64 SP2 and re-enabled my remote desktop hack. And, for $50*, I've pre-ordered my copy of Windows 7 from Amazon, so when that arrives I'll likely be upgrading my DVR box again.

* Of course, now the early-bird special at Amazon is done and now it's $119.

Wednesday, July 15, 2009

Robocopy

Apparently I've been asleep at the command-line wheel. I was told today about a tool that Vista includes free, and I cannot figure out how I lived without it. Robocopy *. I've been using SyncToy with mixed results. No more.

See this great article for some robust copying goodness.

* yes, I know about Cygwin + Rsync.

Monday, July 13, 2009

Bad cache

We had some code break down today. Here's the story.

One of the great tricks in the object oriented world is late bound variables. When it's expensive to initialize a variable, or you're not sure you're going to always use it, you don't initialize it until first use.

Public Readonly Property Something() As SomeObject
Get
If _someObject Is Nothing Then
_someObject = DoExpensiveInitialization()
End If
Return _someObject
End Get
End Property
Private _someObject As SomeObject

Another great trick is caching data. If you have some data that you're going to use frequently and that data doesn't change, then load it into shared memory and let all instances of your objects use it without being chatty with the database.

Private Shared s_someLookup As Dictionary(Of String, String)
Shared Sub New()
s_someLookup = GetLookup()
End Sub

So today, we had a whole site break down due to a slight oversight and a misapplication of these concepts. Here's a variation of the code:

Public Shared Readonly Property DataLookup() As DataSet
Get
If s_dsLookup Is Nothing Then SetLookup()
Return s_dsLookup
End Get
End Property
Private Shared s_dsLookup As DataSet

Private Shared Sub SetLookup()
Try
s_dsLookup = New DataSet() ' -- OUR LATE BOUND PROPERTY IS NO LONGER NULL!!!
Dim adp As New SqlDataAdapter(CNN_STR, GetConnection()) ' -- EXCEPTION THROWN
adp.Fill(s_dsLookup)

Catch ex As Exception
' s_dsLookup = Nothing ' -- THE SINGLE LINE FIX

' Handle the exception, but we forget that
' we initialized s_dsLookup so now we're dead
' on every call to the DataLookup property
Handle(ex)
End Try
End Sub

So, code that never failed before, failed today. And I had to track it down. And tracking it down was a PAIN because:
  1. The breakage presented itself far away from the actual problem. Rule #1 - fail fast!
  2. The breakage was not reproducible in any other environment, because the failure was a fluke occurrence.
  3. It was a Monday, we were short staffed, overloaded with hot projects that needed to be done yesterday, with a bug that affects the whole company, and I am neither the author of the code nor the primary developer for the broken site. Murphy's law.
  4. The fix involved the inevitable discussion with management about why these sorts of things happen, and why we use these newfangled development techniques.
Doing tricks for performance purposes always has a tradeoff. Usually it's in the area of maintainability. Not that I'm complaining. Finding these sorts of things and fixing them makes me a better developer, and also gives me great fodder for the blog. I just wish that this stuff wouldn't inevitably happen on Mondays. Or late Friday afternoons.

Thursday, July 9, 2009

Corporate Signs

The day after Michael Jackson died, we received a company-wide e-mail informing us that "The King of Pop is dead". I nearly deleted the e-mail right there, but against my better judgment I read on anyway, only to find out that the message was in regards to our company's popcorn machine breaking down.


/* ************************************** */

At my last job, we had large potted trees amidst our cube farm. People were found to have been dumping their 1/2 finished drinks into the pots. A sign was promptly put up speaking for the trees:

I am not a sink!

Upon my next trip to the men's room, I saw that the sinks had gotten in on the action with their own signs:

I am not a plant!

Any funny office signs, memos or office e-mails to share?

Tuesday, July 7, 2009

Trash compactor

Mt. Rumpke, 1075 feet high and growing at 6,200 tons a day.

When I was younger, I remember trash men riding on the back of their trucks and collecting bags from any number of trash cans the neighbors put out. Then, at some point the city mandated these monstrous 90-gallon containers and each household only got one of them. They equipped the trucks with an arm built to lift the containers, and the day after Christmas is the only time you get to throw out more than what fits in one of those.

Growing up in a family of 5, I recall that we nearly always filled that container to the point where the lid wouldn't close and neighbors would kindly take some of the overflow and put them in their own containers. 90 gallons was barely enough for 5 people. I suppose I expected that this was typical, so as an adult with my family of 4 I expected each person to average nearly 20 gallons of trash a week. And certainly when we had diapers that was true. Our warm summer garage was really no place to be. Ew.

But for the past year or two, I've noticed that we don't fill our container even to the half way point each week. Were it not for the smell, it'd take us 3 weeks before we really needed a pickup. We recycle, despite the fact that there's only a single free drop off point close enough to us. That helps quite a bit. But as I drive to work on trash day, I often see many other bins so full the lids won't close. It's pretty sad, I think. It's all designed so well and works like clockwork and we never see the effects. We put our junk out weekly and it just disappears, so we forget about it and do it again next week. No incentives to examine our actions or attitudes. Someone else's problem. Until, at some point, it isn't.

Monday, July 6, 2009

Good friends, good times

We had good friends over yesterday. There's nothing like spending time with people you're comfortable around. People you have a history with. People you can cook with, or play a board game or card game with.

The last get-together we had these friends was with their family, and Ian went on an adventure walking dogs three times his size and wound up only mildly corrupted having stolen a moment on a few big machines he happened upon with his chaperon:


This time, we took a trip to Jeni's, made dinner, and on a whim used Google to find a really tasty and easy onion ring recipe (slightly modified by the addition of some Frank's Red Hot). Even when we don't do much of anything, it's still always a memorable time.

I'm one of those people who finds that social situations are in general more draining and alone time is more replenishing. But, there are those rare relationships where you can just be yourself all the time. Bad days or good, cranky or joyful, tired or wired. An acquaintance of mine from my younger years once wisely told me that good friends are those people who you can be away from for a really long time and when you meet again, it's as if you saw them yesterday and you pick right back up. I see much truth in that.

Wednesday, July 1, 2009

Digg Dugg

That's it. I finally did it. I've deleted Digg from my list of RSS feeds. The 14 year olds can have it. It's been a train wreck since its inception, but with so many posts there was bound to be something interesting for the likes of me. Always some distant hope of finding a gem. But alas, it is not to be. No more digging in cesspool. Digg hath Dugg the hole they must now lie in. Buh-bye.

Monday, June 29, 2009

Firefox 3.5

IE8 and Google Chrome have been doing some things lately that were making me start to reconsider my affinity for all things Mozilla. IE8 is finally becoming standards compliant and the latest release has some actual innovative features. And Chrome is so minimalist, but beautifully functional. It's memory footprint on my machine right now is 12MB vs the 100MB taken up by Firefox. Firefox 3.0.x is showing its age!

Maybe my problems stem from the fact that I have 6 or 7 plugins for Firefox. It's my RSS reader, my weather station, my web site CSS tweaking tool, and a handful of other things. It is S...L...O...W... to start up and a resource hog.

But then, Firefox 3.5 has hit release candidate 3 stage and I finally installed it. And all I can say is wow. It starts up fast, it browses fast, and most of my plug-ins are ready and working. I've only found one dumb default setting that I had to change: browser.tabs.closeWindowWithLastTab was set to true in this release. Boo for bad defaults. But other than that, I'm off to the races.

Check out their video campaign. I had the kids asking me if Steven Purugganan's video was actually real, and they begged me to show it to them 4 times in a row.

jQuery to the rescue!

I had a thought today as I was posting - I like to link out from my blog, but it's really inconvenient for my readers to click on those links and have it open that link over top of the post they're reading. And I don't want to have to go back to my previous posts to update the links manually. Blogger should just handle it for me.

A quick Google search brought me to these posts, but that isn't quite what I wanted. That would change every single link on the page. There are some links that hop between other pages or actions on my blog, and opening those in a new window would be annoying. So, jQuery to the rescue. I just added the following snippet to my blogger template:
<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js' type='text/javascript'/>
<script type='text/javascript'>
$(document).ready(function() {

// Make external links open in a new window
$("a[href^='http:']").not("[href*='blogspot.com']").click(function(){
this.target = "_blank";
});

});
</script>

What this says (in semi-cryptic jQuery-ese) is that when the page has finished rendering (document.ready()), then associate my click() function with all anchor tags that href to an external website. So, with this simple modification to my blogger template, I can now make blogger handle all the links to external sites in all my posts for all time by opening them in a new window with no additional actions on my part. Ever. Nice...

Questions - June 29, 2009 edition

Why is it that my Windows Mobile phone is everything I need in a portable computing device except that it is a terrible phone? Did this thing just crash when I got a phone call? Isn't the main point of this thing to answer calls? Isn't that the one thing that you should have to get right?

Why is it that some companies make ordering a morning coffee the most insanely difficult thing you'll ever have to do when you haven't yet had your morning coffee? Grande cafe decaf latte no-whip caramel soy mocha with cheese... er, something...

Why did Barty Crouch Jr. feel the need to cook up this whole elaborate plan with the Triwizard Tournament? Couldn't he have just had Harry stay after class one day for detention or extra lessons and send him off to the graveyard then? Hey Harry! Would you mind grabbing that port ke... er, I mean blast-ended skrewt off my desk over there?

How will those people in Europe get a web browser when Microsoft stops including Internet Explorer in Windows 7? Um, honey? Where's the IE icon? I need to download Firefox.