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.

Friday, June 26, 2009

The final word on truth

Since it seems that I have started, although quite unintentionally, a blog mini-series on truth, I thought I ought to perhaps tie it up with a third post to close out. Except that as I pondered it, it became very obvious that I myself am not the author of, nor an absolute authority on truth. So, perhaps the last words on truth in my series needn't be mine.

I believe that unarmed truth and unconditional love will have the final word in reality. This is why right, temporarily defeated, is stronger than evil triumphant.
- Martin Luther King, Jr.


Truth is such a rare thing, it is delighted to tell it.
- Emily Dickinson


If you don't read the newspaper, you are uninformed; if you do read the newspaper, you are misinformed.
- Mark Twain


It is one thing to show a man that he is in error, and another to put him in possession of truth.
- John Locke


And ye shall know the truth, and the truth shall make you free
- John 8:32 KJV

Thursday, June 25, 2009

The truth will out

With props to Shakespeare's The Merchant of Venice, "at the length, truth will out". Yesterday's news of Governor Mark Sanford's affair is yet another headline in a long list of politicians who've fallen prey to infidelity. Consider this list of some of the more recent ones:

  • Governor Mark Sanford. South Carolina Republican. June 2009 admitted an affair. Married to Jenny.
  • Senator John Ensign, Nevada Republican. June 2009 admitted an affair. Married to Darlene.
  • Senator John Edwards, North Carolina Democrat. August 2008 admitted an affair. Married to Elizabeth.
  • Congressman David Vitter, Louisiana Republican. Name turned up in a prostitution ring, and admitted the affair in 2007 while married to Wendy.
  • Senator Larry Craig, Idaho Republican. Arrested in 2007 for lewd homosexual conduct while married to Suzanne.
  • Governor Jim McGreevey, New Jersey Democrat. In 2004, admitted to a homosexual affair with a man while married to Dina.
  • Governor Eliot Spitzer, New York Democrat. In 2008, admitted to an affair with a prostitute while married to Silda.
  • President Bill Clinton, Arkansas Democrat. In 1997 admitted cheating with Monica Lewinsky while married to Hillary.
These men have years of public service. Success, power, fame. From afar, they seem to have everything they could have dreamt of in their youth. And yet they fell prey to the most basic of all traps. And the worst of it is that their wives and families bear the brunt of the fallout. The worst is that their personal pain is drug through the public square. The worst is that there are many more men out there that will not learn from any of this and will destroy their families too. The worst is that there are more wives out there who's husbands have not been outed yet... but they will. You see, the thing about truth is that it cannot be concealed. The truth will out.

Malachi 2:15 - Has not the LORD made them one? In flesh and spirit they are his. And why one? Because he was seeking godly offspring. So guard yourself in your spirit, and do not break faith with the wife of your youth.

Proverbs 5:18 - May your fountain be blessed, and may you rejoice in the wife of your youth.

Wednesday, June 24, 2009

The truth, the whole truth, and nothing but the truth

Imagine you're thirsty and I offer you a glass of water; you would drink that right? But only if that water was clean. If I add even a single ounce of raw sewage to your otherwise crystal clear water, you'd refuse it. You'd treat a gallon of water with an ounce of sewage the same as you'd treat a gallon of sewage with an ounce of water - undrinkable.

The same concept applies to truth. Even the tiniest lie taints it. Truth only exists as a whole, not in part. Just the same as there's no such thing as being a little bit pregnant, there's no such thing as a half-truth - a half-truth is a whole-lie.

The same concept applies to sin. Even the tiniest one taints us. Perfection only exists as a whole, not in part. And we cannot achieve that on our own. It's in our nature as humans to desire it even though it is unattainable; much as we desire flight though we have no wings. We are not, and can never hope to be, perfect through our own abilities. We each are in need of a Savior. Ain't that the truth.

Tuesday, June 23, 2009

Hypocrites

If you asked any random American on the street to name as many actual living people as they possibly could, whether they knew them personally or not, what do you think would be the career of the majority of those named? In other words, what do you think is the most common profession where we can personally identify people with that job? Take a minute... think on your answer.

Doctors, teachers, lawyers, police officers, firefighters? We probably know only a handful of people who do those jobs by name. Musicians, politicians, or athletes? We can probably name quite a few of those. We're getting closer, but still not there. Authors? Not even close. No... my non-scientifically definitive answer on this topic is... actors. Any given average mainstream American can name hundreds of actors. In fact, there's even a website or two dedicated to help if you'd like to try.

The Greek word hypokrisis was used to mean actor, and is where we get the more derogatory word hypocrite. The synonyms of which are deceiver, dissembler, pretender, and pharisee according to Dictionary.com.

Is our society's prolific knowledge of actors indicative of anything? Perhaps not. But it is interesting to me that the career that makes the most people famous in this country is one in which you earn money by pretending to be someone you're not. I pretty sure that it hasn't always been this way - before movies and television the top spot probably went to politicians or athletes.

