Sunday, October 07, 2012

Forgiveness Revisited


A few years ago I wrote up this post about what the Bible says of forgiveness. Last week I came across the original notes for that blog post.

At the time I admit I was desperate for answers. My life had taken a dark turn--my ex and I were in the midst of vindictive divorce proceeding after a lengthy separation, during the midst of which I had said and done things that were indeed shameful. I saw my daughter less than 8 hours a week and I felt deeply, deeply hurt and full of anger. Some nights would find me spewing rage-filled words at the walls of my bedroom, imagining that my ex was actually present and receiving her just desserts.

Hardly the charitable and forgiving attitude that Jesus calls us to.

It feels strange to me that one of my instincts at the time was to want to forgive. I actually became obsessed with learning how to. In some cases it was because I wanted to justify myself. After all, if my ex held enough against me to divorce me, then clearly I could be a better Christian than that. I wanted to be right in my stance, even going so far as to use forgiveness as a weapon to achieve that.

It was pure poison and I knew it. However, I also knew the rage and pain were just as poisonous. Somehow, the instinct to forgive was the right one despite all else I was forced to work through first. By the grace of God, the desire to forgive and to forgive in the right way has long since won out over any desire to justify myself over my ex or to condemn her.

Knowing Christ as champion sets one free to move beyond anger, hate, pain, and self-righteousness. Ultimately, all sin is a direct affront to His holiness, no matter who commits it. If one sins against me, they will have Christ to reckon with. If I sin against another, then I am under His judgment.

And He does not let sin pass (Heb. 10:29-31).

The beauty of this, however, is that Christ's sacrifice on the cross sets us free from this condemnation of sin (Rom. 6:23). Accepting Christ as one's savior and Lord also makes Him our advocate and our defender. If that is what we truly have, then we have a freedom above all other freedoms. We are free to endure affront with kindness and love because that matter is either under God's justice or under His grace. What's more, we are called to use that freedom to glorify God (1 Pe 2:16-17).

I have been told that forgiveness is ultimately for oneself. To some degree, forgiveness does benefit the forgiver. But even more important than that is how forgiveness removes the human-wrought aura of shame from the perpetrator. There are few greater testimonies we as human beings can give to the depths of Christ's love than to extinguish our shameful glances, our hurtful words, and our condemning silences. Not only did Christ endure pain and anguish on the cross; he also endured shame in our stead (Heb 12:2). By choosing to forgive, we model what Christ has done for us to that other person (1 Pe 2:21-24). For the person receiving that forgiveness, it removes the fear that confession will only result in condemnation. Forgiveness does not wait for repentance first; it lays repentance's foundation. It assures the perpetrator that God's grace is real and that it indeed has the power to destroy sin (2 Co 2:5-11).

So where does that leave things, three years later? Well, I had a lot of forgiving to do. I had to learn to forgive myself and learn to forgive my ex. Even now, I'm not really sure of the best way to tell her that I've forgiven her. Gone are the dark nights of rage, the sense of self-righteousness, or the feelings of victimhood. My hope now is for others, including my ex, to know the peace that I now do.

I pray that one day God will help me do so.

Tuesday, July 31, 2012

Running NUnit against 32-bit, .NET 3.5 assemblies


I recently ran across a problem at work with the latest version of NUnit's GUI test runner and its VS2010 plug-in.

No matter what I tried, the test would either fail to load (see the dialog box below) or one of them would consistently throw the following exception:

System.IO.FileLoadException : Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration information.”

The culprit turned out to be a set of referenced assemblies that still target the 32-bit, .NET 3.5 framework.

So, that's easy, right? Just recompile the referenced assemblies to target .NET 4 and upgrade the targeted platform to x64 in Visual Studio, right?

Not so right in this case.

That solution is great if you have control over the assemblies you reference. I did not and thus had to find a way to make them work.

Solution Part #1: Run the 32-bit version of NUnit.
This should seem like a no-brainer, except for one very important detail.

nunit.exe is  a 64-bit app. Like any installation of a 64-bit app on a 64-bit system, all the Windows shortcuts target the 64-bit executable.

However, unlike a 64-bit app, NUnit installs itself in the "Program Files (x86)" file folder.

Thankfully, the 32-bit nunit-x86.exe is included. Once I redirected all my shortcuts to this file, I was able to load the test assemblies.


