Monday, February 15, 2010

Fjeldberg Lutheran Church

Last week I visited friends in and around Ames, IA, and Sunday morning, before heading home, I attended a service at Fjeldberg Lutheran Church in Huxley. It’s a traditional-style ELCA congregation, but they caught me off-guard by using a slightly altered liturgical setting that I hadn’t experienced before. Throughout the whole service, there were definitely elements of the familiar: the creeds and Borg-like recitations I’d grown up with. But there were also new things, musical responses where I wasn’t expecting a musical response, or even more scary: different music with a traditional text.

Okay, it wasn’t really scary. It was actually a nice change from normal. Previously I’d assumed all traditional Lutheran services are made more or less equal. Apparently I was wrong. This service was just different enough from both my parents’ church and the student congregation at St Olaf to make it unique in it’s own right, while still retaining enough elements of the traditional to remain familiar.

And so I determined that it’s more challenging to follow along in a service that uses only a slightly different liturgy, verses a service that’s completely non-liturgical, where you’re always on guard for what might be coming next. At Fjeldberg I was never sure when to let my guard down, when it was safe to sink back into rote memory, and when there was going to be a new melody thrown at me.

I got plenty of practice sight-reading last Sunday. And I loved the challenge.

Monday, February 08, 2010

Partly Cloudy with a chance of Sermon

In watching all the special features in my DVD collection, tonight I watched the Pixar short called Partly Cloudy (this short was played before Disney's Up in the theatres). Ever since I first saw it in the theatre, I knew there was a deeper theological meaning I should be getting (albeit perhaps eisegetically; I won't claim that Pixar intended this deeper meaning). And then tonight, watching it again, I once again felt that tug: "there's something deep here, figure it out".

After pondering for a few moments and failing to think of anything brilliant, I turned to Google. Who would have thought a search for "partly cloudy pixar theological message" would turn up anything useful? But it did.

http://www.firstthings.com/blogs/theanchoress/2009/07/07/caritas-in-veritate-by-b-16-pixar/

Some, and by "some" I mean "all", of the quotations from Pope Benedict's encyclical went over my head, but the author's explication of Partly Cloudy's theological implications down right made me tear up. Taken with the blog author's interpretation, Partly Cloudy becomes an incredibly poignant 5-minute movie illustrating God's unique love, and unique Call for each of us.

I know Your Call won't always be easy, yet here I am Lord. Send me.

(turns out the video link on the blog doesn't work; the video is available here, though: http://www.redbalcony.com/?vid=24992)

Red Condor / Visi Bouncing Emails with Error Message "554 Failed: Malformed MIME header (in reply to end of DATA command))"

For the last two weeks I've on-and-off been puzzling over this issue: every email sent to users at visi.com from a PHP script I wrote bounces back with this error message: "554 Failed: Malformed MIME header (in reply to end of DATA command))".

Today I finally found the solution.

In my early searches, Google had nothing useful to say, so I'm writing this post in the hopes of helping some future PHP programmer who's banging his or her head against a wall in angst.

Here's the setup: for our online back-to-school / class registration system at Minnehaha (that I wrote), there's a PHP script that allows users to reset their forgotten passwords. Part of this process involves sending them an email with a unique identifier. The problem is that email wasn't always being delivered: users with visi.com email addresses did not receive their message. After examining the web server's logs, I discovered the error message above, something about a malformed MIME header.

I emailed Red Condor, Visi's filtering service (their name showed up in the log next to the bounce notice), and they wrote back in about 10 minutes. Literally. I was floored at how quickly their tech support responded.

Our first place of investigation was my custom headers. I need these so that the message is sent as HTML instead of plan text, but since it's human-made, it's the most logical place for a mistake. The PHP code looks something like this:

$headers = 'MIME-Version: 1.0'."\n".
'Content-Type:text/html;charset=iso-8859-1'."\n".
'From: Name <name@domain.com>'."\n";


One possible culprit was the line endings. The mail message spec dictates that all lines in the header need to end with \r\n (carriage return and a new line. For those too young to know what a carriage return is, Google for "typewriter"; it's an old-school laptop our parents and grandparents grew up using). If you'll notice, in my code above, I only have \n, not \r\n. IMPORTANT NOTE: If you're running PHP on a UNIX or Mac OS X server, the mail() command will add \r for you! So if you manually put in \r\n, you'll end up getting \r\r\n, which is bad.

So as far as I could tell, my headers were all correct.

Next, I manually grabbed my entire inbox from the mail server and examined it in a hex editor (Mac OS X users I recommend a free program called Hex Fiend). All my line endings were as they should be (Hex values 0D 0A).

I emailed back and forth a few times with Red Condor, and my tech support person suggested I capture the email coming from the server before it gets to the mail server, and then send them those bytes. I spent a day trying to figure out how to get PHP to dump an email into a file before giving up. I thought I'd never find the solution, until...

RC tech support suggested I try a packet capture.

Well that sounds fun. I know the concept, and I found a free program (CocoaPacketAnalyzer) to let me do it easily, but could I really find what I was looking for?

Yes, turns out.

I started a capture on the webserver, told the script to send an email to one of my Visi users, and then examined the packets that were sent. After a little searching I found the packet with the actual mail message, and here's the gold: all the bytes were correct except for the X-PHP-Originating-Script header, which had the dreaded \r\r\n trailing it.

How the heck do you get rid of that? It's not an error in my custom code, it's an error in PHP's mail() code!

Our network consultant Dan suggested I disable that header to see if that would solve Red Condor's rejection issue.

Google was helpful on this front: you can disable the X-PHP-Originating-Script header by setting mail.add_x_header = OFF in your php.ini file (and then restarting web services, obviously).

Turns out, disabling that header ALSO removed the extra \r. In my next packet capture, the extra byte was GONE and the email sent successfully, no more bouncing.

It's always something so small, so innocent. I don't know if Red Condor was rejecting the X-PHP-Originating-Script header or was just unhappy about the extra carriage return byte, but either way, I'm happy it's solved!

Thursday, February 04, 2010

Two Coins

Joanna and I have been hitting it hard this past week polishing up draft 2 of the FAR AWAY screenplay. We finished around 1:30am this morning, and I once again sent the script out to a lengthy list of friends and filmmakers for feedback.

Because of all the work we’ve been doing on the script, I’ve had no time to keep up with my RSS and podcast subscriptions until tonight. So this evening, as I was catching up with the posts from IMMD (ItMadeMyDay.com), I read this:
My 8 year old son wanted to donate money to Haiti after hearing a radio story about how difficult it is to get food to people right now. I expected $10, he gave $100 (half of his lifetime savings)! IMMD

Wow.

I mean, sure, even though January and February are both rather fiscally difficult months for me, I threw some money at the Red Cross after the earthquake. But not half my life savings. Not even half my paycheck for that week.

Now one can make an argument that, unlike the 8-year-old, I have other financial responsibilities: a house payment, food expenses, gas for the car, etc, that keep me from being able to donate at that percentage level. I don't think these are invalid, or even inappropriate, excuses. But they are excuses, nonetheless.

Last year I donated more to charities than any previous year in my life, and I'm hoping to best that again in 2010. Granted, having a full-time job sure helps :) But even so, I know I won't come anywhere close to what that 8-year-old did.

As he looked up, Jesus saw the rich putting their gifts into the temple treasury. He also saw a poor widow put in two very small copper coins. "I tell you the truth," he said, "this poor widow has put in more than all the others. All these people gave their gifts out of their wealth; but she out of her poverty put in all she had to live on." - Luke 21: 1-4