You know, I didn't know one single name of a firefighter who died on 9/11/2001 before I looked up the list, but I do know most of the cast of Ocean's Eleven. Actors do not make the list of the top 15 largest worked occupations in America. In fact there are only about 44,000 actors in the US. So why does this profession hold the elevated position it does? Its workers in general are certainly not a model of the values we claim to embrace as a society, as evidenced by the the grocery store news rags. Are these people really worth knowing so much about? Does our obsession with actors say something about our nation's values?

Saturday, June 20, 2009

Miami U Alumni Weekend '09 - updated

The good...

* Public WiFi uptown
* The campus has changed a lot since 2000, but mostly for the better
* The crowds are small thus far

The bad...

* 45 East - what a disappointing replacement for the old Attractions restaurant. Of course, expecting much more out of a college town during the summer months may be my fault
* It's really hot today
* There's not much in the way of kid friendly activities. We're off to try ice skating. Wish us luck!

Posted from my phone... sorry for any bad spelling

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Update from home later this evening:

Ice skating didn't go too well, as they closed at 3:30 and Ian literally got 3 whole minutes on the ice. We spent more time watching the Zamboni afterwords than that. Leftover effects from our poor restaurant experience.

But, from this point it got much better. Beth and I participated in a Guinness Book of World Records wedding vow ceremony. It was really well done. They had a wedding photographer, newly weds (from yesterday) as the token newest Miami Merger, a reception area with cake, and over 1000 couples there with shirts to match. It was a really nice ceremony. Unofficially, we knocked the previous record out. Officially, it was nice to recognize the role going to Miami has played in the course of my life. Now that I've stopped waking up with nightmares about missing classes and exam days and not really graduating, I think I have for the first time experienced an actual alumni-style bond with Miami. I even rubbed a turtle head on the sundial.


After that, it was off to an InterVarsity Christian Fellowship reunion party, which was great. Though time and distance separate us now, our hearts will never part from these people. Even though I didn't get my Toasted Roll this visit, it was still a great weekend. And maybe, just maybe - our two may choose to be Redhawks someday. I'm exhausted, and renewed all at once. I'll sleep peacefully tonight, as long as I can manage not to dream of finals from a decade past.

Friday, June 19, 2009

Connected

I'm writing this post with only my thumbs on the extended keyboard of my Samsung i760 Windows Mobile (6.1) device. It's amazing to me just how connected we are. For a grand total of $50, I got this phone from VZW and it's more powerful than my first PC. From restaurant reviews to driving directions to reading the laments of disenfranchised Iranian voters, the world is literally at my fingertips, as long as I can find WiFi.

All of a sudden I find it all so small and fragile. Is it possible that we've reached the pinacle of civilization? I'm not sure what comes after this technology-wise, but I find it very surreal that we're so connected to one another, yet so completely disconnected. Do we really see other people and their true needs, or is the value of relational depth diminished by the breadth of our connectedness? Do we see life in soundbites - dehydrated monochromatic forcefed viewpoints? Is that all the capacity we have due to the amount of information we're exposed to? Of course we're capable of depth, but do we pursue it? Given the choice, what do we choose to be connected to?

Reality Bytes

I receive and process a lot of data from external vendors. And, in my life immersed in extracting, transforming, and loading data, the thing I find most unbelievable is how frequently people worry about the size of the data when that can't possibly be a real concern. Take this morning - I receive a historic file from a vendor containing 1,500 records. That file is being sent incorrectly because it contains 12 months of 'history', but we've discovered that changes are happening on records older than 12 months. So, what we really want is 12 months of change history, not 12 months based on some termination date. Since they don't track change history, we'll have to settle for increasing the time window to 24 months.

Anyway, that file is 225 KB in size. Seriously - my shoelaces have that much memory! But, I'm predictably getting pushback because "adding to the history file would make it larger". "You really want to double the size of that file!?". Well, technically, yes. True, but irrelevant. A gram of dust landing on another gram of dust does increase the mass, but you can't be serious that you care! If there's some other technical reason, fine. But don't try to sell me on data size concerns.

This is an extreme (though true) example, but it always amazes me how often people incorrectly worry about the size of their data. I see this in coders too, when they worry a lot about O(n^2) looping. Okay, yes your comp-sci 101 class taught you to watch out for that, but they were talking about when processing millions of rows, not thousands.

Maybe I'm jaded because my last project was on a 4 TB Data Warehouse with my largest fact table being 18 billion rows. Many of the dimension tables were 60-80 million rows. Somehow, a couple of thousand extra records just doesn't phase me. People - get some perspective! Bytes are cheap.

Wednesday, June 17, 2009

Create Again