Solution Part #2: Add the necessary runtime and startup elements to the NUnit config files.
Once all my tests loaded I thought I had it made. Everything started along swimmingly until one of my tests began to fail, and fail consistently, with the "FileLoadException" mentioned above.

This was a head-scratcher. Every other test passed without trouble; it was just one test. Nothing was out of the ordinary in terms of the assemblies referenced by its test class.

Further research indicated that users of the the System.Data.SQLite assembly frequently encountered this exception in .NET 4 environments (such as my test assemblies).

System.Data.SQLite was in my referenced assemblies. Given what I knew at the time about our code base, I knew that it was used in some situations, but not all. After examining my test closely and stepping through some of the referenced code with a decompiler, it turned out the SQLite assembly was indeed the culprit.

So why did the SQLite assembly cause problems while the other references had no issues? The answer is actually in the exception message:

"Mixed mode assembly is built ..."

What is a mixed mode assembly? Simply put, it's a code assembly that contains both non-native, managed code (the kind of code you would generally code in, like C#, C++, or C) and native x86 instructions (really low-level stuff).

A brief scour of the internet gave me a solution--replace the SQLite assembly with one specifically targeting .NET 4.0.

Sound familiar?

In this case, three strikes were against me. I attempted to run code
  1. in a .NET 4-targeted test project and .NET 4 environment
  2. with an assembly that contained native x86 instructions while on an x64 system
  3. which required assemblies targeting an earlier version of .NET.

Even worse, I had control over none of the target frameworks. Once you've established the target framework for your test projects, you can't downgrade it.

Thankfully, one of the posts on the Logos Code blog provides the solution. It’s specific to MbUnit, but the fix also works for NUnit as well. Just find the nunit-x86.exe.config file in the NUnit directory and make the changes as detailed in the post.

To really be cool, though, you’ll also want to apply the fix to the NUnit runner extension for Visual Studio. To do so:
  1. Download the extension if you haven’t  (Tools => Extension Manager => Online Gallery => Search ‘NUnit’ => Download).
  2. Close Visual Studio.
  3. Navigate to ‘C:\Users\%USERNAME%\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\Tommi Laukkanen %2F BubbleCloud.org\Visual Nunit 2010\1.2.4’.
  4. Create two new config files, “Visual NUnitRunner.exe.config” and “Visual NUnitRunner32.exe.config” and save them in the above directory.
  5. Restart Visual Studio.

Not only will that help ensure backwards compatibility of your GUI test runner, it will help ensure it for the extension as well.

Tuesday, June 26, 2012

Faithlife Study Bible—A New Way to Study Scripture


I don't often use my blog for promotions, but I'm shamelessly plugging this since I was involved in its development.

My employer, Logos Bible Software, has developed a study Bible like no other. The Faithlife Study Bible is entirely electronic, taking full advantage of what this unique medium has to offer.

  • Constant growth. Currently at 1.4 million words of notes and articles with more still to be added!
  • Tailored layers of depth. Contains three layers of study notes:


    • Quick Study layer—for quick, "at a glance" study.
    • Background layer—for more extensive background.
    • Scholarly layer—for in-depth, scholarly treatment from other popular Bible reference works (accessed via your Logos Library).


  • More than just words. Comes with nearly 400 photos, videos, and infographics (and more coming!) 
  • Built-in reference dictionary. Includes a complete Bible dictionary with 2,700 articles and 1.5 million words (also still growing).
  • Integrated. Works with seven different Bible translations—including the free Lexham English Bible, a literal translation from the Greek and Hebrew (the other six are sold separately*).
  • Social Networking. Perfect for groups—you can connect with others studying with you via notes, questions, and reading plans.
  • Versatility. Works on your Android device, Kindle Fire, iPhone, iPad, Mac, or PC, as well as on Logos, Vyrso and the web.


All this makes FSB the world's most advanced study Bible.

What's more ...

It's free.

With the coupon code "TobySteele" you can get the Faithlife Study Bible at no charge. Just follow the directions below.

Enjoy Faithlife!

Get the Faithlife Study Bible:
1.        Go to http://faithlifebible.com/free
2.        Enter your coupon code
3.        Download the app
4.        Log in with your Logos.com/Faithlife.com account
5.        Enjoy the Bible!

Where to Download the App:


*ESV, NASB95, KJV, NIV, NKJV, NRSV. You can purchase them at www.logos.com.

Sunday, March 18, 2012

The Precipice of Singular Decision

We human beings really don’t understand how much our individual choices impact this world.

For example: this week, one of our top developers changed a method name in our code base. He updated all references, and only committed his code once he verified that everything worked. This developer is very talented and exceptional at his job. He was far from careless. 

However, the code base is used widely enough that his change disabled one of our product’s key features. Worse, there was nothing to hint anything was wrong—until one of us tried to access the feature.

Once we noticed the problem it took time for another developer to track down the source. It cost us. It would have cost us a lot more had we distributed the product. Hundreds of customers would have been affected and unhappy.

Amazing what only a few keystrokes can do.

Yet history is replete with moments like these: singular decisions that have far-reaching consequences.

Take the current status of the Middle East, for instance. The Arab Spring uprisings began with one man committing suicide after his vegetable cart was wrongly confiscated by the Tunisian police.

Or our own involvement in the region: only one individual is allegedly responsible for killing 16 Afghan civilians, including men, women, and children. And now our entire mission in Afghanistan is in serious jeopardy.

Not to mention the shot that began World War I, which directly led to World War II and the birth of the modern, industrialized society. One man, one pistol, one shot.

The Bible also contains several examples of small decisions with far-reaching consequences. David’s affair with Bathsheba (2 Sa 11). Solomon’s decision to marry foreign wives (1 Ki 3:1). Esau’s sale of his birthright for a bowl of stew (Ge 25:29-34). Had the devil succeeded in tempting Jesus in the desert (Mt 4:1-11; Mk 1:12,13; Lk 4:1-13), it would have been catastrophic for humanity—a catastrophe on par with Adam and Eve’s original sin (Ge 3:1-7).

Granted, these are all extreme examples of maliciousness, not the mundane blasé of everyday living. Intent doesn’t discount them—they are still small motions that changed the world.

Yet despite of our foolish decisions, God still knows how to turn them around for good. Judah’s decision to sell his brother Joseph into slavery (Ge 37:25-28) helped save thousands of lives and laid down the beginning of Judaism. David’s affair with Bathsheba produced the bloodline from which Jesus descended (Mt 1:6). Though our sin runs amok, God’s grace is still there, mitigating the damage. He remains patient with us, “because he does not want any to perish, but all to come to repentance” (2 Pe 3:9).

I can never be sure that any of my own decisions will not have far-reaching catastrophic consequences. Yet neither can I live my life in constant fear that I might hurt someone inadvertently. Every choice I make, mundane or no, affects others.

It’s almost as if God has designed our world to work this way in its fallen state. I have to trust that even in my unknown sins, God is bringing good for all. The more I understand that, the more thankful I am when he shows me grace The more patient I am when He chooses not to protect me so I can learn from my mistakes—just as any loving father would do.

It gets even better.

God clearly does not abandon us to our messes. Yet neither will he force us to live with them forever. One day, our exile will be done, and He will wipe all tears from our eyes (Re 21:4). We will truly be able to live without the chance that we might hurt others around us.

Our world will be transformed into what it was originally meant to be: humans fellowshipping with each other and with God and loving one another forever and ever.

Wednesday, March 14, 2012

LinqPad

I am really enjoying LinqPad.

It's not often that I find myself using an IDE outside of Visual Studio. If I do, it's almost always for necessity. VS is primarily geared for full-fledged application development with Microsoft-developed coding languages. There's very little (if any) support for other, open-source languages  like Python or Javascript.

VS is also cumbersome when all you need is just a quick, simple script to manipulate XML. VS requires a lot of boilerplate for even the simplest code to run.

After a while, using VS in my day job starts to feel like a repeated exercise in futile over-engineering.

Really unfortunate, since VS has many features that I've found indispensable when coding any language (auto-completion especially come to mind).

Linqpad turns out to be a solution to that. It's a best-of-both worlds compromise. And it's quickly becoming my preferred tool of choice for quick, simple scripting in C# (of which my job requires a lot).

It supports C#, the .NET framework, and Lamda expressions, which are extremely useful when using the System.XML.Linq assembly.

External assemblies are easy to reference (even easier than VS in some ways) and the full version provides auto-complete. You don't even need to create any solutions--perfect when all you need is a few lines of code.

