Many years ago I was in Baptist History class by one of my least favorite professors at Cedarville. Despite a well-earned reputation as Dr. Sominex, he said something that has stuck with me for thirty years. His words were to the effect that there is no Baptist “pope” to admit someone to or excommunicate someone from the faith. Rather that the term Baptist implies a set of beliefs and if you don’t believe those things you can’t honestly call yourself a Baptist and if you do believe them you can. He likened it to “truth in advertising.”
I recently heard of someone who criticized a Baptist church in the following story. He was asked if he’s a Baptist or not. He replied by asking, "What does it mean to be a Baptist?" I imagine that the answer was a faithful rehearsal of the Baptist distinctives: Believer’s baptism by immersion, Autonomy of the local church, Priesthood of the believer, Two ordinances of baptism and communion, Individual soul-liberty of the believer, Separation of church and state, and Two offices of pastor and deacon. In response to this, the critic said that he hadn’t heard any mention of love. And this is a valid criticism.
However, I believe that this was an unfair criticism. He was not asked if he was a Christian, but if he was a Baptist. You can be a Baptist without being a Christian, as (a century ago) the members of Fountain Street Baptist Church might testify. Moreover, Baptists, particularly Fundamentalists like me, have a reputation for being censorious. If you consider Christ’s summary of God’s law in the double-love command, this censorious attitude argues most articulately for the non-belief, the non-Christianity, of such Baptists.
The categories of “Christian” and “Baptist” are independent. But if you are a Christian, identifying yourself as a Baptist gives a picture of HOW you are a Christian. If I tell you I’m a Baptist, you’ll know my yard won’t have a half-buried bathtub holding a statue of the Blessed Virgin.
Trouble is that you may also draw some other inferences that are not accurate. I think this is why institutions like the Grand Rapids Baptist Bible College first “got rid of the Bible” and then became Cornerstone University. Instead of standing up and saying, “This is what Baptist means,” and living a positive example thereof, they ran from the word Baptist. I still think they erred.
A lot of Christians did likewise and a lot of Reformed, Presbyterian, Church of God, and other churches became “Community Worship Centers.” Each denomination can point to negatives in its reputation. Certainly an irenic spirit is a Good Thing within Christianity and the blurring of denominational partisan identities takes a step in that direction.
I can see why you might not want truth in advertising. If you’re trying to sell your religion to me, and you make some vague spiritual representation, I’ll be naturally inclined to probe what exactly you believe. The premise is that this will get the proselytizing off to a better start than if you identify denominational pigeon-holes up front. I don’t buy it.
First, you can be partisan without being a jerk about it. If you tell me you’re Catholic or Reformed and I tell you I’m a Baptist up front, we’ve got our theological cards on the table and I’ve got a conceptual framework with which I can lovingly relate to you. I’ll know where the sore points are and can handle them tactfully. I’ll know the things I cannot take for granted. The denominational categories are the result of millennia of careful thought about the theological issues in play and ought not be discarded because of some bozo’s bad example.
And then there are the intentional misrepresentations of the enemy. You know, the Father of Lies. Do we act as if the devil’s slanders are true by running? Think of the word “puritanical.” We commonly identify this adjective with a priggish, humorless sort that bears no resemblance to the Puritanism of Milton or Bunyan. I'm sorry, but the most humorless person I know is emphatically not a Puritan.
So, with this in mind let me remind everyone: I am a Christian. What sort of Christian am I? I am a Baptist. What sort of Baptist am I? I’m a Calvinist. What sort of Calvinist am I? I am a Puritan. What do I mean by this? You can find book definitions for all these things that'll give you a good starting point. After that you’ll have to watch me. If you think my life works and want to know its theoretical framework, those labels will tell you where to look.
Sunday, June 24, 2007
Thursday, June 14, 2007
I don't even like opera
This is funny. I ran across, I don't know how, a YouTube video clip of this British TV show. It's a British spin-off of American Idol. I've never watched American Idol. I respond politely when others say nice things about it and I have made snarky remarks about Sanjia (though I've never seen him). I figure anything on "reality" TV is going to be contrived and stupid. So, I clicked on the movie and started watching, wondering what was up. Is this some kind of joke? some ironic bit of trash where some bozo makes a fool of himself in front of a TV audience?
The video showed this rather dumpy looking fellow (and I figure that TV makes anyone who's not stunningly attractive look dumpy) in a cheap suit, bad hair, and unfortunate teeth that is too common in Britain. The judges looked bored and skeptical and asked him what he wants to do. He said he'd like to do opera. The judges did not visibly roll their eyes, but I got that vibe.
Then the fellow started singing. But first, I forgot to mention how much I absolutely despise opera. So, the guy starts singing and I'm waiting for a gag.
There's no gag. This guy is incredibly good. The first clue I got was watching the judges, particularly the female judge Amanda Holden. She's struggling to contain her emotions. I did recognize the Puccini tune and I realize this dumpy looking guy is singing this as well as I've ever heard it sung. The judges were utterly impressed. Somehow, and I don't know how, I was moved to tears by the fellow's singing. I don't understand that. I replayed the video a half-dozen times and a stack of soggy kleenexes piled up a dozen deep.
Then I want looking for more info about this guy. I found a half-dozen posts with the video embedded, usually with the introduction, "I don't even like opera, but..." Then it struck me, an utterly incredible degree of talent trumps distaste for reality-tv or opera. The fellow's name is Paul Potts, and I hope we'll be hearing more of him.
The video showed this rather dumpy looking fellow (and I figure that TV makes anyone who's not stunningly attractive look dumpy) in a cheap suit, bad hair, and unfortunate teeth that is too common in Britain. The judges looked bored and skeptical and asked him what he wants to do. He said he'd like to do opera. The judges did not visibly roll their eyes, but I got that vibe.
Then the fellow started singing. But first, I forgot to mention how much I absolutely despise opera. So, the guy starts singing and I'm waiting for a gag.
There's no gag. This guy is incredibly good. The first clue I got was watching the judges, particularly the female judge Amanda Holden. She's struggling to contain her emotions. I did recognize the Puccini tune and I realize this dumpy looking guy is singing this as well as I've ever heard it sung. The judges were utterly impressed. Somehow, and I don't know how, I was moved to tears by the fellow's singing. I don't understand that. I replayed the video a half-dozen times and a stack of soggy kleenexes piled up a dozen deep.
Then I want looking for more info about this guy. I found a half-dozen posts with the video embedded, usually with the introduction, "I don't even like opera, but..." Then it struck me, an utterly incredible degree of talent trumps distaste for reality-tv or opera. The fellow's name is Paul Potts, and I hope we'll be hearing more of him.
Tuesday, June 05, 2007
Men Without Chests
I just read a snippet of a story on one of the milblogs. Seems that some 65 year old former cop and a retired Marine had to get physical with a guy on an airplane and his brother. That a situation that you hear about and hope to God you've got what it takes to do the right thing if you're ever there. The contemporary term is "onions" or "balls," but I prefer C.S. Lewis' term in his essay, "Men Without Chests." There's something about the empty suit that says more about a man than mere gelding.
We read from various places people complaining of how boys are raised to be sissies and that men are no longer manly. Lewis sussed it. When man is the measure of all things, nothing is big enough to be worth risking your life over. This hollows a man out and he's pretty much worthless. I have nothing but scorn for the protester who engages in civil disobedience and then complains that he felt threatened by the authorities. Socrates was man enough to drink the hemlock. He was a man with a chest.
What's most discouraging about this story was when the cop said, "I had looked around the plane for help, and all the younger guys had averted their eyes." Maybe all the young guys with chests must be in Iraq & Afghanistan.
We read from various places people complaining of how boys are raised to be sissies and that men are no longer manly. Lewis sussed it. When man is the measure of all things, nothing is big enough to be worth risking your life over. This hollows a man out and he's pretty much worthless. I have nothing but scorn for the protester who engages in civil disobedience and then complains that he felt threatened by the authorities. Socrates was man enough to drink the hemlock. He was a man with a chest.
What's most discouraging about this story was when the cop said, "I had looked around the plane for help, and all the younger guys had averted their eyes." Maybe all the young guys with chests must be in Iraq & Afghanistan.
Saturday, June 02, 2007
"Homegrown" Terrorist Plots
I just read a news story about a plot by four individuals named, Russell Defreitas, a U.S. citizen native to Guyana, Abdul Kadir of Guyana, Kareem Ibrahim of Trinidad, and a fourth man, Abdel Nur. Mr. Nur is reported to be a former member of the Parliament of Guyana.
Strangely, WNBC in New York said, "The arrests mark the latest in a series of alleged homegrown terrorism plots targeting high-profile American landmarks."
Does this mean that that WNBC considers Guyana and/or Trinidad to be "home."
Strangely, WNBC in New York said, "The arrests mark the latest in a series of alleged homegrown terrorism plots targeting high-profile American landmarks."
Does this mean that that WNBC considers Guyana and/or Trinidad to be "home."
Monday, May 28, 2007
Good Riddance Attention Whore
Mrs. Cindy Sheehan has given the American serviceman a gift this Memorial Day. In a post on the Daily Kos, she has announced that she's not going to be using the corpse of her dead son as a publicity stunt any more.
It is ironic that she should now announce her departure from public life, because her 15 minutes of fame elapsed long ago. Sadly, I doubt she'll have the character to keep her promise. Perhaps, she's hoping enough folks like myself will notice her announcement to grant her another 15 minutes.
When Mrs. Sheehan made this announcement, she entitled her post on the Daily Kos, "Good Riddance Attention Whore." The ancient Greeks had an aphorism that came to mind when I read that she had put that title on her farewell essay, γνῶθι σαυτόν.
It is ironic that she should now announce her departure from public life, because her 15 minutes of fame elapsed long ago. Sadly, I doubt she'll have the character to keep her promise. Perhaps, she's hoping enough folks like myself will notice her announcement to grant her another 15 minutes.
When Mrs. Sheehan made this announcement, she entitled her post on the Daily Kos, "Good Riddance Attention Whore." The ancient Greeks had an aphorism that came to mind when I read that she had put that title on her farewell essay, γνῶθι σαυτόν.
Sunday, April 29, 2007
Stop Watches and Yardsticks
Recently, I've had occasion to reflect upon one of the initiatives at work. Managers would like to measure what the workers do. Its a two-edged sword. On the one hand, there's the Big Brother aspect that we've been assured is not the case. On the other hand, you can't improve if you don't measure.
I build software. If, instead, I were to dig ditches, we could easily measure the volume of dirt displaced. But what metrics does one apply to the construction of software? Lines of code? Bug Reports? Cyclometric complexity statistics?
Last Tuesday, John Cunningham of Band XI spoke at the West Michigan XP group and described some of his frustrations doing XP within IBM. He would faithfully deliver the numbers to his higher ups that they requested and know they were utterly misleading. I knew exactly what he meant, because I've done the same.
You record the time spent doing tasks and what gets lost is the utter non-value spent in some of those tasks and the absolute priceless-ness of chance encounters that come and go in two minutes. The former are reported to management and the latter are not. They serve to push management a step away from reality.
In short, I object to measurements that mislead, or can be gamed. Once I understood this I sought a metaphor that I could use to communicate what I have in mind. Consider a track meet, what measurement tools are used there? Some officials carry around stop watches and other officials carry tape measures.
In particular, consider the high jump competition. You set the bar a measured distance above the ground and the best athlete is the one who doesn't knock it down. You measure this performance with a tape measure.
But suppose an official who's been watching footraces all day comes along with stop watch and no tape measure. He's perplexed until he notes that the guy who jumps highest also stays off the ground longest. He decides to measure the athlete's performance with just a stop watch.
What would happen then? The athletes would jump differently. But would they jump higher? Subtly, the fact that the measurement has changed will change the way the athletes jump. I don't think those changes will result in higher jumps. Performance suffers due to using the wrong measurement.
It seems silly to measure the high jump this way, but suppose you had lots of cheap stop watches and only a few expensive yardsticks. Or suppose you don't understand the field of endeavor well enough to see how yardsticks are better than stop watches.
Conversely, it'd be silly to take a yardstick or tape measure to a footrace.
So, I'm not saying "don't measure." I'm saying that you have to understand what you're doing well enough to select the correct measurement.
And you have to use, and not misuse the correct measurement.
Let's go back to the Big Brother consideration I touched on earlier. In the UK there is now one video surveillance camera for every 14 people. Those cameras are in place to "catch" wrongdoing. Contrast this with a training context where your coach videotapes your jump to analyze your form, a one frame at a time. He's got a purpose that you and he agree upon. He's not out to "catch" anything except those things you want to correct in order to jump higher. He's your Coach, not your Policeman.
Do you see a cop with a radar gun? Slide into something's radar shadow and decelerate. Then look at your speedometer. You change your behavior so he won't "catch" you speeding even when you're doing nothing wrong.
The relationship between Big Brother and those under his thumb is adversarial, whereas the relationship between Coach and athlete is cooperative. The fact that "Big Brother" even comes to mind speaks volumes of the culture of an organization.
Measurement in an adversarial context is a negative-sum game. In this context, everyone is encouraged by the system to replace reality (that might cast me or my political allies in a negative light) with whatever figures we can spin into a Potemkin village filled with smiling happy peasants, each tugging on their forelocks as the Empress sails by.
The cultural question probably hinges upon a question to the measurement taker that John Cunningham raised last Tuesday: "Do I want to know what's going on, or do I want to impose my will upon the situation?"
I build software. If, instead, I were to dig ditches, we could easily measure the volume of dirt displaced. But what metrics does one apply to the construction of software? Lines of code? Bug Reports? Cyclometric complexity statistics?
Last Tuesday, John Cunningham of Band XI spoke at the West Michigan XP group and described some of his frustrations doing XP within IBM. He would faithfully deliver the numbers to his higher ups that they requested and know they were utterly misleading. I knew exactly what he meant, because I've done the same.
You record the time spent doing tasks and what gets lost is the utter non-value spent in some of those tasks and the absolute priceless-ness of chance encounters that come and go in two minutes. The former are reported to management and the latter are not. They serve to push management a step away from reality.
In short, I object to measurements that mislead, or can be gamed. Once I understood this I sought a metaphor that I could use to communicate what I have in mind. Consider a track meet, what measurement tools are used there? Some officials carry around stop watches and other officials carry tape measures.
In particular, consider the high jump competition. You set the bar a measured distance above the ground and the best athlete is the one who doesn't knock it down. You measure this performance with a tape measure.
But suppose an official who's been watching footraces all day comes along with stop watch and no tape measure. He's perplexed until he notes that the guy who jumps highest also stays off the ground longest. He decides to measure the athlete's performance with just a stop watch.
What would happen then? The athletes would jump differently. But would they jump higher? Subtly, the fact that the measurement has changed will change the way the athletes jump. I don't think those changes will result in higher jumps. Performance suffers due to using the wrong measurement.
It seems silly to measure the high jump this way, but suppose you had lots of cheap stop watches and only a few expensive yardsticks. Or suppose you don't understand the field of endeavor well enough to see how yardsticks are better than stop watches.
Conversely, it'd be silly to take a yardstick or tape measure to a footrace.
So, I'm not saying "don't measure." I'm saying that you have to understand what you're doing well enough to select the correct measurement.
And you have to use, and not misuse the correct measurement.
Let's go back to the Big Brother consideration I touched on earlier. In the UK there is now one video surveillance camera for every 14 people. Those cameras are in place to "catch" wrongdoing. Contrast this with a training context where your coach videotapes your jump to analyze your form, a one frame at a time. He's got a purpose that you and he agree upon. He's not out to "catch" anything except those things you want to correct in order to jump higher. He's your Coach, not your Policeman.
Do you see a cop with a radar gun? Slide into something's radar shadow and decelerate. Then look at your speedometer. You change your behavior so he won't "catch" you speeding even when you're doing nothing wrong.
The relationship between Big Brother and those under his thumb is adversarial, whereas the relationship between Coach and athlete is cooperative. The fact that "Big Brother" even comes to mind speaks volumes of the culture of an organization.
Measurement in an adversarial context is a negative-sum game. In this context, everyone is encouraged by the system to replace reality (that might cast me or my political allies in a negative light) with whatever figures we can spin into a Potemkin village filled with smiling happy peasants, each tugging on their forelocks as the Empress sails by.
The cultural question probably hinges upon a question to the measurement taker that John Cunningham raised last Tuesday: "Do I want to know what's going on, or do I want to impose my will upon the situation?"
Wednesday, April 11, 2007
std::min and std::max versus Visual Studio
Recently, months back I wrote a wicked-cool solution using boost to encode binary data as base64. Sadly, it would not compile, b/c Microsoft did something evil in Windows.h when they defined min() and max(). I'd seen this problem and coded around it before. So I modified the boost code that broke:
C:\dev\sdk\boost_1_32_0\boost\archive\iterators>svn diff
Index: transform_width.hpp
===================================================================
--- transform_width.hpp (revision 201)
+++ transform_width.hpp (working copy)
@@ -142,7 +142,7 @@
}
else
bcount = BitsIn - m_displacement;
- unsigned int i = std::min(bcount, missing_bits);
+ unsigned int i = min(bcount, missing_bits);
// shift interesting bits to least significant position
unsigned int j = m_buffer >> (bcount - i);
But was this the most righteous solution?
Just last week I had to code away from a righteous std::numeric_limits::max() to the less righteous INT_MAX for the exact same reason. Today, this problem recurred. I had a choice between committing my change to boost, or powering through the problem. "OK, Microsoft, you've exceeded your kluge allocation."
The real problem isn't in boost, but in Visual Studio. This sent me googling to this link that said:
Therefore, I REVERTED my change to transform_width.hpp. Since I do not #include it doesn't matter where I #define NOMINMAX, so I put it in my project file's manifest of #defines.
It works and I feel more righteous.
C:\dev\sdk\boost_1_32_0\boost\archive\iterators>svn diff
Index: transform_width.hpp
===================================================================
--- transform_width.hpp (revision 201)
+++ transform_width.hpp (working copy)
@@ -142,7 +142,7 @@
}
else
bcount = BitsIn - m_displacement;
- unsigned int i = std::min(bcount, missing_bits);
+ unsigned int i = min(bcount, missing_bits);
// shift interesting bits to least significant position
unsigned int j = m_buffer >> (bcount - i);
But was this the most righteous solution?
Just last week I had to code away from a righteous std::numeric_limits
The real problem isn't in boost, but in Visual Studio. This sent me googling to this link that said:
The Standard Library defines the two template functions std::min() and std::max() in theheader. In general, you should use these template functions for calculating the min and max values of a pair. Unfortunately, Visual C++ does not define these function templates. This is because the names min and max clash with the traditional min and max macros defined in . As a workaround, Visual C++ defines two alternative templates with identical functionality called _cpp_min() and _cpp_max(). You can use them instead of std::min() and std::max().To disable the generation of the min and max macros in Visual C++, #define NOMINMAX before #including .
Therefore, I REVERTED my change to transform_width.hpp. Since I do not #include
It works and I feel more righteous.
Sunday, April 08, 2007
Viewer Discretion Required
I just walked into the family room and the TV was already on. Before the next show came on the warning appeared, "Viewer Discretion Required." The show consisted of videos of people doing stupid things and flamboyantly and visually paying the price for it.
It became obvious that viewer discretion may be required, but for the photographer and the photograph-ee, discretion was pretty much absent.
It became obvious that viewer discretion may be required, but for the photographer and the photograph-ee, discretion was pretty much absent.
Friday, April 06, 2007
C++ Templates Are Wizardry
I had to make a fix to a C++ program, and instead of doing the same old thing I had done before, I decided to effect a righteous STL/Boost standard solution. Here's the problem, I had a bunch of named objects and I needed to store them someplace.
I had a map and it worked until my boss asked, "is it case insensitive? does it ignore suffixes?" "No, should it?" "Yes & yes."
Though you wouldn't normally think of it, map requires a comparator to function. C# calls the same thing a sorted list, b/c they don't hide the fact that in order to work, the data structure has to be sorted on keys, and this comparator keeps the keys in sorted order. This comparator was what I needed to make my map work.
If I have two equivalent keys "Thing" and "thing.subthing" and want them to map to the same value, I can do so with a comparator function. Simply declare my map as map and then define a comparator functor that ignores the things like case and the stuff after the suffix character. The first part was a simple Boost exercise:
class comparator
{
public:
bool operator()(const string& s1, const string& s2) const
{
string t1(s1);
string t2(s2);
transform (t1.begin(),t1.end(),t1.begin(), tolower);
transform (t2.begin(),t2.end(),t2.begin(), tolower);
//(more goes here later)
return t1 < t2;
}
};
The boost string algorithm is the way to go here. You should make it your friend. This handles the string insensitive part. If that's all you need. You're done.
Note: you MUST implement a LESS THAN function or the std::map template won't work.
I had to ignore all the stuff to the right of the decimal point. So, I added the following bit:
size_t dot1 = t1.find(".");
size_t dot2 = t2.find(".");
if (dot1!=string::npos)
{
t1 = t1.substr(0,dot1);
}
if (dot2!=string::npos)
{
t2 = t2.substr(0,dot2);
}
I was a little disappointed with this solution. I had hoped to just adjust the end iterators of the transform() calls above. However, it got gnarlie and harder to understand than this. If you know how can replace the transform() call with something using a back_inserter(), let me know.
After I got this working, I was impressed at how unhelpful the compiler and the language were in diagnosing the errors I'd made. I mentioned to a colleague that templates are the greatest thing ever invented, but they require a wizard to use gracefully. He agreed and suggested that if I did this every day, I'd be more efficient at diagnosis. He's right. When you work with something every day, you grok the philosophy of why things work, and you get a feel for why unhelpful compiler error messages say what they do.
I had a map
Though you wouldn't normally think of it, map requires a comparator to function. C# calls the same thing a sorted list, b/c they don't hide the fact that in order to work, the data structure has to be sorted on keys, and this comparator keeps the keys in sorted order. This comparator was what I needed to make my map work.
If I have two equivalent keys "Thing" and "thing.subthing" and want them to map to the same value, I can do so with a comparator function. Simply declare my map as map
class comparator
{
public:
bool operator()(const string& s1, const string& s2) const
{
string t1(s1);
string t2(s2);
transform (t1.begin(),t1.end(),t1.begin(), tolower);
transform (t2.begin(),t2.end(),t2.begin(), tolower);
//(more goes here later)
return t1 < t2;
}
};
The boost string algorithm is the way to go here. You should make it your friend. This handles the string insensitive part. If that's all you need. You're done.
Note: you MUST implement a LESS THAN function or the std::map template won't work.
I had to ignore all the stuff to the right of the decimal point. So, I added the following bit:
size_t dot1 = t1.find(".");
size_t dot2 = t2.find(".");
if (dot1!=string::npos)
{
t1 = t1.substr(0,dot1);
}
if (dot2!=string::npos)
{
t2 = t2.substr(0,dot2);
}
I was a little disappointed with this solution. I had hoped to just adjust the end iterators of the transform() calls above. However, it got gnarlie and harder to understand than this. If you know how can replace the transform() call with something using a back_inserter(), let me know.
After I got this working, I was impressed at how unhelpful the compiler and the language were in diagnosing the errors I'd made. I mentioned to a colleague that templates are the greatest thing ever invented, but they require a wizard to use gracefully. He agreed and suggested that if I did this every day, I'd be more efficient at diagnosis. He's right. When you work with something every day, you grok the philosophy of why things work, and you get a feel for why unhelpful compiler error messages say what they do.
Tuesday, April 03, 2007
A Righteous Way To Get The Fonts Directory
Some months ago, I had a bit of a problem where I had to write a program that went to the system fonts directory on a Windows machine. This is usually in "C:\Windows\Fonts" but on some machines the Windows directory can move.
Thus, after a bit of googling I came up with this code that worked consistently until this afternoon.
string result = System.Environment.ExpandEnvironmentVariables("%WinDir%");
result += "\\fonts\\";
This works because on Windows systems, you can find the WinDir environment variable set to the system directory. That quit working today when I encountered a weird interface problem with an ancient C++ program (written well over 10 years ago) that invokes a new, cool .NET program that uses the code above. The failure was an interesting one.
The old C++ code looks like this: (Maybe you can see what the problem was.)
loadParms.segEnv = 0;
loadParms.lpszCmdLine = commandLine;
loadParms.lpShow = show;
loadParms.lpReserved = NULL;
HINSTANCE hinst = LoadModule(exeName, &loadParms);
The loadParms struct has a segEnv handle that references the environment of the child process created by the LoadModule(). However, since it is not initialized to anything, the child process has NO environment defined. Thus the reference to %WinDir% gets nada instead of the correct directory. The newer program worked fine from the DOS command line and failed within the LoadModule() call above. This was the only clue to my problem.
I came into my boss's office chuckling about how the old system goofiness had screwed me over and pointed out the use of the %WinDir% environment variable. He countered that what I'd done above to use %WinDir% in the first place was not as righteous as using the various Environment.SpecialFolder methods/properties to get the same thing. I'd tried to do this months back and I'd failed to google up a better solution than the one using %WinDir%.
But I'd forgotten my earlier failure to find a more righteous solution. It took me a couple hours of googling to remember that I'd done this before without success. Happily, this time, I didn't give up and came upon the clues that yielded this snippet of code:
///
/// get system font path
///
///system font path
static public string GetFontPath()
{
string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
string result = Path.GetDirectoryName(systemPath)
+ Path.DirectorySeparatorChar
+ "FONTS"
+ Path.DirectorySeparatorChar;
return result;
}//GetFontPath()
This works in two parts, the Environment.SpecialFolder.System gets me to C:\Windows\System32, which is too deep in the directory tree for me. But the 2nd step, invoking Path.GetDirectoryName(systemPath), strips off the "\System32" that is in my way. Then I can add back the FONTS myself.
A righteous hack. I hope this will make the next guy's googling a little easier.
Thus, after a bit of googling I came up with this code that worked consistently until this afternoon.
string result = System.Environment.ExpandEnvironmentVariables("%WinDir%");
result += "\\fonts\\";
This works because on Windows systems, you can find the WinDir environment variable set to the system directory. That quit working today when I encountered a weird interface problem with an ancient C++ program (written well over 10 years ago) that invokes a new, cool .NET program that uses the code above. The failure was an interesting one.
The old C++ code looks like this: (Maybe you can see what the problem was.)
loadParms.segEnv = 0;
loadParms.lpszCmdLine = commandLine;
loadParms.lpShow = show;
loadParms.lpReserved = NULL;
HINSTANCE hinst = LoadModule(exeName, &loadParms);
The loadParms struct has a segEnv handle that references the environment of the child process created by the LoadModule(). However, since it is not initialized to anything, the child process has NO environment defined. Thus the reference to %WinDir% gets nada instead of the correct directory. The newer program worked fine from the DOS command line and failed within the LoadModule() call above. This was the only clue to my problem.
I came into my boss's office chuckling about how the old system goofiness had screwed me over and pointed out the use of the %WinDir% environment variable. He countered that what I'd done above to use %WinDir% in the first place was not as righteous as using the various Environment.SpecialFolder methods/properties to get the same thing. I'd tried to do this months back and I'd failed to google up a better solution than the one using %WinDir%.
But I'd forgotten my earlier failure to find a more righteous solution. It took me a couple hours of googling to remember that I'd done this before without success. Happily, this time, I didn't give up and came upon the clues that yielded this snippet of code:
///
/// get system font path
///
///
static public string GetFontPath()
{
string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
string result = Path.GetDirectoryName(systemPath)
+ Path.DirectorySeparatorChar
+ "FONTS"
+ Path.DirectorySeparatorChar;
return result;
}//GetFontPath()
This works in two parts, the Environment.SpecialFolder.System gets me to C:\Windows\System32, which is too deep in the directory tree for me. But the 2nd step, invoking Path.GetDirectoryName(systemPath), strips off the "\System32" that is in my way. Then I can add back the FONTS myself.
A righteous hack. I hope this will make the next guy's googling a little easier.
Sunday, April 01, 2007
Write It Now: Relationships
The kind folks who wrote WriteItNow recently sent an evaluation copy to a writers' group that I attend. Since I'm the geekiest fellow there, I snarfed it up and promised to write up a review.
This isn't that review. It's more of a first impression. Just one aspect that I have some opinions upon: Relationshps.
WriteItNow lets you define characters in your novel. I'm working through that right now. Each character has a description, relationships, and personality. The description is just plain flat text, with a drop-down box for sex. This could be improved by adding some structure for eye-color, hair color, height and other physical attributes common to everyone. The Date Of Birth would be better replaced, or perhaps augmented, with an age when story takes place. When I am designing a story, I like to think of it in terms of "today" or "five years from now." If you have in mind to use historical figures in your novel, the Date Of Birth feature will serve you well.
Each character can have a collection of relationships. When you define a relationship, you get a dialog that has two drop downs. The first specifies the nature of the relationship: it says "wife of", "husband of", "aunt of", "neice of" and so on for about 27 choices. When I entered the first relationship, this was a problem, because I wanted the character to be the "tutor of" another character. Not in the list. Hmmmmm. No "mentor of" or "protégé of" either.
Only later did I discover the drop-down let me type in anything I wanted if it was missing from the drop-down.
A nice touch is that relationships can have "start" and "end" dates. But my complaint about birth dates applies here, too. Instead of saying that Chaz and Kim were married 3 years before Kim files for divorce, I have to specify some Saturday in June 2004 and some Wednesday in March 2007. Some specificity is good, but I'd like to hang loose on some details before I make other design decisions.
So, I started defining relationships between characters. And I noticed another problem. If I said, that Kim was the wife of Chaz, it didn't automatically say that Chaz was the husband of Kim. I saw this was a potential difficult thing to put into a program. For instance, if I say that Art is a lover of Jennifer, Jenifer may not be a lover of Art: she might just be stringing him along.
But just now a solution occurred to me. In the bowels of the source code for Write It Now, there must reside a software entity, (called a class) named something by the programmer. I'll name it "Relationship" for now. This class would be responsible for holding everything associated with a Relationship between two characters. Right now, I suppose it holds a string that specifies the type of relationship (e.g. "husband of"), two date objects for start & end, and a reference to a Character object. I here propose a refactoring of that object. Replace the string that identifies the type of relationship with a RelationshipType object.
The relationship type object I'm proposing has a boolean attribute: Reciprocal. Some relationships are reciprocal, others are not: e.g. Chaz is a husband of Kim and Kim is a wife of Chaz, but Art is a lover of Jennifer, but Jennifer has no such relationship with Art. With this distinction in mind, the programmer can associate reciprocal relationships automatically. When I add a "husband of" relationship between Chaz and Kim, it creates a reciprocal relationship "wife of" between Kim and Chaz. If I change my mind and want to I delete a reciprocal relationship, the software must goto the other character and delete its reciprocal relationship, too.
If you buy into the notion of a reciprocal relationship, you also have to worry about the polarity of that relationship. When I look at a relationship between Chaz and Kim from the perspective of Chaz, I want to see "husband of" and when I look at Kim's relationships, I should see "wife of". In graph-theoretic terms, reciprocal relationships are "directed" arcs between characters and this notion of polarity or direction, captures this distinction.
This would entail updating the Edit Relationship dialog to add a checkbox for Reciprocal or not. And also a "polarity" flag to select between "husband of" and "wife of" when displaying the relationship.
This also has an impact on the Relationship drop-down. I don't think free text in the combobox works any more. Instead it has to enumerate all the known relationships plus one called "other" selecting other would bring up a dialog where one defines:
While writing this, it occurred to me that the WriteItNow folks would also do well to refactor their Date object. Sometimes dates are important to know exactly, other times exactitude is a disraction or should just be a deferred decision. This argues for "fuzzieness" in the specification of dates. The date specifier dialog in WriteItNow have some checkboxes for Month, Day, Week Day, and BC. I'm not quite sure how these work and should start searching the documentation. (They govern presentation of the date. Bad form to confuse data entry and presentation. There's no Help button on the date specifier dialog. It's unclear how the red X is different from the Cancel button, either.)
Instead, I think every Date object needs to recognize the distinction between absolute and relative times. Absolute times are points like 2:57 pm GMT June 2, 1934. Relative times are points like 5 years ago. Let's suppose I have in mind that Damien is 13 when the story takes place. If I write the story is to take place "now," his birthdate can't be specified absolutely. Similarly, I may want to defer decisions about how old he is exactly. I'd prefer to say Damien is between 12 and 15. When I know more, I'll narrow it down.
Same goes for absolute dates. I may want to say that an event takes place "during WW2" but I'm not sure exactly when. I had a story where my hero lost an arm (and a fiance) during a Nazi bombing attack. When exactly? I didn't know more than between 1939 and 1945. And I didn't need to know until later.
WriteItNow will do a better job if it enables the writer to capture artistic decisions in relative terms with some degree of fuzziness. Thus I think its Date object should be refactored to mind these two distinctions: absolute versus relative, and inexactitude. Relative times are tricky, I'll come back to them momentarily.
Fuzzieness can be handled by adopting intervals. Any fuzzy date is really a range between the earliest and the latest times of an event. My hero's injury starts out at [1 Sep 1939 - 2 Sep 1945]. Since my hero is an American I decide he has to be hurt after Pearl Harbor: [7 Dec 1941 - 2 Sep 1945]. So it goes, as I research and refine dates and narrow the range. Exact dates are simply zero-width intervals. In my example, these are all absolute times, but relative times may prove useful. e.g. Damien's age mentioned above.
Relative times are tricky because they are "relative to what." WriteItNow enables the writer to define events. Events seem to be the best candidate for providing reference points for relative dates. What makes them tricky is that you can have multiple narrative tracks in a story. Neal Stephenson's Cryptonomicon tracked WW2 and contemporary events in parallel, for example.
In my current story, I figure Chaz will be found dead in a locked room. (Someone named Chaz should always be found dead at some time in the story.) I figure he'll be married to Kim about 3 years before that, and she'll file for divorce about a month before that. Meanwhile, Art and Damien are establishing a love-hate relationship as tutor and student. I don't know exactly how those two narrative threads will merge. I don't want to decide that yet. I'll want to specify all Kim and Chaz events relative to each other. And i'll want to specify all Damien, Art and Jennifer events relative to themselves.
Where it gets tricky is when I try to harmonize multiple the narrative flows. I'll need to float all the dates in one narrative to let me slide it forward and back to match up with the other. And I need to check for contradictions. Like Chaz getting killed before he can insult Art at a dinner party. Thus the Date object must be made fuzzy to some extent, and must be either absolute or relative. Similarly, when events are "linked" (I haven't gotten to that part of WriteItNow yet), some kind of consistency check between them will be needed.
More on that later.
This isn't that review. It's more of a first impression. Just one aspect that I have some opinions upon: Relationshps.
WriteItNow lets you define characters in your novel. I'm working through that right now. Each character has a description, relationships, and personality. The description is just plain flat text, with a drop-down box for sex. This could be improved by adding some structure for eye-color, hair color, height and other physical attributes common to everyone. The Date Of Birth would be better replaced, or perhaps augmented, with an age when story takes place. When I am designing a story, I like to think of it in terms of "today" or "five years from now." If you have in mind to use historical figures in your novel, the Date Of Birth feature will serve you well.
Each character can have a collection of relationships. When you define a relationship, you get a dialog that has two drop downs. The first specifies the nature of the relationship: it says "wife of", "husband of", "aunt of", "neice of" and so on for about 27 choices. When I entered the first relationship, this was a problem, because I wanted the character to be the "tutor of" another character. Not in the list. Hmmmmm. No "mentor of" or "protégé of" either.
Only later did I discover the drop-down let me type in anything I wanted if it was missing from the drop-down.
A nice touch is that relationships can have "start" and "end" dates. But my complaint about birth dates applies here, too. Instead of saying that Chaz and Kim were married 3 years before Kim files for divorce, I have to specify some Saturday in June 2004 and some Wednesday in March 2007. Some specificity is good, but I'd like to hang loose on some details before I make other design decisions.
So, I started defining relationships between characters. And I noticed another problem. If I said, that Kim was the wife of Chaz, it didn't automatically say that Chaz was the husband of Kim. I saw this was a potential difficult thing to put into a program. For instance, if I say that Art is a lover of Jennifer, Jenifer may not be a lover of Art: she might just be stringing him along.
But just now a solution occurred to me. In the bowels of the source code for Write It Now, there must reside a software entity, (called a class) named something by the programmer. I'll name it "Relationship" for now. This class would be responsible for holding everything associated with a Relationship between two characters. Right now, I suppose it holds a string that specifies the type of relationship (e.g. "husband of"), two date objects for start & end, and a reference to a Character object. I here propose a refactoring of that object. Replace the string that identifies the type of relationship with a RelationshipType object.
The relationship type object I'm proposing has a boolean attribute: Reciprocal. Some relationships are reciprocal, others are not: e.g. Chaz is a husband of Kim and Kim is a wife of Chaz, but Art is a lover of Jennifer, but Jennifer has no such relationship with Art. With this distinction in mind, the programmer can associate reciprocal relationships automatically. When I add a "husband of" relationship between Chaz and Kim, it creates a reciprocal relationship "wife of" between Kim and Chaz. If I change my mind and want to I delete a reciprocal relationship, the software must goto the other character and delete its reciprocal relationship, too.
If you buy into the notion of a reciprocal relationship, you also have to worry about the polarity of that relationship. When I look at a relationship between Chaz and Kim from the perspective of Chaz, I want to see "husband of" and when I look at Kim's relationships, I should see "wife of". In graph-theoretic terms, reciprocal relationships are "directed" arcs between characters and this notion of polarity or direction, captures this distinction.
This would entail updating the Edit Relationship dialog to add a checkbox for Reciprocal or not. And also a "polarity" flag to select between "husband of" and "wife of" when displaying the relationship.
This also has an impact on the Relationship drop-down. I don't think free text in the combobox works any more. Instead it has to enumerate all the known relationships plus one called "other" selecting other would bring up a dialog where one defines:
- reciprocal or not,
- relationship description (e.g. husband of)
- reciprocal description (e.g. wife of).
While writing this, it occurred to me that the WriteItNow folks would also do well to refactor their Date object. Sometimes dates are important to know exactly, other times exactitude is a disraction or should just be a deferred decision. This argues for "fuzzieness" in the specification of dates. The date specifier dialog in WriteItNow have some checkboxes for Month, Day, Week Day, and BC. I'm not quite sure how these work and should start searching the documentation. (They govern presentation of the date. Bad form to confuse data entry and presentation. There's no Help button on the date specifier dialog. It's unclear how the red X is different from the Cancel button, either.)
Instead, I think every Date object needs to recognize the distinction between absolute and relative times. Absolute times are points like 2:57 pm GMT June 2, 1934. Relative times are points like 5 years ago. Let's suppose I have in mind that Damien is 13 when the story takes place. If I write the story is to take place "now," his birthdate can't be specified absolutely. Similarly, I may want to defer decisions about how old he is exactly. I'd prefer to say Damien is between 12 and 15. When I know more, I'll narrow it down.
Same goes for absolute dates. I may want to say that an event takes place "during WW2" but I'm not sure exactly when. I had a story where my hero lost an arm (and a fiance) during a Nazi bombing attack. When exactly? I didn't know more than between 1939 and 1945. And I didn't need to know until later.
WriteItNow will do a better job if it enables the writer to capture artistic decisions in relative terms with some degree of fuzziness. Thus I think its Date object should be refactored to mind these two distinctions: absolute versus relative, and inexactitude. Relative times are tricky, I'll come back to them momentarily.
Fuzzieness can be handled by adopting intervals. Any fuzzy date is really a range between the earliest and the latest times of an event. My hero's injury starts out at [1 Sep 1939 - 2 Sep 1945]. Since my hero is an American I decide he has to be hurt after Pearl Harbor: [7 Dec 1941 - 2 Sep 1945]. So it goes, as I research and refine dates and narrow the range. Exact dates are simply zero-width intervals. In my example, these are all absolute times, but relative times may prove useful. e.g. Damien's age mentioned above.
Relative times are tricky because they are "relative to what." WriteItNow enables the writer to define events. Events seem to be the best candidate for providing reference points for relative dates. What makes them tricky is that you can have multiple narrative tracks in a story. Neal Stephenson's Cryptonomicon tracked WW2 and contemporary events in parallel, for example.
In my current story, I figure Chaz will be found dead in a locked room. (Someone named Chaz should always be found dead at some time in the story.) I figure he'll be married to Kim about 3 years before that, and she'll file for divorce about a month before that. Meanwhile, Art and Damien are establishing a love-hate relationship as tutor and student. I don't know exactly how those two narrative threads will merge. I don't want to decide that yet. I'll want to specify all Kim and Chaz events relative to each other. And i'll want to specify all Damien, Art and Jennifer events relative to themselves.
Where it gets tricky is when I try to harmonize multiple the narrative flows. I'll need to float all the dates in one narrative to let me slide it forward and back to match up with the other. And I need to check for contradictions. Like Chaz getting killed before he can insult Art at a dinner party. Thus the Date object must be made fuzzy to some extent, and must be either absolute or relative. Similarly, when events are "linked" (I haven't gotten to that part of WriteItNow yet), some kind of consistency check between them will be needed.
More on that later.
Saturday, March 31, 2007
21st Century Camping
Last week we pulled the Aliner out of storage. It sat in my driveway this week as I went through it inspecting and setting up for use. This provided me an extra reading room that I used for programming. Worked quite nicely as such, too.
Grand Haven State Park advertises that they have WIFI, so I decided on a little expedition to test this. Last winter the website for the park allowed reservations on 30 March, and that's what I put in.
The first challenge was sneaking out of work. Since I work at home Fridays, that should be easy. But there's a release that occasioned a lot of hand-wringing that resulted in a clutch of phone calls from QA and one big conference call with the product manager and the big boss. The conference call wasn't too long and I got on the road an hour and a half later than hoped. Traffic slowed me and I didn't get to Grand Haven as quickly, either.
The Wifi works (i'm using it now). I was pleased to note not one, but two wireless service providers within range of my laptop. I signed up for a one-day plan, but I could have gotten an hour's access for free.
And I was able to get on IM. I told my colleague in QA that I had to move my trailer, and asked if all was well. I didn't say how far I'd moved it. Later I chatted with my boss noting that it was cold and windy and raining, but that I was warm and snug and had Wifi. He was impressed with the geek factor.
Grand Haven State Park is perfect this time of year. It's cold and windy. And there's almost nobody here. I don't think I'd like it in July with no shade and crowds of noisy teenagers.
I have a friend who writes articles for outdoors magazines. I mentioned my purchase of my trailer and asked about some good camping destinations. In the course of the conversation he sniffed, "if you're using propane, it isn't camping." I suppose you'd say he's old-school. When I tell him about this expedition, I expect to see his head spin around three times or something like that.
Grand Haven State Park advertises that they have WIFI, so I decided on a little expedition to test this. Last winter the website for the park allowed reservations on 30 March, and that's what I put in.
The first challenge was sneaking out of work. Since I work at home Fridays, that should be easy. But there's a release that occasioned a lot of hand-wringing that resulted in a clutch of phone calls from QA and one big conference call with the product manager and the big boss. The conference call wasn't too long and I got on the road an hour and a half later than hoped. Traffic slowed me and I didn't get to Grand Haven as quickly, either.
The Wifi works (i'm using it now). I was pleased to note not one, but two wireless service providers within range of my laptop. I signed up for a one-day plan, but I could have gotten an hour's access for free.
And I was able to get on IM. I told my colleague in QA that I had to move my trailer, and asked if all was well. I didn't say how far I'd moved it. Later I chatted with my boss noting that it was cold and windy and raining, but that I was warm and snug and had Wifi. He was impressed with the geek factor.
Grand Haven State Park is perfect this time of year. It's cold and windy. And there's almost nobody here. I don't think I'd like it in July with no shade and crowds of noisy teenagers.
I have a friend who writes articles for outdoors magazines. I mentioned my purchase of my trailer and asked about some good camping destinations. In the course of the conversation he sniffed, "if you're using propane, it isn't camping." I suppose you'd say he's old-school. When I tell him about this expedition, I expect to see his head spin around three times or something like that.
Monday, March 26, 2007
How To Get Anna Nicole Smith Off The News
I just heard a guy on the radio profess that he lacked the power to get Anna Nicole Smith off the news. Happily, I have the solution. It's trivially easy to do this. Follow these steps:
1) you'll need guns, lots of guns. (A Matrix-style black leather coat is optional.) and ammo.
2) show up at the nearest TV network.
3) shoot up the place.
At this point, you have two options.
a) save the last bullet for yourself.
b) give yourself up so that you can have this month's "trial of the century." This will keep Anna Nicole Smith off the news for a few more weeks.
Sadly, you can only do this once. If you want to keep Anna Nicole Smith off the news for more than a few weeks, you'll have to recruit help. This shouldn't be hard. On the Internet, you can hook up with anybody about anything.
1) you'll need guns, lots of guns. (A Matrix-style black leather coat is optional.) and ammo.
2) show up at the nearest TV network.
3) shoot up the place.
At this point, you have two options.
a) save the last bullet for yourself.
b) give yourself up so that you can have this month's "trial of the century." This will keep Anna Nicole Smith off the news for a few more weeks.
Sadly, you can only do this once. If you want to keep Anna Nicole Smith off the news for more than a few weeks, you'll have to recruit help. This shouldn't be hard. On the Internet, you can hook up with anybody about anything.
Sunday, March 25, 2007
Thespians Have Invaded My Church!
I'm no great fan of church drama and dramatic productions. So, this is an uncomfortable time of year for me. Leading up to Easter each year my church goes through a transformation.
This morning, we got to church relatively early. In the foyer outside the auditorium I noticed a lot of people milling about in costumes, apparently from the 1920s or '30s.
When we got into the auditorium, I was instantly consumed with lust. There on the platform gleamed a vintage Packard roadster. (It's odd that when you tell a man you covet his car, he'll smile. How many of the 10 commandments can you violate with that response.)
Around the Packard was a number of set decorations with that '20s or '30s theme. Old Coca Cola signage and so on. It was a remarkable piece of work. I remarked to my wife, "where are the TVs?" Blythefield has three huge projection screens on which videos, the words to songs and sermon notes are projected. None were visible, just the stage props.
When the service started, the thespians invaded the auditorium all in their costumes. Over a hundred of them surged onto the platform. They do this each year, except they wear different costumes each year. They sang and then segued into a song-and-dance routine that was as good as any musical production I've seen in Grand Rapids. I joke about the dancing girls at church, but today both men and women were kicking their legs up.
I appreciated the skill and work that went into the show. That's one of Blythefield's strengths, the show before the sermon. I realized that my opinions notwithstanding, this could be what reaches some people who'd otherwise be consumed with ennui or absent.
One of the thespians is a tall fellow with a beard, you know the kind of beard you've seen in every picture of Jesus you've ever seen. Jesus goes to my church. I see him every Easter season. This year, Jesus was easy to spot because whereas all the other thespians were wearing costumes from the early 20th century, Jesus wore the bathrobe costume we imagine the ancients clothed themselves with.
Then someone flipped a switch and a projection screen unfurled to allow projection of the words to the songs we were to sing. (It wouldn't be church without video, would it?) And after some peppy songs with a solid back-beat, they showed a video on that big screen.
But I found the video confusing. I told you that Jesus goes to our church. But the video showed a different guy in a beard who wore the bathrobe costume. He didn't look like the Jesus who goes to our church. Perhaps Jesus is like Santa Claus: the guy in my church and the guy in the video are just his helpers. (Someday, I'll ask some hard questions about the 2nd commandment.)
Last year, two movies came out, "The Illusionist" and "The Prestige" that each featured magicians. I rather liked the latter, but haven't seen the former. They seem to have set a cultural theme. As Evangelicals are wont, my church has (six months late) latched onto the fad and the Easter show this year has some kind of magical theme or story-line where some kind of magician comes to town in the early 20th century (thus the costuming indicated above). Perhaps next year all the guys with great pectorals will be recruited for a "300" rip-off.
30 years ago, Francis Schaeffer challenged Evangelicals to engage contemporary culture and I suppose that what I just described is what this entails. I think our failure is that we're six months late, and that we're not setting the pace for others to follow.
This morning, we got to church relatively early. In the foyer outside the auditorium I noticed a lot of people milling about in costumes, apparently from the 1920s or '30s.
When we got into the auditorium, I was instantly consumed with lust. There on the platform gleamed a vintage Packard roadster. (It's odd that when you tell a man you covet his car, he'll smile. How many of the 10 commandments can you violate with that response.)
Around the Packard was a number of set decorations with that '20s or '30s theme. Old Coca Cola signage and so on. It was a remarkable piece of work. I remarked to my wife, "where are the TVs?" Blythefield has three huge projection screens on which videos, the words to songs and sermon notes are projected. None were visible, just the stage props.
When the service started, the thespians invaded the auditorium all in their costumes. Over a hundred of them surged onto the platform. They do this each year, except they wear different costumes each year. They sang and then segued into a song-and-dance routine that was as good as any musical production I've seen in Grand Rapids. I joke about the dancing girls at church, but today both men and women were kicking their legs up.
I appreciated the skill and work that went into the show. That's one of Blythefield's strengths, the show before the sermon. I realized that my opinions notwithstanding, this could be what reaches some people who'd otherwise be consumed with ennui or absent.
One of the thespians is a tall fellow with a beard, you know the kind of beard you've seen in every picture of Jesus you've ever seen. Jesus goes to my church. I see him every Easter season. This year, Jesus was easy to spot because whereas all the other thespians were wearing costumes from the early 20th century, Jesus wore the bathrobe costume we imagine the ancients clothed themselves with.
Then someone flipped a switch and a projection screen unfurled to allow projection of the words to the songs we were to sing. (It wouldn't be church without video, would it?) And after some peppy songs with a solid back-beat, they showed a video on that big screen.
But I found the video confusing. I told you that Jesus goes to our church. But the video showed a different guy in a beard who wore the bathrobe costume. He didn't look like the Jesus who goes to our church. Perhaps Jesus is like Santa Claus: the guy in my church and the guy in the video are just his helpers. (Someday, I'll ask some hard questions about the 2nd commandment.)
Last year, two movies came out, "The Illusionist" and "The Prestige" that each featured magicians. I rather liked the latter, but haven't seen the former. They seem to have set a cultural theme. As Evangelicals are wont, my church has (six months late) latched onto the fad and the Easter show this year has some kind of magical theme or story-line where some kind of magician comes to town in the early 20th century (thus the costuming indicated above). Perhaps next year all the guys with great pectorals will be recruited for a "300" rip-off.
30 years ago, Francis Schaeffer challenged Evangelicals to engage contemporary culture and I suppose that what I just described is what this entails. I think our failure is that we're six months late, and that we're not setting the pace for others to follow.
Wednesday, March 21, 2007
Theorem and Non-sequitir
I recently had occasion to ask myself what exactly constitutes thinking. Since I was trained as a mathematician, I generally regard thinking as something akin to the process of stepping through a sequence of formal steps: starting with premises, then stepping logically to intermediate results and finally arriving at a conclusion.
If reason is reasonable, the conclusion will be as true as the premises and the validity of the steps to the conclusion.
There's a similar process in forensic procedures where cases are made tallying up the arguments in favor of and counter to the point of dispute. When making cases, facts are marshaled to serve as the premises of a reasoned process leading to the advocate's position.
In the forensic setting, we can't count on the neat set-piece logic of the mathematical proof. So, the arguments tend to be more inductive and the logical steps of the argument somewhat less rigorous.
Now, what has this to do with thinking? There's a cartoon that came out when I was in college. I'm wearing it on a t-shirt as I write this. That was the constant temptation when I was getting my Masters' in Mathematics: I'd be in the middle of a proof and realize the next step I needed to take, but I didn't know how to do it. I dearly wished I could say, "then a miracle occurs," to make the missing step. They don't let you do that in Mathematics.
In Law, I think it's a matter of getting away with it. If you try it in law school, it depends on how closely the prof is watching, or in court, how closely the judge is watching. If they catch you, you'll be handed your head.
There's a term-of-art for the unsubstantiated step in an argument: the non sequitir. The step does not follow. It should be cut and dried, but that's not necessarily so.
When I was taking Calculus, the prof would write up proofs on the board and I would not understand the step that he took. My dullness of mind could not perceive how one step followed from another. The ultimate math-prof cop-out is to say, "this is left as an exercise for the student."
So then, it requires some subtlety to distinguish between the theorem one does not understand and the non sequitir. Charity demands that when someone throws something that appears to be a mismash of non sequitir and gratuitous assertions, that it not be dismissed out of hand. But how hard must one work before throwing up one's hands and saying, "I'm not this stupid," and decide that whatever you're looking at is no theorem, but non-sequitir. Is this from a deep thinker or from a braggart dilettante?
One strategy suggests itself. If your interlocutor has demonstrated mastery of a broad spectrum of difficult subjects and familiarity therewith, it suggests the former. Conversely, if he clutches a small handful of facts that he has difficulty integrating with other ideas, it suggests the latter.
Which am I? I suppose it's safest for me to regard myself a dilettante until proven otherwise.
If reason is reasonable, the conclusion will be as true as the premises and the validity of the steps to the conclusion.
There's a similar process in forensic procedures where cases are made tallying up the arguments in favor of and counter to the point of dispute. When making cases, facts are marshaled to serve as the premises of a reasoned process leading to the advocate's position.
In the forensic setting, we can't count on the neat set-piece logic of the mathematical proof. So, the arguments tend to be more inductive and the logical steps of the argument somewhat less rigorous.
Now, what has this to do with thinking? There's a cartoon that came out when I was in college. I'm wearing it on a t-shirt as I write this. That was the constant temptation when I was getting my Masters' in Mathematics: I'd be in the middle of a proof and realize the next step I needed to take, but I didn't know how to do it. I dearly wished I could say, "then a miracle occurs," to make the missing step. They don't let you do that in Mathematics.
In Law, I think it's a matter of getting away with it. If you try it in law school, it depends on how closely the prof is watching, or in court, how closely the judge is watching. If they catch you, you'll be handed your head.
There's a term-of-art for the unsubstantiated step in an argument: the non sequitir. The step does not follow. It should be cut and dried, but that's not necessarily so.
When I was taking Calculus, the prof would write up proofs on the board and I would not understand the step that he took. My dullness of mind could not perceive how one step followed from another. The ultimate math-prof cop-out is to say, "this is left as an exercise for the student."
So then, it requires some subtlety to distinguish between the theorem one does not understand and the non sequitir. Charity demands that when someone throws something that appears to be a mismash of non sequitir and gratuitous assertions, that it not be dismissed out of hand. But how hard must one work before throwing up one's hands and saying, "I'm not this stupid," and decide that whatever you're looking at is no theorem, but non-sequitir. Is this from a deep thinker or from a braggart dilettante?
One strategy suggests itself. If your interlocutor has demonstrated mastery of a broad spectrum of difficult subjects and familiarity therewith, it suggests the former. Conversely, if he clutches a small handful of facts that he has difficulty integrating with other ideas, it suggests the latter.
Which am I? I suppose it's safest for me to regard myself a dilettante until proven otherwise.
Tuesday, March 20, 2007
The Spinning Sound That You Hear
In the Golden Age of Science Fiction, a Grandmaster named Isaac Asimov decided to write some stories that ran counter to the tired, stale stereotype. You see, ever since the Czech movie RUR, robots had been depicted as sinister things. Man would make machines, the machines would be slaves and the slaves would revolt.
This pattern dominated SF writing from that point forward and became a tired, stale stereotype. Everybody wrote robot stories that cast robots in this same negative light.
Then Isaac Asimov thought that perhaps it might be interesting and novel to break the stereotype. He wrote stories about these two engineer-scientist-troubleshooters who had the job of going around diagnosing and fixing interesting robot problems. And the engine of these stories, the plot device that powered them all was the Laws of Robotics: Robots can't harm humans, etc. The structure of the "positronic brain" was such that it was impossible for the Laws to be broken. These short stories were collected in book form and published as I Robot. It was one of my favorite books when I was a kid.
This same riff persisted in the Caves Of Steel novel and the other stories involving the robot detective R. Daneel Olivaw. Also favorites of my youth.
Times wounds all heels, and in 2004, I Robot made its way to the silver screen. I saw the hypes and thought they showed a movie that it wasn't true to Asimov's central idea. So, I made a point to not see this movie.
Eventually, it made it to cable TV and I told Tivo to record it. What a horrid film. The spinning sound you hear is that of Isaac Asimov in his grave.
It seems that computers are truly a sinister, corrupting force, and you can see it in I Robot, the movie. But not the way you think. Pervasive CGI rendering allows the filmmaker to set up scenes where hundreds or thousands of robots can fill the screen and crawl around the screen like ants. Too many movies just sort of omit things like character and story and fill the screen with CGI. This is the sinister corrupting force of computers in cinematography.
That's bad, but what makes I Robot worse is that the nature of CGI in this film. Filling the screen with a hundred bug-like robots all moving around is just wrong. And when they did use the CGI for things like cars or traffic scenes, it looked obviously fake.
Oh, but wait, after the movie's been going on and on and on, the robots take over. Wow, imagine that. Sure, they say that it's to protect us from ourselves. But you know, robots always take over and kill their masters. If the robots don't think of it themselves, they can get the idea from old Star Trek reruns. And then Will Smith has to get the "plot device" and shoot it into the MCP. oops, that was Tron. Well, you can predict any movie's last minutes once they realize they need to push the Big Red Button and you know everything bad will happen to provide obstacles for the hero en route to said button. And when he stands/hangs/lies next to the Big Red Button, he'll have some Witty Remark that he'll say when he plunges the Plot Device into the MCP or whatever, killing it.
I pine for the Old Days when there were writers who could do better than parody the old tired stereotypes, but come up with novel treatments of something. Like Isaac Asimov did in I Robot, the BOOK not the movie.
This pattern dominated SF writing from that point forward and became a tired, stale stereotype. Everybody wrote robot stories that cast robots in this same negative light.
Then Isaac Asimov thought that perhaps it might be interesting and novel to break the stereotype. He wrote stories about these two engineer-scientist-troubleshooters who had the job of going around diagnosing and fixing interesting robot problems. And the engine of these stories, the plot device that powered them all was the Laws of Robotics: Robots can't harm humans, etc. The structure of the "positronic brain" was such that it was impossible for the Laws to be broken. These short stories were collected in book form and published as I Robot. It was one of my favorite books when I was a kid.
This same riff persisted in the Caves Of Steel novel and the other stories involving the robot detective R. Daneel Olivaw. Also favorites of my youth.
Times wounds all heels, and in 2004, I Robot made its way to the silver screen. I saw the hypes and thought they showed a movie that it wasn't true to Asimov's central idea. So, I made a point to not see this movie.
Eventually, it made it to cable TV and I told Tivo to record it. What a horrid film. The spinning sound you hear is that of Isaac Asimov in his grave.
It seems that computers are truly a sinister, corrupting force, and you can see it in I Robot, the movie. But not the way you think. Pervasive CGI rendering allows the filmmaker to set up scenes where hundreds or thousands of robots can fill the screen and crawl around the screen like ants. Too many movies just sort of omit things like character and story and fill the screen with CGI. This is the sinister corrupting force of computers in cinematography.
That's bad, but what makes I Robot worse is that the nature of CGI in this film. Filling the screen with a hundred bug-like robots all moving around is just wrong. And when they did use the CGI for things like cars or traffic scenes, it looked obviously fake.
Oh, but wait, after the movie's been going on and on and on, the robots take over. Wow, imagine that. Sure, they say that it's to protect us from ourselves. But you know, robots always take over and kill their masters. If the robots don't think of it themselves, they can get the idea from old Star Trek reruns. And then Will Smith has to get the "plot device" and shoot it into the MCP. oops, that was Tron. Well, you can predict any movie's last minutes once they realize they need to push the Big Red Button and you know everything bad will happen to provide obstacles for the hero en route to said button. And when he stands/hangs/lies next to the Big Red Button, he'll have some Witty Remark that he'll say when he plunges the Plot Device into the MCP or whatever, killing it.
I pine for the Old Days when there were writers who could do better than parody the old tired stereotypes, but come up with novel treatments of something. Like Isaac Asimov did in I Robot, the BOOK not the movie.
Sunday, March 18, 2007
Twelves Gates To The Printer
I have an apartment for rent. My wife wanted some mini-fliers to hand out/put up. That's fine because I did the design in MS Publish last year or so. Since my wife is getting more computer-literate, I put her to work finding the files. Ultimately, we found them on a seldom-used machine named Forrest. Most recent work has been on my main desktop machine named Grant.
OK, we need fliers, but they're on Forrest, not Grant. Mary made the fixes on Forrest. Then it was time to print the fliers. I have three color printers: HP990, HP8400 and HP7400 that we use for fliers, for photos, and for correspondence, respectively. Since Forrest is seldom used, printing has become problematic. First I tried the HP990, and the network flaked out resulting in wasted paper half-printed with the fliers. And the HP990 ink jet printer was out of black ink. I went to Meijer's and bought a replacement. But the network problem persisted.
Then I tried the HP8400 and MS Publish said "there was a problem". Nothing more useful than that. I went to the internet and downloaded the HP7400 drivers and installed them. On the second try it said the install was OK. Then I printed MS Publish and got the same unhelpful message. OK, Forrest had a network problem I wasn't going to fix.
I was able to copy the MS Publish files to Grant. Tried to open and print from there. NO joy. Grant's copy of MS Publish was '97 and Forrest's copy was '02. What to do? I could not find the Publish 2002 install disk, so I couldn't just update Grant and print from there.
I went back to Forrest and checked "print to file" using each of the printer drivers. Then I copied the resulting PRN files to Grant. Now all I had to do was copy each PRN file directly to its printer.
Interesting. Back in the old DOS days it was simple. Just do this:
Copy/b file.prn LPT1:
But none of the printers are hooked directly to Grant. The HP990 is hooked to a wireless printer server with an odd name of LK96c9ea. It has two queues, p1 and p2. A couple years ago, I figured out how to print directly to it like this:
Copy/b file.prn \\LK96c9ea\p1
But the HP8400 printer has an Ethernet port and the HP7400 printer connects via wireless. It took some doing to figure out how to send bytes directly to these printers. I suppose there's probably a way using the DOS Copy/b command, but I couldn't immediately find it. But after a bit of googling I found I could use netcat or nc to send things directly to the printer's TCP/IP address port 9100. What I found worked for me is this:
nc HPM210QY047Z 9100 < file.prn
The first part "nc" is the program netcat, easily downloaded from the net from a number of places. The second and third parts is the printer/port name and port number, respectively. You can get the port name from the printer properties' Ports tab, scroll down the list until you see one port "checked" and click on configure port. The dialog will appear on which you will find the port name (in my case HPM210QY047Z), a protocol (raw) and a port number (9100).
If you ever find a way to get DOS Copy/b to accept a TCP/IP address and port as a destination, let me know.
OK, we need fliers, but they're on Forrest, not Grant. Mary made the fixes on Forrest. Then it was time to print the fliers. I have three color printers: HP990, HP8400 and HP7400 that we use for fliers, for photos, and for correspondence, respectively. Since Forrest is seldom used, printing has become problematic. First I tried the HP990, and the network flaked out resulting in wasted paper half-printed with the fliers. And the HP990 ink jet printer was out of black ink. I went to Meijer's and bought a replacement. But the network problem persisted.
Then I tried the HP8400 and MS Publish said "there was a problem". Nothing more useful than that. I went to the internet and downloaded the HP7400 drivers and installed them. On the second try it said the install was OK. Then I printed MS Publish and got the same unhelpful message. OK, Forrest had a network problem I wasn't going to fix.
I was able to copy the MS Publish files to Grant. Tried to open and print from there. NO joy. Grant's copy of MS Publish was '97 and Forrest's copy was '02. What to do? I could not find the Publish 2002 install disk, so I couldn't just update Grant and print from there.
I went back to Forrest and checked "print to file" using each of the printer drivers. Then I copied the resulting PRN files to Grant. Now all I had to do was copy each PRN file directly to its printer.
Interesting. Back in the old DOS days it was simple. Just do this:
Copy/b file.prn LPT1:
But none of the printers are hooked directly to Grant. The HP990 is hooked to a wireless printer server with an odd name of LK96c9ea. It has two queues, p1 and p2. A couple years ago, I figured out how to print directly to it like this:
Copy/b file.prn \\LK96c9ea\p1
But the HP8400 printer has an Ethernet port and the HP7400 printer connects via wireless. It took some doing to figure out how to send bytes directly to these printers. I suppose there's probably a way using the DOS Copy/b command, but I couldn't immediately find it. But after a bit of googling I found I could use netcat or nc to send things directly to the printer's TCP/IP address port 9100. What I found worked for me is this:
nc HPM210QY047Z 9100 < file.prn
The first part "nc" is the program netcat, easily downloaded from the net from a number of places. The second and third parts is the printer/port name and port number, respectively. You can get the port name from the printer properties' Ports tab, scroll down the list until you see one port "checked" and click on configure port. The dialog will appear on which you will find the port name (in my case HPM210QY047Z), a protocol (raw) and a port number (9100).
If you ever find a way to get DOS Copy/b to accept a TCP/IP address and port as a destination, let me know.
Friday, March 16, 2007
Writing Generic / Minimalist Code
Whenever I start on any new project, I have this uber-abstract mindset that spins off all manner of what-if things it could do. It's a matter of combinatorics: you know it has to read, will it have to write? you know it has to add, will it have to subtract? And so on. Most such ideas are not practical. This drives my boss nuts.
But this what-if thinking occasionally pulls my chestnuts out of the fire when someone breaks the promise that they'll never ever need so-and-so (but they do).
Thus, I set my course between Scylla and Charybdis. On one hand, I build something inadequate that must be carefully rewritten to be extended. On the other hand, I build something over-engineered and/or bloated. The principles of Object Oriented offer a path between them. One principle is "program to interfaces."
For the last couple years, I've been doing a lot of Test-Driven development. This week, I put Test-Driven to work in conjunction with "programming to interfaces." I created the interfaces for my current project, and before I had anything more than method signatures and parameter lists, I immediately wrote unit tests to thrash out the interfaces.
My intent was to code up just enough to get Visual Studio reverse-engineer it and thereby get UML class diagrams to use. However, it came together so very well, that the next steps were trivial. Before the day was out, I had gotten much further, much faster than I could have possibly dared to think.
There's one thing to understand OO and what it can do for you. It's another thing to take it to the next level. I'm quite pleased with what I've applied today.
reverse engineered from
These unit tests served to give me an immediate feel for how the software would work and this let me tweak the design so as to get the maximum functionality out of the minimum code.
There is in the principals of Object Oriented software development, a Now, when you have a righteous OO design, it'll manifest open-closed characteristics. The design will be closed to modification and open to extension.
But this what-if thinking occasionally pulls my chestnuts out of the fire when someone breaks the promise that they'll never ever need so-and-so (but they do).
Thus, I set my course between Scylla and Charybdis. On one hand, I build something inadequate that must be carefully rewritten to be extended. On the other hand, I build something over-engineered and/or bloated. The principles of Object Oriented offer a path between them. One principle is "program to interfaces."
For the last couple years, I've been doing a lot of Test-Driven development. This week, I put Test-Driven to work in conjunction with "programming to interfaces." I created the interfaces for my current project, and before I had anything more than method signatures and parameter lists, I immediately wrote unit tests to thrash out the interfaces.
My intent was to code up just enough to get Visual Studio reverse-engineer it and thereby get UML class diagrams to use. However, it came together so very well, that the next steps were trivial. Before the day was out, I had gotten much further, much faster than I could have possibly dared to think.
There's one thing to understand OO and what it can do for you. It's another thing to take it to the next level. I'm quite pleased with what I've applied today.
reverse engineered from
These unit tests served to give me an immediate feel for how the software would work and this let me tweak the design so as to get the maximum functionality out of the minimum code.
There is in the principals of Object Oriented software development, a Now, when you have a righteous OO design, it'll manifest open-closed characteristics. The design will be closed to modification and open to extension.
Monday, March 12, 2007
For Mature Audiences Only
I just flipped on the telly and saw the disclaimer "For Mature Audiences Only" and it showed a couple cartoon monkeys whacking each other with paddles. Then one came this british television show where these science boffins in white lab coats do strange things like zap women with electricity and inflate hot water bottles with liquid nitrogen.
All good fun. Strange, but I always thought that "mature audiences" were more like the Masterpiece Theatre crowd. Perhaps an incisive discussion of Hegel or Kant? Nope.
Or maybe it's code: The phrase "for mature audiences only" is code for "immature tomfoolery ahead." Now, don't get me wrong, I like this immature tomfoolery. I just dislike the language being distorted.
Perhaps the disclaimer should be "for juvenile audiences, but not children."
All good fun. Strange, but I always thought that "mature audiences" were more like the Masterpiece Theatre crowd. Perhaps an incisive discussion of Hegel or Kant? Nope.
Or maybe it's code: The phrase "for mature audiences only" is code for "immature tomfoolery ahead." Now, don't get me wrong, I like this immature tomfoolery. I just dislike the language being distorted.
Perhaps the disclaimer should be "for juvenile audiences, but not children."
Sunday, March 11, 2007
Consubstantiation
This morning during the communion service, a thought occurred.
Let's back up a bit. If you have any sort of Christian identity, you know about this business called "The Gospel." You may also know that Christianity denies "salvation by works," and this Gospel is the way God vindicates his justice while offering mercy to all and granting mercy to some. Some. I don't believe I'll see Hitler in heaven. So, if you have any interest in getting to heaven, you've got to concern yourself with this Gospel business.
The ancients worked all this out and there are Latin phrases that say all that I'll paraphrase here. The gospel requires 3 things of a person:
1) You have to know the story that Jesus Christ died on the cross to pay for our sins and that he rose again on the third day.
OK. I also know the story of the three bears and the Goldilocks girl who ate their porridge, etc. But there's a difference between knowing the Jesus story and knowing the Goldilocks story: Christians think the events of the Jesus story actually happened in space-and-time. This leads us to the 2nd thing.
2) You have to believe the Jesus story referred to above is actually true.
One distinction between orthodox Bible-believing Christians and many who claim a Christian identity is our view of history. A hundred years ago folks claimed that it doesn't matter what happened millenia ago, but it is important to follow the ethical standard of Jesus, and dispense with all that mythological stuff of snakes talking, etc. Today you may hear of those who'd "demythologize" Jesus by denying the space-and-time historicity of things like Christ's death on the Cross and his Resurrection. Christianity has a millenia-old insistence that if you are to be a Christian, you must also believe that the story of Jesus' death on the Cross and Resurrection is more than a useful metaphor containing no more than mythic significance.
The above serve as necessary, but not sufficient, conditions for being a Christian. However, Christian teaching has always insisted upon a third element.
3) You have to believe Jesus died on the cross for you, personally and individually. You have to add something more to knowing the Jesus story's details and to believing them to be true. A Christian needs to make a personal claim that those things count for himself or herself.
This always bothered me growing up. I knew the first two parts quite well, but had difficulty understanding that third part. Baptists like to refer to this third step as "accepting" or "receiving" something. I could never understand this. When I got older, I heard an analogy of trusting a chair: that uncertain moment when your knees are bent, you lower yourself and you find out whether the chair will collapse beneath you or not, and this isn't far from Kierkegaard's notion of the leap of faith.
My own spiritual journey took a good turn one time when I was struggling with these things I didn't understand. And I became quite angry with God and told him that I didn't care if he tossed me into Hell, but I told him what I believed his Word promised and that I was going to hold him to keep the promises of his Word and I was here-and-now claiming them for myself.
Now, looking back at that moment, I can see that I came to the end of myself and that I took a sort of Kierkegaardian leap of faith. It wasn't a blind leap: I had been reading Romans 1-5 and had those facts clearly in view.
All this sounds like I did something to unlock grace, but I believe that grace was driving these events, and led me through this process. It only looked like I was taking charge and actively working out my salvation. Instead, grace was working in me and bringing me along that third bit of transforming a "head knowledge" into a "heart knowledge."
So, this business of becoming a Christian is more than just knowing or believing something. There's this added bit that defies concise explanation and formula. I'm sure you can get a better explanation than the one I gave from any of several Christian resources. And depending upon who you read, it'll differ in the details: "letting go," "accepting," "asking Jesus into your heart," and so on. But there's some kind of extra, supernatural bit that isn't magic or ghostly, that gets added to the facts and belief of them.
And that brings us to this morning as I'm looking at the bread and wine. (Because I'm in a Baptist church, I was looking at a cracker and grape juice.) The communion elements remind me of Christ's body and blood.
I really like the Aristotelian idea of substances, and how a substance's essens and its accidens must be distinguished. Aquinas and the Schoolmen were geniuses to apply Aristotle's essens/accidens distinction to the bread and wine becoming the body and blood of Christ. It makes a sort of sense that the "hoc est corpus" should transmute the former into the latter. And since the elements still taste like bread and wine, the Arisotelian essens/accidens business makes it work. Turn this paragraph into a single word and you have "transubstantiation."
But I do not believe in that hocus pocus stuff. (Baptists have an inconsistency, insisting on maximum literalness in interpreting the Bible, but then spiritualizing wine into grape juice. I've never gotten a decent answer, even when I asked in a Deacon's meeting.)
A second way of regarding the elements of communion is called "consubstantiation." I once asked a Lutheran pastor what this means and I didn't get a satisfactory answer. He claimed "consubstantiation" was a strawman made by Calvinists. So, what follows should be ignored if you find a better Lutheran source. As I understand it now, consubstantiation teaches a mingling of the substances: the substance of the bread and wine becomes invested or haunted or charged or infused with the divine substance of Christ's body and blood. My Lutheran friend is now an Orthodox priest, so what I just said may be biased by the Orthodox notion of Incarnation. I am quite enamored with Orthodox thinking about Incarnation, so my perception is further biased at this point.
Officially, what I believe is stated here, but what occurred to me this morning is that something more than mere symbolism is in play during the Lord's Supper.
The ancients' notion of substances have limited applicability given contemporary atomic theory. The bread and wine are made of atoms made of quarks and gluons, etc. instead of "bread" and "wine" substances or mixtures of earth, wind, fire, and water essences.
This morning, I drew an analogy between the Jesus story and the elements of Communion. Could it be that this something more added to the symbolism and symbols? What I have in mind is not quite consubstantiation, but it is close. There's something extra added to the symbols, something that goes past mere matter to Christ's body and blood.
This isn't something changing the substance of the elements through the priest's hocus pocus, but by the individual celebrant of the Lord's supper recognizing Christ's body and blood in them. My Lutheran friend would hold up a photo and ask, "What is this?" and the answer would be a photo. Then he'd ask, "Who is this?" and the answer would be the person I recognized. Partaking in the body and blood so recognized, I promise to myself and to God that Christ's goodness shall be incorporated and lived out in my life.
This last bit is hard to say and as I reflect upon it, I know I've got some bits wrong. The London Confession of 1689 is much more reliable than my ramblings, and even then you should double-check what it says against the Bible verses shown.
Let's back up a bit. If you have any sort of Christian identity, you know about this business called "The Gospel." You may also know that Christianity denies "salvation by works," and this Gospel is the way God vindicates his justice while offering mercy to all and granting mercy to some. Some. I don't believe I'll see Hitler in heaven. So, if you have any interest in getting to heaven, you've got to concern yourself with this Gospel business.
The ancients worked all this out and there are Latin phrases that say all that I'll paraphrase here. The gospel requires 3 things of a person:
1) You have to know the story that Jesus Christ died on the cross to pay for our sins and that he rose again on the third day.
OK. I also know the story of the three bears and the Goldilocks girl who ate their porridge, etc. But there's a difference between knowing the Jesus story and knowing the Goldilocks story: Christians think the events of the Jesus story actually happened in space-and-time. This leads us to the 2nd thing.
2) You have to believe the Jesus story referred to above is actually true.
One distinction between orthodox Bible-believing Christians and many who claim a Christian identity is our view of history. A hundred years ago folks claimed that it doesn't matter what happened millenia ago, but it is important to follow the ethical standard of Jesus, and dispense with all that mythological stuff of snakes talking, etc. Today you may hear of those who'd "demythologize" Jesus by denying the space-and-time historicity of things like Christ's death on the Cross and his Resurrection. Christianity has a millenia-old insistence that if you are to be a Christian, you must also believe that the story of Jesus' death on the Cross and Resurrection is more than a useful metaphor containing no more than mythic significance.
The above serve as necessary, but not sufficient, conditions for being a Christian. However, Christian teaching has always insisted upon a third element.
3) You have to believe Jesus died on the cross for you, personally and individually. You have to add something more to knowing the Jesus story's details and to believing them to be true. A Christian needs to make a personal claim that those things count for himself or herself.
This always bothered me growing up. I knew the first two parts quite well, but had difficulty understanding that third part. Baptists like to refer to this third step as "accepting" or "receiving" something. I could never understand this. When I got older, I heard an analogy of trusting a chair: that uncertain moment when your knees are bent, you lower yourself and you find out whether the chair will collapse beneath you or not, and this isn't far from Kierkegaard's notion of the leap of faith.
My own spiritual journey took a good turn one time when I was struggling with these things I didn't understand. And I became quite angry with God and told him that I didn't care if he tossed me into Hell, but I told him what I believed his Word promised and that I was going to hold him to keep the promises of his Word and I was here-and-now claiming them for myself.
Now, looking back at that moment, I can see that I came to the end of myself and that I took a sort of Kierkegaardian leap of faith. It wasn't a blind leap: I had been reading Romans 1-5 and had those facts clearly in view.
All this sounds like I did something to unlock grace, but I believe that grace was driving these events, and led me through this process. It only looked like I was taking charge and actively working out my salvation. Instead, grace was working in me and bringing me along that third bit of transforming a "head knowledge" into a "heart knowledge."
So, this business of becoming a Christian is more than just knowing or believing something. There's this added bit that defies concise explanation and formula. I'm sure you can get a better explanation than the one I gave from any of several Christian resources. And depending upon who you read, it'll differ in the details: "letting go," "accepting," "asking Jesus into your heart," and so on. But there's some kind of extra, supernatural bit that isn't magic or ghostly, that gets added to the facts and belief of them.
And that brings us to this morning as I'm looking at the bread and wine. (Because I'm in a Baptist church, I was looking at a cracker and grape juice.) The communion elements remind me of Christ's body and blood.
I really like the Aristotelian idea of substances, and how a substance's essens and its accidens must be distinguished. Aquinas and the Schoolmen were geniuses to apply Aristotle's essens/accidens distinction to the bread and wine becoming the body and blood of Christ. It makes a sort of sense that the "hoc est corpus" should transmute the former into the latter. And since the elements still taste like bread and wine, the Arisotelian essens/accidens business makes it work. Turn this paragraph into a single word and you have "transubstantiation."
But I do not believe in that hocus pocus stuff. (Baptists have an inconsistency, insisting on maximum literalness in interpreting the Bible, but then spiritualizing wine into grape juice. I've never gotten a decent answer, even when I asked in a Deacon's meeting.)
A second way of regarding the elements of communion is called "consubstantiation." I once asked a Lutheran pastor what this means and I didn't get a satisfactory answer. He claimed "consubstantiation" was a strawman made by Calvinists. So, what follows should be ignored if you find a better Lutheran source. As I understand it now, consubstantiation teaches a mingling of the substances: the substance of the bread and wine becomes invested or haunted or charged or infused with the divine substance of Christ's body and blood. My Lutheran friend is now an Orthodox priest, so what I just said may be biased by the Orthodox notion of Incarnation. I am quite enamored with Orthodox thinking about Incarnation, so my perception is further biased at this point.
Officially, what I believe is stated here, but what occurred to me this morning is that something more than mere symbolism is in play during the Lord's Supper.
The ancients' notion of substances have limited applicability given contemporary atomic theory. The bread and wine are made of atoms made of quarks and gluons, etc. instead of "bread" and "wine" substances or mixtures of earth, wind, fire, and water essences.
This morning, I drew an analogy between the Jesus story and the elements of Communion. Could it be that this something more added to the symbolism and symbols? What I have in mind is not quite consubstantiation, but it is close. There's something extra added to the symbols, something that goes past mere matter to Christ's body and blood.
This isn't something changing the substance of the elements through the priest's hocus pocus, but by the individual celebrant of the Lord's supper recognizing Christ's body and blood in them. My Lutheran friend would hold up a photo and ask, "What is this?" and the answer would be a photo. Then he'd ask, "Who is this?" and the answer would be the person I recognized. Partaking in the body and blood so recognized, I promise to myself and to God that Christ's goodness shall be incorporated and lived out in my life.
This last bit is hard to say and as I reflect upon it, I know I've got some bits wrong. The London Confession of 1689 is much more reliable than my ramblings, and even then you should double-check what it says against the Bible verses shown.
Subscribe to:
Posts (Atom)