Aaron Shust's songs are absolutely the prayers and praises of my heart. I can't get enough, and he's got another album on the way. I bought Anything Worth Saying somewhat by accident a few years ago, and loved it so much I rushed to get Whispered and Shouted right after it came out. He also does free songs around Christmas too. Really amazing stuff.

Create Again

Separated from night
You spoke and then there was light
They point to You

Divided water from land
Bowing to Your command
They point to You

The sun that's blazing at noon
And every phase of the moon
They point to You.

A baby's cry and the way
A sunset closes the day
They point to You.

For You're the only One worth praising
More radiant than earth and sky
And everyday that I survey Your creation
I see why I see why

(chorus)
God of everything I see,
Come create again in me
You were yesterday
And You will always be
So take each breath that I breathe
And be the life that I bleed
Create again in me

The storm that's raging at sea
The little child on her knees
They point to You

Your grace that's poured out on me
The sacrifice on a tree
They point to You

For you're the only One worth praising...
(chorus)

Your Word vaults across the sky
From sunrise to sunset
Melting the ice, scorching the desert
Warm our hearts to faith
(Create again in me)

Tuesday, June 16, 2009

DIY DVR, it's about time... (part 4)

Last night, I found myself casually watching Batman Begins on live TV, and about a half hour into it I thought I really should have recorded this. Well, since the DVR is always recording, all I had to do was formally hit the record button and I got the whole thing even though I didn't tell it to record until really late into the show! Now, had I changed the channel at some point before deciding to record, I realize that the live TV history would've been lost. But, that's still another really nice feature!

Hamburgler

Now I don't go to McDonald's for food much. In fact, I don't really even like their food since I grew old enough to be too embarrassed to order myself a Happy Meal. An occasional morning caffeination run, sure - I'll do that. It's cheaper than Starbucks and their foo-foo stuff is tasty enough. But sometimes... sometimes I just have to have their fries. I really don't eat fries at restaurants much anymore. But with McDonald's it's different. I dunno whether it's because they fry 'em in beef or what, but for some reason about 4 times a year I just have to go order me up some Micky-D's fries. Unless they over-salt them (which admittedly does happen way too often) you just can't go wrong.

But then, you're at this one-hit-wonder of a fast food joint, and you ask yourself - what sandwich do I want with my tasty golden fries from heaven? Up until recently, for me, the choice has been easy - the Big 'N' Tasty. It was a reasonable burger with fresh ingredients and had actual VEGGIES on it for a good price. But now, this gigantic, bland, monstrosity they call an "Angus Burger" has taken over the menu. The last two quarters when I had this craving, I hoped I was just in some test market where this angus burger crap would fail miserably, and the B'N'T would come back. But alas, no. My fries are destined to travel to my stomach without a suitable partner.

Perhaps it's time to finally time to call this whole thing off. Tomorrow, it's back to Subway, or Chipotle, or Panera with their yummy greek salad. And in 3-4 months when I feel this craving for fries again, I'll try to remember how the Hambugler stole my tasty side order, and I'll not go back. Hopefully. Of course, that's much easier said than done with a belly already full of fries.

Monday, June 15, 2009

Preconditions

Google's been doing some interesting things lately. Some attract lots of attention, some very little. One that you may not have heard of is Google Collections. It's just a series of Java helper classes. At first it may seem like a non-event, and mostly for us .NET folks that's true. But I read this post about a year ago, and my interest was piqued by their Preconditions class. It's nothing significant - it just throws various argument exceptions if you don't pass "true" to its methods. But, after writing and using a .NET implementation of it for over a year now, I'm a huge fan of the concept. Formalizing "preconditions" does a few things:
  1. Causes me to actually bother to check method parameters (because it's easy) rather than just start using them and risk a failure
  2. Takes all the code for checking arguments and makes it very readable. It's really clear that I'm defining a contract for what you can pass to my methods, and I'll throw an exception early if you violate that contract. It's also clear where your eyes need to skip to to get past the house keeping stuff and see the meat of the method.
  3. I now notice when I haven't checked params because it's obvious when my methods don't begin with a Preconditions call or two. This is a good thing when code smells are obvious
  4. Creates a standard convention for how method argument verification is handled in a project
DbC, or design-by-contract, is a concept I was first introduced to in a comparative languages course in college. Eiffel is a language that actually requires DbC with it's syntax. With the Preconditions class, you can accomplish the same sort of thing in C#. Try it out.

As for a Postconditions class, well... lets just say that I'll do what I say I'll do in a method, and there's no need for me to check that I did it for you. If my method doesn't do what it says, file a bug report :-)

Embedded Resources

In the .NET world, ORMs are only just now beginning to see the light of day. Though nHibernate has been around for awhile, it has not seen much uptake from mainstream .NET devs. It may have to do with typical FUD stuff, like its roots in the Java world, its reliance on XML for the mappings, its learning curve, or the lack of books and beginner's resources. I'm not judging - I've read this book and I think nHibernate's offerings are the most mature and robust available for .NET devs, but I've also been looking at Microsoft's offerings via Linq-to-SQL and Entity Framework and think that MS is probably going to keep fighting until EF comes out on top. Until this all shakes out, I believe that data access will continue to be in a giant state of flux.