If you're looking for some run-time debugging or testing support, Linqpad isn't really designed for that (and sometimes could really be useful--especially on those delegated MatchEvaluators!).


However, regexes are rarely the best answer for XML. It's usually faster and easier to use LinqPad with an XML DOM rather than contrive a regex for specific XML elements.

Microsoft gets credit for helping serious developers create serious applications. But LinqPad gets extra credit for giving us novice developers a leg up in doing our (hopefully temporary) day jobs well.

Thanks, LinqPad.

Friday, March 02, 2012

The Husband Hammer

It seems single men my age get hammered hard these days. Not that many of us don't deserve it.

However, I'd like to address a particular blog post I came across recently: Warning: Rant Enclosed

As a once-married, now single male, I find posts like these highly discouraging. I live in a world that expects me to be a knight, yet also bombards me with portrayals of men as clowns, idiots, hypocrites, deadbeats, abusers, perverts, and murderers. The messages of the world are negative enough, and many of us have enough reminders of how "unmanly" we are.

The Church doesn't need to add to that weight as well.

Ruth, how can you say that my reluctance to move forward in a relationship puts me "in the loser column with a capital L"?

I'm like any other human being--I still long for the togetherness and fulfillment that a marriage relationship brings. My marriage ended badly; can you blame me if I think twice before swimming again? How many other men struggle just like your sister?

Just because I may reserve myself because of recent history does not mean that I need to "grow a pair."

I understand how unworthy for a mate that I am. Further, I also understand that I could never be worthy on my own. I am a sinner (Rom. 3:23), and I could never make myself a righteous man of God (Rom. 3:10). 

There is only one who can do that. It is Christ, and Christ alone:

“And you, who were dead in your trespasses and the uncircumcision of your flesh, God made alive together with him, having forgiven us all our trespasses ...” (Col. 2:13, ESV)

I'm not interested in making myself worthy of a mate. I'm interested in the change that Christ can bring about in me. If that makes me worthy of a mate in the long run, wonderful.

Until then, please keep your peeves about men who lack initiative to yourself.

Blessings,
A man trying to heal.

Tuesday, June 30, 2009

Life and Perelandra

I realized tonight that the whole world, both in general but particularly in the sphere of social interaction, feels to me like the surface of Perelandra.

Perelandra is the title of the second book in C.S. Lewis' space trilogy. It's also the name of the planet that Ransom is transported to.

Its surface is unlike anything on Earth. It's covered with vast, endless oceans, and any land masses are little more than giant lily pads floating on the surface of the water. They swing, bob, and undulate just as the waves of the ocean do, and while they are strong enough to support Ransom's weight, it takes quite a bit of practice (and a few bouts of sea-sickness)before he is able to walk on the surface without trouble.

Interacting with people, and for the most part, much of the world, feels to me like learning how to walk on Perelandra. It's alien. It's foreign. I don't adapt well to changing situations or unfamiliar situations--I even have an almost neurotic aversion to finding junk (read: rocks, toys, etc.) under my feet. If I can't have both my feet flat on the ground, my top-heavy nature takes advantage of me.

So much of my life has been living in a sort of manufactured Earth, so to speak, where everything is familiar and comfortable, even if detrimental. I'm comfortable when I'm alone in my thoughts, even though I despise the isolation. I'm comfortable when I can be given a task and just asked to do A, B, C, D, etc. and have it all spelled out, but then that simply makes me stagnant and unwilling to grow.

I've lived so long taking my cues from others and submitting to what they want because it is comfortable. I ride the ripples made by others' steps in this crazy world, choosing to drift along. In that place, there is a minimum of risk, a minimum of effort required, and a minimum of culpability. But there is also a minimum of freedom and a minimum of enjoyment.

Some of us seem to know how to suck the marrow from life, and I'm constantly amazed at how effortless it is for them. I'm one of those who has to really work at it, and I don't find it easy. Fear is the biggest obstacle. Not so much fear of being made a fool or making mistakes, but fear of being made a fool and making mistakes forever, that I'll always be naive in the way I behave around others or in trying new things.

I don't know how someone becomes comfortable with constant change. Is it that they don't see the islands the way I do, that they feel they are walking and running on solid rock, or is it that they have mastered the Perelandra step, and are wondering why yours truly can't compensate? If the latter, I am at a loss to understand why he has such difficulty.