Saturday, February 14, 2009

May I Please Have My Name Back, Now?

I think I was incredibly patient throughout this whole mess, but it’s really getting old. Nobody ever asked me for my permission to use MY NAME as a meaningless campaign slogan, but now that things are settling down and the inevitable disillusionment is growing, I want it back.

Here, I’ll even let you have another poster with my name on it, but this time it’ll actually make sense, because it will have my face on it:

HOPE

I guarantee that the original photograph didn’t come from Reuters or AP; I just took it myself with my MacBook Pro’s built-in camera and Photo Booth (using the Comic Book filter). I then spent far too long trying to figure out the GIMP in order to put my name across the bottom (GIMP.app 2.6.0 definitely deserves the “experimental” warning; it has the usability of something from Redmond).

Anyway, it’s bad enough that the Smithsonian won’t give me my rock. Is it really too much to ask that I get to keep my own name?

I’m not being too audacious, am I?

Tuesday, February 3, 2009

Prayer Is Essential

This past Saturday, my old friend Carl Philip “Phil” Carlson was on the radio. He is now a campus missionary in Texas, and he was on the air sharing his testimony and talking about the work he does at his alma mater.

I already knew some of his testimony, from reading things he’s written and from talking to him about it (and I’m in Phil’s Facebook Group), but this was a whole different experience. When we’ve conversed recently, it’s been phone conversations that last maybe ten minutes; this was almost a half hour of Phil pouring his heart out. It was heartbreaking and sad and beautiful and powerful and amazing and challenging.

It’s hard to believe that this is the same guy I used to talk Star Trek with in high school as we’d study the latest screencaps from Pedro’s Shiporama (which still exists, wow!). Back then, Carl Phil struck me as a little stiff when it came to matters religious, but I just chalked it up to him being a Methodist (and it was actually kind of a welcome change from the people at the Pentecostal churches I attended); I had no idea of the kind of pain he was hiding, or its magnitude. We mostly stuck to lighter fare in our conversations, like science fiction or complaining about the latest stupidity inflicted upon us by our English teachers (not you, Mr. Wolstenholme).

But now, he’s a warm, sincere, outspoken, eloquent, mature man of God (with a hint of a Texan accent). Look at how he expounds upon 1 John 4:10:
It’s “not that we loved God, but that he loved us and sent his Son to be the propitiation for our sins.” In there we see that two-sided element: We’ve sinned. Sin is evil. It requires a price to be paid, it requires a just price. But at the same time, it’s love that he sent us a means of redemption. And that love is far greater than anything we can do on our own, it’s far greater than any human being can do, although the love of God can be poured through human beings… The key to life is the combination of the Law of God and the Good News of God. The Truth is so important that we need to show people, look, this is our situation, this is how we got here. And here’s how God is taking us out of it.

Or when he’s talking about forgiveness:
Forgiveness is a process: it has a starting point, but it doesn’t have an ending point while we’re alive. It really is something where we have that first moment, we say, look, I forgive you. But tomorrow those emotions are going to come back again, the memory’s going to come back, so we have to remember, okay, look, I am going to choose to forgive again today…

Wow. It’s not every day that I hear a testimony which actually impacts me; it’s usually just “I did bad things, blah blah blah, and then I found Jesus and now my life is different.” But this dude’s for real, you can hear it in the enthusiasm in his voice. God has touched his life, and he’s excited and wants to tell everybody about it.

It really gives me pause, because I realize that I don’t always share his enthusiasm. Am I complacent? I hope I’m not like the seed that fell among thorns. Sure, I try to live my life in a way that would be pleasing to the Lord (and routinely fail, of course), but I really don’t reflect on my salvation the way I should. I take it for granted, when I should be constantly thrilled and amazed and grateful and eager to tell others. “For the wages of sin is death; but the gift of God is eternal life through Jesus Christ our Lord.” Are those just words to me, or do I comprehend them as a statement of fact and a demonstration of unconditional love? Forgive me, Jesus. And thank you.

I highly encourage anyone to listen to Phil’s message, I’ve listened to it like four times now.

Monday, January 12, 2009

Job (the guy, איוב‎, not ‘employment’)

Bob made this statement to me this morning: “I’m reading Job now in my Old Testament readings and I wonder how the Pharisees could blame that dude’s blindness on his supposed sin after reading Job.”

His implication, of course, is that, clearly, the Pharisees’ own Scripture teaches them that it’s possible for a person to endure suffering without having sinned, and so the (apparently common) belief in Jesus’s day that the sick were being punished for a past sin (cf. John 9) reflected poor scholarship on the part of the religious leaders.

Naturally, a visit to Wikipedia was in order.

The Book of Job article has this interesting paragraph:

One Talmudic opinion has it that Job was in fact one of three advisors that Pharaoh consulted, prior to taking action against the increasingly multiplying “Children of Israel” mentioned in the Book of Exodus during the time of Moses’ birth. The episode is mentioned in the Talmud (Tractate Sotah): Balaam gives evil advice urging Pharaoh to kill the Hebrew male new-born babies, Jethro opposes Pharaoh and tells him not to harm the Hebrews at all, and Job keeps silent and does not reveal his mind even though he was personally opposed to Pharaoh’s destructive plans. It is for his silence that God subsequently punishes him with his bitter afflictions.[3].


The Sotah tractate of the Babylonian Talmud can be found here (and this is the page which mentions Job, Jethro, and Balaam as Pharaoh’s 3 advisers). The Talmud didn’t get written until several hundred years after Jesus (Rabbi Hiyya lived in the 3rd century), but it seems likely (to me) that some of the ideas contained therein were already present in the Jewish thought of Jesus’s day.

Hurray for the Talmud; when the Scripture presents you with an idea that challenges your beliefs, all you have to do is invent further backstory to explain it away. Biblical retconning at its finest. How to reconcile Job’s innocence with the idea that the guiltless are not afflicted? Ignore the text and claim that Job must have done something bad after all—despite the fact that the LORD himself said “he is blameless and upright”.

I’m not really sure how widely this belief about Job is held (the Talmud is more up for debate than the Tanakh, and that’s only one of many competing Talmudic references to him), and I’m fairly certain that the Holocaust drastically changed the way Jews view suffering, but it might explain why the Pharisees and even the disciples seemed to think that blindness, lameness, &c. must be deserved punishment.

If either of the two people who might possibly read this happens to be Jewish (somehow, without me knowing about it), I’d love to know how (if?) Job is taught in Synagogue.

Tuesday, September 2, 2008

iSync—Periodically!

My free-from-AT&T (because I am cheap) Sony Ericsson Z310a has Bluetooth comms, so with the help of a third-party iSync plugin, I can synchronize my phone’s contacts and calendar with my computer’s Address Book and iCal.

But I use Google Calendar because it allows me to access my calendar from my laptop or from my computer at work. Up until recently, that meant that using a web browser, because iCal had read-only access. So I would occasionally launch iCal and manually refresh the subscription to my GCal calendar, and I would even less frequently use iSync to push the calendar from iCal onto my phone. But usually I’d just leave Google Calendar up in a browser tab and not even run iCal.

Well a few weeks ago, Google finally added CalDAV support to GCal, which means that I can now use iCal as my calendar program and still have the benefit of viewing my calendar from any computer with WWW access. Great news!

This had the side effect of illuminating the fact that I won’t remember to sync my cell phone as often as I should; I typically only remember to do it once every week or two. Clearly, an automated solution is warranted. Because I am lazy.

Enter launchd.

launchd is OS X’s neato unified replacement for init, rc, inetd, xinetd, at, cron, and pretty much anything else that pertains to the launching of programs in response to the meeting of some sort of criteria (incoming network connection, file modification, file added to directory, time elapse, time of day, &c.). It understands service prerequisites and launches stuff as needed and in parallel, so booting is much faster than it is with Linux’s serial execution of rc.d scripts in alphabetical order of file name (what a hack). Anyway, it’s really great and magical and its only downside is that it continues Apple’s trend of using Property List XML files for everything under the sun.

Luckily, Peter Borg (Swedish, not evil alien) wrote the wonderful Lingon, which provides a simple GUI for me to describe what I want my LaunchAgent to do and generates the appropriate XML behind the scenes (and happily uses intelligible indentation, unlike most automatic code generators). It also knows where to put the resultant file (~/Library/LaunchAgents).

iSync is a scriptable application, so I can execute a command like
osascript -e 'tell application "iSync" to synchronize'

and it will start to (asynchronously) perform a sync. Unfortunately, iSync doesn’t quit when it’s finished. I need to wait for the sync to finish, and then tell it to quit. Something like (all on one line):
osascript -e 'tell application "iSync" to synchronize' >/dev/null && while [[ `osascript -e 'tell application "iSync" to get syncing'` = true ]]; do sleep 1; done && osascript -e 'tell application "iSync" to quit'

(I tried it as one big AppleScript, but the first "get syncing" returned false. There’s a race condition or something. It appears to always work with sequential invocations of osascript.)

A LaunchAgent can invoke any single command-line command (or launch an app), but it can’t do fancy stuff like pipes or shell boolean interpretation. So, something like the incantation above is out of the question. It has to go in a file as an executable shell script.