For good or bad, that's the state of things. The ORM space has not matured in the broader .NET world, and ADO.NET is still the most used method of data access for now. That means plain old SQL is still really useful. Actually, plain old SQL will always be useful while RDBMs are the anointed choice for data storage.

There are two main sources of trouble though. First, there is the very real issue of how to map tabular data to objects and back again. This is called the Object Relational Impedance Mismatch, and is not the subject of today's post. The other issue is one of query management, and it is today's topic. How do you manage your queries? Most people are still using vanilla SQL, though Linq+some-ORM-tool is a very compelling alternative.

For the raw SQL crowd, I think many would agree that it is a pain to manage your queries and no one does it the same way. Do you choose stored procs? How about fancy custom SQL builder classes? Do you use System.Text.StringBuilder? Or worse, just regular string concatenation? Pick your poison. Mine is embedded resources. I keep nearly all my T-SQL in .sql files in my .NET project.

Consider:
  • SQL files in your project get syntax highlighting, commented, and formatted. Those things don't happen in string based SQL building

  • Stored procedures are detached from the code that uses them. That makes it difficult to know what effects changes in procs will have. Embedded resources allow you to keep SQL near the classes that use it.

  • Try doing a simple Find-and-Replace in your stored procs. Not fun. It's a snap with embedded resources in a .NET project

  • Stored procs are difficult to version control. I do it via Visual Studio database projects, but not many other devs have every used them. And, MS hasn't done much to develop that project type since VS 2003. AND it's really easy to use SSMS to subvert the process and change procs outside the project. Putting .sql files in your .NET project means that version control is now a no brainer.

  • If you have to rollback a release, your SQL being compiled into your project means that a rollback only requires reversing table/view/udf modifications which are typically less extensive than your SQL changes.

  • With SQL Server, your .SQL embedded resource files can utilize full T-SQL capabilities. Variables, temp tables, etc. Anything you can put in a stored proc, you can put in your .sql file. The one huge advantage though is that your .sql file doesn't have to be parsable SQL. It's still a string when it comes out of the embedded resource, so "select * from {0}" can be put through a String.Format() transformation prior to execution. It's the best of the stored proc world and the StringBuilder world with none of the disadvantages. PS - don't ever use "select *" outside of some pithy example code, please.
The one and only drawback I've found is that stored procs are dynamically updateable so you can change a proc on-the-fly, but with embedded resources you have to re-compile. Of course, sql modifications are one of only a handful of change types that can happen dynamically, and just because it can be done that way doesn't mean it should. But, if you need it, you could accomplish this dynamically via some fancy coding too. Just have your embedded resource loader check a directory for a .sql file first.

I'm a big advocate of using the right tool for the job. If ADO.NET and SQL are the right tools for your application, strongly consider putting your SQL in embedded resources. When a StringBuilder or a stored proc are appropriate, of course use them instead. But, I've found that those instances to be the exceptions, not the rule.

It may also be easier to get started with a little helper class for your embedded resources. Hopefully at some point soon the merits of ORM tools will shake out a little more and become more widespread, but until then this may serve you on some real life project today. Happy coding!

Sunday, June 14, 2009

Lifeline

  • 3/20/03, 6AM -I found out this little precious gift was on his way into the world. I'm dragged from the comfort of my bed by a very excited wife, and told to look at the pee-stick. I think I reacted well - excited and happy and awed. And then, I tried to go back to bed for one more hour of sleep before heading to work. I actually laid back down - heh. And then, within 5 minutes my wife found me checking MS Money and trying to figure out our financials.
  • 3/23/03 at a rest stop on the way back from a relative's wedding in St. Louis, we present my in-laws with a 'grandparents' bib. Everyone cried.

  • 4/23/03, we get our first ultrasound and see our little Ian for the first time. 34 mm. Due date set at 11/24/03.

  • 11/2/03, Beth's got a lot of lower back pain, so we go on some long walks.

  • 11/3/03, 4:20 AM - arrived at the hospital. 6:16 AM, he's here - 6 lbs, 15 oz. Ian Michael.
It's now more than 6 years since that first morning, and on 8/25/09, he starts kindergarten. On that first day I had a mixture of all sorts of emotions. Excitement for my first baby, love for my wife, an overwhelming sense of unpreparedness, and a healthy dose of fear. Nothing prepares you for the sleepless nights or the odd sense that there's a stranger about to enter your home and live with you. Nothing prepares you for "helping" your wife through the birth. And nothing prepares you for the expansion of your heart to love someone you've never met with a fullness you didn't realize you were capable of.

I think you're never really prepared for anything but each day as it comes, but what a thrilling ride it is. There's a time shortly after birth where this little person is no longer a stranger. You find yourself correcting someone else when they are not doing things the way your baby 'likes' it done, and you realize that you've bonded with this little person. And then, they grow right before your eyes and you're feeding them solids, and then catching them as they learn to walk, and then teaching them words, and introducing him to his new brother, Caleb.

I wonder what adventures school will bring for Ian. I find it bittersweet that Beth and I will no longer be his sole gateway to the world. For our anniversary, I got Beth the Willow Tree figurine pictured in this post to commemorate this moment in all our lives. Ian's just about that height on her now.

When you climb a cliff, you have to keep attaching new lifelines higher and higher as you go. You can't hold on to the ones below or else you'll never achieve your goal. But, it's nice to stop and look out at the view from where you're at and where you've come before you attach that next line and keep climbing. This is going to be one amazing summer!

Friday, June 12, 2009

The Squire and the Scroll

The Squire and the Scroll is quite the popular bedtime story in our house these days. Caleb (age 3) is always looking for a story about dragons, and Ian (age 5) is really interested in longer books with more depth to the story. And both boys identify this book as one that's just for boys, and like to exercise their male identity through daddy reading it to them.

The book is set in medieval times with knights and dragons and quests and evil and temptation. Its goal is not just to entertain, but to also teach a lesson about the value of purity and choosing right paths versus easy or tempting paths. It's based explicitly on Psalm 119:9, which says, How can a young man keep his way pure? By living according to your word.

The 'Word' in the story is represented by a scroll, which says:
  1. Listen only to words that are pure
  2. Let your eyes look straight ahead, fix your gaze directly before you
  3. Keep the unclean from your lips to guard the wellspring of your life
  4. Make level paths for your feet and take only ways that are firm
  5. Breathe only that which is pure
The quest is for the Lantern of Purest Light, which has been taken by a dragon; an "enemy of truth and beauty".