So, I gave Lingon a unique name for my agent, I pointed it to the location of my script, and I clicked the check box for "At a specific date:" and told it to run every day at midnight. When I saved the file, Lingon told me that I would have to log out and log back in for my new agent to work. But it isn’t true. launchctl to the rescue!
launchctl load path/to/file.plist


Note that if you make a change to the XML, you have to launchctl unload and launchctl load again for launch to notice the change.

Here’s the final XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>local.jhope.PeriodicISync</key>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/isync</string>
  </array>
  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key>
    <integer>0</integer>
    <key>Minute</key>
    <integer>0</integer>
  </dict>
</dict>
</plist>


For the shell script itself, I decided to write one in scsh (just because; yes, I know the scheme shell is total overkill for a script this short, but how often do you suppose people have Scheme code calling AppleScript?). It looks like this:

#!/opt/local/bin/scsh \
-o threads -e main -s
!#

;; I have to load the threads structure to get the sleep function

;; Get iSync to start syncing
(define (synchronize)
  (run/strings (osascript -e "tell application \"iSync\" to synchronize")))

;; Tell iSync to quit
(define (kill-isync)
  (run (osascript -e "tell application \"iSync\" to quit")))

;; Returns #t if iSync is still syncing
(define (synchronizing?)
  (let ((result (run/strings
                 (osascript -e "tell application \"iSync\" to get syncing"))))
    (string= (car result) "true")))

;; Waits for iSync to finish and then tells it to quit
;; (polling once per second)
(define (kill-isync-when-done)
  (sleep 1000)
  (if (synchronizing?)
      (kill-isync-when-done)
      (kill-isync)))

;; Start a sync and then kill iSync when it's done.
(define (main prog+args)
  (synchronize)
  (kill-isync-when-done))


Of course, I could also have just defined a single function:

(define (main prog+args)
  (run/strings (osascript -e "tell app \"iSync\" to synchronize"))
  (let loop ()
    (sleep 1000)
    (if (string= (car (run/strings (osascript -e "tell app \"iSync\" to get syncing")))
                 "true")
        (loop)
        (run (osascript -e "tell app \"iSync\" to quit")))))

but it seems to me like that reduces script length at the expense of hiding the logical operations that the separate functions illuminate.

Regardless, I now have iSync update my phone every night without me having to do anything. Qapla'.

Monday, April 21, 2008

Beware Italians bearing Matzoh

Balducci’s, the expensive hippie grocery store “Food Lover’s Market™” where I go for lunch sometimes—like today—and where Bob and I had breakfast at JFK on the way to Hong Kong, had Passover Brownies for sale today. They didn’t have flour as an ingredient (duh?), so I suspect that they are similar to the “Warm Flourless Chocolate Waffle” available at Mike’s “American” Grill (which is very good, although they don’t warn you that the ice cream has caramel on it).

Anyway, on my way out I noticed that they had a whole Passover Holiday Menu (PDF) (“A memorable Seder dinner starts with our menu.”), so I picked one up to see what else they had. You can buy Matzoh Balls, Gefilte Fish, Passover Fruit Cheesecake, and Spinach “Matzsagna”. It all sounds very festive and convenient for Jewish families who aren’t so into cooking.

But then I noticed this in small print at the bottom of the last page of the menu:
NOTE: Many items on this menu are prepared in facilties [sic] that may process peanuts, nuts, shellfish, or other potential allergens. While all of our food is fabulous, it is not kosher.

THEN WHAT’S THE POINT OF HAVING A PASSOVER MENU?!

Very strange. I’m so glad I don’t have to worry about this sort of thing. Chag Pesach Kasher v’Same’ach, everybody.

Monday, April 7, 2008

([JD]u[rt]y\s*){2,2}

Today, by order of the Chief Judge of the Circuit Court of the City of Alexandria, Virginia, I was summoned to serve as a petit juror. (The term has to do with the number of jurors being typically smaller than in a grand jury; it is not, in fact, an affront to my stature.)

The summons said to arrive at 8:30, so I left my apartment slightly before 8:00 to give myself time to find parking. It turned out that there were spots available in the underground garage below the courthouse, so I was there and checked in by 8:20. It was a very pleasant waiting room, with a Dvořák waltz coming from the radio (which was tuned to WETA).

The man who checked us in, Travis Sweitzer, was very gracioso. He went out of his way to make everyone feel at ease and welcome and wanted, and he really seemed to enjoy his work. He sort of looked like a thinner, more fit Jimmy Kimmel, but with a goatee and infinitely less annoying.