The boys listen intently to every word, and I wonder to what depth they internalize the message. I, on the other hand, am hit in the gut every time I read it. Do I guard what goes in (#1, #2, #5)? Do I guard what comes out (#3)? Do I look to where I'm headed (#2, #4)? Do I value purity, or self?

The book is careful to dispel the temptation to believe that "ways that are firm" refers to the path that looks easiest, but instead is the one of firm conviction. It is also careful to distinguish fear from wise-wariness.

It has got quite the message, and one that I believe society may pay lip service to at best, and actively rails against at worst. The cult of self says that the right path is what feels good, or acquiesces to our own desires, or advances our own position. You've heard these all before: "Anything goes." "Have it your way." "If it feels good, do it." "It's not hurting anyone else."

I've been reading Raising a Modern-Day Knight. In it, Robert Lewis presents an accurate but cutting image of modern day manhood. Absent, addicted, abusive, distracted, detached, overworked, over-sexualized, uninvolved, floundering... Self-serving and neutered. This sort of man is a product of many factors, but each and every one has the same lasting effects on his household, his community, and his progeny.

And then Lewis presents the alternative, which is, and has always been, God's intent for men. He describes the alternative as a REAL man. A real man:
  • R - Rejects passivity
  • E - Expects the greater reward
  • A - Accepts responsibility
  • L - Leads courageously
I could write all night about these principles, but the point of this post is simpler than all that. If I want my boys to know what it means to be a man I need to be active in modeling it for them. I need to accept responsibility for my family and my own mistakes. I need to help them set a vision for themselves, and gently lead them on paths that are firm while it is still my job to do that. I need to speak truth to them. Not the world's truth, but God's. And then, as knights off to a worthy battle, I wait with great expectation for the day when I commission them to their own travels, lives, wives, work, and world.

There's a page in The Squire and the Scroll that elicits awe from both children. When our protagonist reaches his destination, the dragon sneaks up on him and hisses, "There is a price for the Lantern". When the page is turned, there are no words... our hero stands in the midst of the mighty dragon... a fully consuming panorama of billowing smoke and green scales... snaking tail and bared teeth... menacing and dangerous.

Though small in comparison, our hero stands brave with the scroll at his side - seemingly outmatched, no visible armor, but armed nonetheless with everything he needs for the battle. Caleb whispers, "it's the dragon". But I can see nothing but the young man, fully equipped for the trials ahead.

Proverbs 22:6 "Train a child in the way he should go, and when he is old he will not turn from it."

Thursday, June 11, 2009

Farewell MS Money

I've used MS Money since 1997. I still have that OEM disc from '97 that came with some computer. I tried Quicken around that time, but they started CALLING ME and sending me junk mail. Bad move Intuit. I've used MS Money ever since.

I sent in a rebate for MS Money 2000, but Microsoft never sent me my check. Bad move MS. That's when I decided to quit buying it retail. I used to look in Half Price Books for 1-2 year old copies of MS Money still in the shrinkwrap - I've never banked at some obscure institution so the latest-and-greatest was never necessary. I stuck with it even through the Passport nag screen years. While never the best product, it was always functional. I've been building various toy pieces of a web-based personal finance manager for years. QIF importer. Analysis Services cubes of my financial info. A bill scheduler. But MS's functional product always won out over my 1/2 baked pet projects designed to teach me a technology rather than build a real product.

And now, it's going the way of Windows ME. Farewell MS Money. 1/3 of what I know about family finanace I learned from you. 1/3 from God's Word. And the final 1/3 from pre-calc in High School. Especially in this time of financial lostness - when our government and its people believe only in deficit spending, we need to leverage technology to help us change our habits. I know how much I spend on eating out versus buying groceries. Entertainment vs. savings. Taxes vs tithe. Would knowing change your habits? Would goals and rewards help? I know I need all that. While MS removing its offering won't leave a sucking void, I wish it would have because that might say something different about the financial health of Americans. I think it's time for me to get coding again! ASP.NET MVC framework, here I come!

Wednesday, June 10, 2009

DIY DVR, it's about time... (part 3)

My RDP problem is solved!!! About 1/4 way down the thread, there's a post on 11-20-08 with the link to the SP1 termsrv.dll file for x64. I just extracted from the .zip and ran Premium.bat. Then, I had to be sure that the account I use for RDP access didn't have the IR blaster for my remote control in the "All Users" start menu startup folder, or else I wound up running two copies and couldn't use my remote. Once I figured that part out, I was golden.

Now, I wonder about the Vista EULA I didn't read? I dunno... Cammy (my cat) is the one who agrees to those in our house. She just puts her paw on the enter keys... unstoppable that one! She loves EULAs. Agrees to them all. I swear I don't remember paying for her law degree. Now, if only she could talk to me so that I'd know what she agreed to. Hmm...

Dims and Semicolons

i'll admit it. my 4-year bachelor's degree in computer science and systems analysis caused me to really like semicolon languages; and terse-ness; what i mean by that is obvious if you're a programmer; i prefer languages like c/c++, java, and c#; and even javascript; (though you can cheat with the semicolons with js, but i never do; true faithfulness); but c#, though i love thee, we can agree to disagree about curly brace placement. i don't care what the other dads do, you braces don't get your own line just to open a code block; period. er, semicolon;

But My Job Now Is Wholly VB.NET. So Now I Can Type In Any Case I Darn Well Please And Auto-Formatting Will Take Care Of It. AndAlso Everything Is A Really Long Statement With Extra Verbiage And Blue Highlights Just For The Art Of It. As Long As I Dim My World AndAlso Speak Semi-English In Loving But Excessively Long Streams Of Coding Goodness, My Code Will Compile, OrElse It Will Tell Me Early That It's Sick.

But, But, But...
If I'm Not Careful To Be Strict And Explicit All The Time Then
Integers Can Be Strings And Strings Integers. Which Will Lead To, Well... Peter Venkman From GhostBusters Said It Best - "Human Sacrifice... Dogs And Cats Living Together... Mass Hysteria!"
End If

...

In VB, I miss terse-ness, the yield statement, multiline comments/strings/statements (the underscore trick has problems), \t, \r, \n, anonymous delegates, not having to tell my code what 'options' I want, and square brackets for array indexers. I especially miss multiline statements - that little trailing underscore doesn't cut it when I want to comment out one part in the middle of my Linq statement! And why not just have made And and Or short-circuiting operators rather than adding AndAlso and OrElse? How can VB be so WRONG about those things?! I love C#.

In C#, I miss case-insensitivity, inline XML, single equals for comparison, being curly brace free (square braces can stay though), the With statement, the End keyword combos rather than }'s, and automatic-background-compilation. Especially automatic-background-compilation - CTRL+SHIFT+B is wearing out on my keyboard! And, I mean really - tell me why character casing matter to humans again?! It's only easier for the computers! How can C# be so WRONG about those things!? I love VB.

...

Much like my two little boys. One's a little sensitive, and one's a little stubborn. One likes Batman, the other Superman. One's got brown hair and the other's a tow head. One's a dreamer, the other a great friend. One's got an infectious laugh and the other's got an infectious smile. They're both so different... but so much the same. Brothers. No favorites, just beautiful diversity. Blessings abound.

Tuesday, June 9, 2009

DIY DVR, it's about time... (part 2)

So, as promised, here's my quick review of the good, the bad, and the ugly about my Vista Home Premium Media Center setup:

The Good:
  • It just works! Media Center already knew about my TV tuner card, it had a nice wizard for configuring my monitor/TV for optimal output, it has reasonable defaults, and it was already on my HP when it booted up. I started it up prior to stating my planned install of GB-PVR just to see what MS had done, and never got around to leaving Media Center.

  • Media Center has a nice plug-in architecture, which means I can add functionality to Media Center via simple downloads. In fact, Media Center even prompted me about a Netflix plugin. Apparently, you can get an unlimited download subscription to Netflix for $8.99 a month, and access your Netflix account via Media Center. There's a two-week free trial going on now, so once we're ready for out first movie night, I'll sign up and try it out and report back. LifeExtender is another nice plugin!

  • It's not just for TV. You can view pics, listen to music, burn shows to DVD, and check out sports scores and stats right from the remote. Nice. I can even do a few simple computer tasks like reboot without touching the machine.

  • The guide:
    1. The guide allows you to filter out channels by category, so if you only want to see what movies are on, you can do that. Kids shows... whatever. I've not figured out how to customize these yet, but that's a nice feature.
    2. If you choose a show in the guide, you can record it, or you can also choose to 'record series' to record all instances of that show on that channel. It also warns you of recording conflicts and offers to help you resolve them.
    3. When you view info about a movie, it'll give you all sorts of extra info including the art on the DVD cover, the cast, the rating, and a description of the programming. Other than the DVD art, all the same info is available on TV shows as well.

  • No problems with skipping or choppiness, even when I'm doing tons of garbage. I can pause live TV and I can do other things while I'm recording and not have to worry that I'm screwing up my recording.

  • There are all sorts of convenience features like setting MC to always be on top of other windows to prevent anything from taking over the machine's attention.

  • When I turned on my Vista Home Premium laptop, it told me that it detected a Media Center PC on my network and asked if I wanted to share content! Heck yeah! Now, even though I only have 1 TV, I realize that I can watch recorded TV on my laptop anywhere in the house. Nice feature!

  • The mute button will automatically do closed captioning, even on recorded TV which is a nice touch. Yes, many TVs do that, but our doesn't, so the software is a marked improvement.
The Bad:
  • The guide doesn't show TV station logos, and is a bit monochromatic. Some visual cues would be nice rather than just gobs of text.

  • The live TV recording (which it's doing all the time) doesn't seem to like it when I change channels. It won't let me rewind to the previous channel's content. Probably for space concerns.

  • I have one channel that is nothing but static when I turn to it. I think it's one of the movie channels like Starz or HBO that's only available if I pay for it. MC gets really S...L...O...W... on this channel and won't let me change it for 5 seconds, which is an even bigger pain the butt because the volume is over-the-top and no one wants to listen to TV snow at excessive decibels while MC thinks about responding to mute or change channel commands from the remote.

  • The pictures it chooses for the thumbnails are not always the best. Especially if you record a few minutes prior to the official start of the show, you can get a poor thumbnail choice which is really annoying.

  • Sometimes we forget that we're on live TV and try to FF the commercials. That's a user error :-)
I'm trying to think of others because I want to be fair about my review, but mostly I'm a happy camper. However, there are some uglies.

The Ugly:
  • My single biggest complaint with my DVR isn't with Media Center. It's with Vista. Mostly I like Vista, but the blasted fools at Microsoft neglected to enable RDP (remote desktop, formerly terminal services) in Home Premium. So, I find a hacked up solution online, but it only works with pre-SP1 vista, and the info on 64-bit is a bit lacking. So, I have to use UltraVNC to connect. What a pain. I'm going to have to figure out a solution to this, because I want to log into the machine under a different account to do things rather than steal the desktop from the person watching TV. MS dropped the ball on this one.

  • There's DRM (digital rights management) in here somewhere, but I haven't figured out how or where yet. The ugly here is that I don't know if/when it will bite me, but the fact that I even have to be concerned about it on my personal PCs is annoying. I'm not sharing content over the internet - I just want to use this DVR inside the bounds of fair-use policy in my own home.
Overall, this is an A- solution, with a solid A+ from Media Center, and a B- from Vista dragging the grade down a bit.

Monday, June 8, 2009

DIY DVR, it's about time... (part 1)

Two years ago I decided that I was going to build a DVR. For those who don't know, that's a digital video recorder. Basically, it involves sticking a TV card into a computer and plugging the coax cable from your cable company into it. Why would I do this when I can rent one for cheap from my cable company? You might as well ask why the birds sing or why the sky is blue than to ask a geek that question.

So, on my 29th birthday, I received some gift cards from friends and family and the blessing of my wife to go do it. The problem was, we've been living on laptops since 2005, and the only reasonable box to use in the house was an underpowered, oversized, noisy monster of a thing from 2001. And we don't have, nor do I care to have a new HD-TV at the moment. Analog is fine for now, thanks. Also, my goal isn't just to record shows. My goal is to have the box hooked directly into the TV, and then use the box not only for DVR tasks, but also install NES and SNES emulators and also have myself an old school game station (only for games I have the cartridge in the crawl space for of course). And, I also want this machine to serve as the family's file server for music and pictures. And, this box may host an ASP.NET website or two with a SQL Server express backend.

So, armed with some goals bigger than my budget, I set off on a half-hearted mission I wasn't fully ready to complete, and I got some pieces and parts but mostly blew the gift cards on other fun things because I decided I couldn't have everything I wanted at that time. Besides, I reasoned that our DVD recorder was a reasonable stop-gap.

Well, lo-and-behold it's 2 years later and I still didn't have my DVR. But, we experienced a few new developments.
  1. Beth and I, though we only have 1 TV in the house, have found ourselves spending more time in our basement since we (she) re-imagined it last year (you go girl!)
  2. During our TV watching time, the commercials have gotten way out-of-line and inappropriate. Specifically, if we watch the Sci-Fi channel, the ads for R+ rated horror flicks during otherwise PG shows are awful. The volume discrepancy between the show and the ads became too much to take as well. And, if I see one more ad for this ridiculous Burn Notice show on USA I'm liable to put a hammer through our only TV.
  3. Our analog cable box no longer shows the channel guide, as WOW (our cable provider) is discontinuing it to push their HD offerings. Again - who needs the HD when 1/3 of what we're watching is ads anyway!?
  4. I received an unexpected but much welcomed bonus at work
  5. Memorial Day tech deals were smokin' hot this year
So, without further adieu, here's what I got:
  • HP Pavilion, 500GB SATA drive, 4GB RAM, dual core 2.5 GHz Intel 64-bit processor, Vista Home Premium (comes with Media Center). $400 at Staples.
  • Hauppauge internal PCI card. Remote and IR receiver and repeater included. Best Buy, $89
  • Galaxy 8400 512 Video card with S-Video out. Best Buy, $46
  • S-video cable from my video card to my TV. Found one in my cable drawer.
  • 2 Play Station controller to USB converters. Micro Center, $15 each 2 years ago.
  • Headphone jack to RCA converter cable. Found one in my cable drawer.
  • Life Extender. Free .NET commercial stripping goodness for Media Center. Wow.
  • USB hub. Already had it from 2 years ago.
It took me two hours to get up and running, plus some serious cable management time, and some learning time, but it has been well worth it!

As for DVR software... I had a co-worker at my last job who used Beyond TV. I drooled over MythTV when I read about it in my Linux Journal. I was planning to use GB-PVR this time around. But, Microsoft blew me away with Media Center. Being not afraid of Vista one iota, and in fact even thinking that it's a really great OS (once you disable UAC and tweak the nasty defaults), I forged ahead with MS's offering and am so very pleased. I could not be happier with this and am wowed by new features and functionality every day.

Did I pay too much? Well, maybe. But the box isn't just a DVR. It's also, as I said, my legacy Nintendo console emulator, as well as an ASP.NET development/deployment box for my personal projects, a SQL Server express dev box, a family files archive, and really the only recent 'desktop' machine we have. So, with the bulk of the expense having gone into that, it may seem pricey, but if I only wanted a PVR I could have found a cheap-o box to do the trick and stuck it in a corner rather than connect it to the TV. There are lower-cost ways to do this, but I got nearly everything I wanted. This, instead, is a much more multi-purpose platform.

I'll review Media Center in a "part II" post, and highlight the small downsides of this setup. Stay tuned. For now, I'm going to browse to Casino Royale. And Media Center will smartly remember exactly where I left off in it last night - even though the kids have watched their stuff during the day, and even though a re-run of House is recording on Fox. Ah, I'm commercial-free and happy on my crappy but functional old TV from 1992. Sweet. It's about time. My time.

Public Shared Life As Me

Yes, I know it's not compilable VB.NET syntax, but hopefully it's good reading. Welcome!

The curse of being both a software developer (VB6 + ASP for 2 years, then C# for 5 years, and now VB.NET for the last 2 years), and also being a database guy is that:
  1. You can theoretically build any software, so you're critical of anything that doesn't quite stack up or is not the way you'd do it if you were writing the application
    ... and ...
  2. You are wary of someone else owning your data
These two items have been a powerful force keeping me from blogging - that is until now. Now that tweeting is all the rage and blogging is so 2005, I'm doing it anyway and I'm starting now. Even though I'm not blogging with software I personally wrote. Even though the data isn't housed in a database that I run. Why? Consider these facts:

  1. I like to write
  2. I do not write
  3. I wish that I would write
I have things to write about, things to share with others, things that need to stream out of my brain, things I want to analyze, and things that I want to remember through writing my future self notes about my present self. But, writing isn't easy or convenient or insert-other-excuses-here. So, it's time to banish the disconnects and come to the painful realization that "good enough is good enough". In other words, if I wait for perfection to write, I'll not write until I reach heaven. That's just not working for me any longer, so I hope to make 'Public Shared Life As Me' a habit. Here goes nothing...