Once everyone had arrived (three or four showed up right at 8:30, one a little after 8:40 (slacker!)), we watched a video about the Virginia justice system. I learned that in Virginia, you are not required to serve as a juror more than once every three years (so I'm good until 2011). I also learned that a jury is not always a group of 12. That's only for criminal trials for felony offences. Trials for misdemeanor crimes have 7-person juries, and juries for civil cases have 5-7 members, depending upon the magnitude (in dollars) of the lawsuit.

There were seventeen of us there, so clearly we wouldn't all be needed. The process by which the lawyers eliminate potential jurors is called voir dire, which is a French phrase meaning, "I think this juror would side with the other guy, so he must go".

Having watched the orientation video, we were now ready to serve as jurors. There was some time remaining before we were to go to the courtroom, so Travis called us up to get our $30 expense reimbursement (which he stressed was a reimbursement and not earned income - that means it's not taxable, w00t).

Armed with three Hamiltons each, it was now time to enter the courtroom. It really wasn't very impressive; sort of what I would expect if Matlock had been made with the budget of Wayne's World (before Rob Lowe got involved). In place of the elegant varnish and hard flooring of the courtrooms of Law & Order, we had white and blue paint and carpet, and plastic seats.

The judge was a nice lady from Fairfax, presumably filling in for the vacant third judgeship. She introduced the lawyers (one for the plaintiff, two for the defendant) and told us about the case. It was a personal injury civil suit. This one Chinese lady (wearing yellow with wavy hair) was accusing another Chinese lady (short hair, dressed in orange; made her look like a convict - bad choice) of assaulting her in the parking lot of a grocery store in Falls Church back in 2004 and causing her to break her ankle.

2004! Justice sure is swift, huh. I guess it's okay; Justice is supposed to be blind, and blind people are usually slow since they have to be careful not to run into stuff. Except for Rutger Hauer. He's like Daredevil but cool.

Anyway, then we got to the voir dire part. The plaintiff's attorney asked us (not in so many words) whether we were predisposed to think of him as an ambulance chaser, and if we would be able to award compensation for expected future pain and suffering. Two of us expressed reservations about that, saying it seemed like it would be difficult to predict the future. I asked what discount rate we would be asked to apply, but said I'd try my best to decide in accordance with the law. Another guy said he felt that in general there are too many frivolous lawsuits in America, but didn't specifically feel that way about this case (yet?).

The main defense attorney asked some stuff, too, and paid particular attention to the two jury candidates who had broken their ankles in the past (one goofing around as a kid, the other in Vietnam). They both assured him that their past experience would not bias them in favor of their fellow broken-ankle comrade. I guess they don't have Anklestrong anklets.

After the questioning, the lawyers marked down who the wanted eliminated, the clerk tallied the list, and… my name was on it. Along with most of the other people who had spoken up during voir dire. I think both of the broken ankle guys got to stay, though. So at that point Travis led ten of us out of the courtroom and wished us farewell. It was almost 11:00.

I used my $30 to pay the $6 parking fee and then I was out of there. I have no idea who won the case.

Tuesday, April 1, 2008

Bob and Jamie's Adventures in Hong Kong, Day 7

Sunday morning we checked out of our hotel. The concierge offered to hail a taxi for us, and made sure the driver knew where we wanted to go (Hong Kong Station, to catch the Airport Express).

We only had to wait a couple minutes before the train was on its way toward the airport. On the way, we passed by Tung Chung and saw the waterfront where we'd walked around as well as the Ngong Ping cable car. It was a lot more meaningful to me this time (I'd seen them going the other way the first day, too), since now I knew what the buildings were and where the cable car went.

When we got to the airport, we got our boarding passes and checked our bags (we had already checked in online back at the hotel), and then went to our third Burger King (which Bob says was the first one established of the four) for breakfast. Then we stopped by the Disney store so he could buy his cousin a toy and proceeded to our gate.

Before long it was time to board, and I fell asleep almost right away. I woke up for the meals and made it through a couple movies, but I slept far more on the return flight than I had on the flight there. This time we must have been riding in the jet stream, because rather than fly north over the Pole, we took a more easterly route over Japan and along the coast of Alaska.

When we were descending into New York, I marveled at the blue sky and all the houses in Queens and Nassau County; you just don't see anything like that in Hong Kong, which is predominantly smog-grey skies and apartment buildings. I was glad to be back in America.

We got through Customs without incident, rechecked our bags with American Airlines, and got through security with time to spare before our final flights back to Boston and Washington, so we grabbed lunch at the Brooklyn Deli (there was an ad saying "we'll make you a sandwich you won't refuse") and ate it by the gate. Before too long, it was time for me to board (10 minutes before Bob), so we parted ways and I found my seat on the plane. I started to read a book, but as soon as we'd taken off, I fell asleep again and didn't wake up again until we were flying over Great Falls on our final approach into National.

When the plane stopped at the gate, I could see the Jefferson Memorial from my window, and directly behind it, the Washington Monument.

Home at last.