Note to Self

Remember to push the popcorn button twice on the microwave. Otherwise it only runs for enough time to pop one of those little bags of popcorn and it will leave the bag half-popped. And even if you rescue it immediately afterward and add more time, it will still burn your popcorn.

Also, the iTunesCheck website seems to be down; something is wrong with Trac and I can’t figure it out. Until I get it resolved, you can download it here.

Portrait of a Friend

Sorry it’s been so long, folks.

I was just browsing through some of my old files and I found this sonnet I had to write for an English class I took a few years ago:

Some fighting words I heard my friend did say.
Again he spoke and then he raised his hands.
A test of me so I did join the fray.
I kicked and punched and made a right good stand.

Some trying words I heard my friend did state.
Again he spoke and then he raised his voice.
A test of me but I did not berate
him, no, instead I did forgive by choice.

Some crying words I heard my friend did wail.
Again he spoke and then he raised his head.
A test of me so I did hold him, frail.
Sometimes we sacrifice for others bled.

But fighting, trying, crying words don’t break
our bonds, for bonds are what we choose to make.

It’s a little weird the first time through because I’m not very good at this and I had to fit it into the sonnet’s tight pattern. I think it gains a lot on the second time through, after you know the punchline, so to speak.

I have also located a story that I wrote for the same class. This is a continuation of Anton Chekhov’s “The Lady with the Pet Dog“. We read the story in the class, and our assignment was to write our own ‘next chapter’, so to speak, since the story doesn’t really have an ending. The story is not incredibly long so if you have a little bit of time, I would encourage you to hit that link and read the story (all four parts of it, you might want to just download the PDF) before reading my ending.

[years and years later]

“Complicated and difficult, indeed,” mused Gurov. A moist air blew off the sea and dallied briefly with his pajamas before becoming bored and withdrawing to return to the water. He was sad and shivered. The balcony seemed suddenly a forbidding and lonely place until a hand, white and simple, slid easily around his waist and he looked into her eyes and remembered his purpose. She might have been any woman but was not; he, any other man but the one he was now.

Gurov examined the ring on her finger and then her fingers and determined that he loved them not for any physical reason but because of what they represented. She laughed and her life had not faded or withered, so he turned around to kiss her and the love he had for her was real. He remembered vaguely the man he used to be, uncaring, insensitive, bored, and could not comprehend why chasing women had seemed to him a worthwhile pursuit. That man seemed like a foreigner and his memories were like those of a picture book, like events that happened in his presence but not to him. His life was sharp, now, and had a preternatural clarity and color that was present not in small, short bursts as before but all the time and everywhere. It was funny how much real love changed a man, or changed his outlook at least. A stab of regret for a life misspent caused him to shudder, and she pulled back to look at him.

“Dimitri–“, she began, but their daughter came out of the apartment and she could not finish. A conversation about something feminine which Gurov could not understand ensued and the moment was lost. He returned to his contemplation of the waves and the sound seemed alive to him, seemed different with every crash of every wave and spoke not of eternal peace but of joy.

“Dimitri, we are going shopping and then to lunch. We shall return by four o’clock at the latest.”

“Alright,” he replied, and kissed her goodbye, and kissed his daughter. He watched them leave, watched them out on the street below, laughing gaily and holding onto their hats as the wind whirled the dust around. He, too, laughed gaily and trembled with joy and didn’t know what to do except to whistle.

In the next instant he looked down and a woman was standing below, looking up at him with grey eyes and a slender neck. A little dog barked excitedly at her feet. Gurov gripped the railing and thought that he might suffocate, for he could not catch his breath, could not breathe in and couldn’t think of anything to do except to stand there.

“Anna Sergeyevna,” he thought, but she moved and it was not Anna Sergeyevna. Gurov’s breath came out all at once and he collapsed into a patio chair like a drunken man as painful memories clamored to be given attention.

“What a fool I was,” he muttered while he thought of how he had acted with so many women. Girls, really, a lot of them. He wondered at how it had taken somebody like Anna Sergeyevna to finally make him understand what love was, what love really was. Something about her had broken the crust on his heart, something in the way she hated herself afterward or something in the way she remained loyal to her flunkey even through what had happened between them. She had never been comfortable with their affaire, which for a time turned into marriage but quickly mutated to divorce. They did not love each other.

Gurov’s face burned with shame and his tears were trails of fire that could not be quenched. His wife had been so forgiving when he came crawling back to her. There was no reason for it and he was left to conclude that she had all along perceived some type of connection between them, and that because she knew this she loved him in spite of his activities. Love, he realized as he stared at the breakers, isn’t just a feeling. Love isn’t looking for some mystical soulmate who is already perfect in every way. Love is a choice and a chore that comes not out of thin air but out of commitment to another person, that in spite of her rough edges or the way she might seem narrow, he would continue trying. She might be staid and unintelligent, but if she was then he was prideful and thoughtless, and so they overlooked each other’s faults. In that way love is a challenge, the greatest of all, because although he might at times be scared of her, he now understood that it was because she was better than he, and that perhaps the biggest part of love is humility.

The sea wind returned to inquire as to whether he had become any more interesting since last time, so Gurov spoke to it. “Yes, love is about faithfulness. That is why I never loved her but she always loved me, and in the end her love caused me to love her back. That is the quality about Anna that struck such a chord in my heart.”

The wind seemed satisfied by this and continued to blow his way. As he smelled it, Gurov laughed again, and his tears this time were of joy. He had done terrible things to his wife, yes, wretched things, but none of that mattered now because she had forgiven him, and her assurance was pure and perfect and all that he needed to survive because it translated unequivocally into real love. Gurov grinned the senseless grin of the hopelessly lost and felt that all the world might be one long sunny day.

I was supposed to try and write in the same style as Chekhov and I think I did a pretty good job. I’m actually really surprised, reading this over two years later, at how good it is. Well, I like it, at any rate.

I think it’s interesting to see that the theme of these two writings is the same: bonds are what we choose to make; love is a choice and a chore. It seems like we’re always caught up in looking for the perfect person, the perfect soulmate, you know? Why is that? And if we do manage to find someone who might fit the bill, we end up breaking when that person doesn’t turn out to be exactly as we imagined instead of bowing down to make it work. Or worse, we ruin it all by trying to change that person into our image through some misguided sense of faithfulness. Man, it’s like, we’re all so broken; we’re like a clock that’s been smashed but keeps on trying to tell the time.

I seem to be the most broken of anyone I know. Maybe that’s true, maybe it’s just personal insight and everyone else’s brokenness is just hidden beneath the surface. I suspect the latter but can only observe on the former. Of course I’m not just speaking about relationships here. It seems to me that most everything I do is destined to fail in some fashion, and that if anyone is in need of overlooking then it must be me. This is a downward spiral; if I think about it for too long the burden crushes me.

The last paragraph of the story above is powerful to me. I have no idea what I was thinking about at the time but I look at it now and all I can see is Jesus. I have done terrible things, yes, wretched things, and will continue to do so despite my best intentions, but none of that matters now because He has forgiven me, and His assurance is pure and perfect and all that I need to survive because it translates unequivocally into real love. This is the relationship that never breaks because its primary component is forgiveness. Forgiveness is a lot of work, it’s something you choose to do and it’s a chore. I think it’s true that the biggest part of love is humility: am I willing to let somebody else’s broken tickings be more important than myself? Thank God that Jesus was! So then I read Psalm 42:5 and grin the senseless grin of the hopelessly lost, and feel not the overwhelming despair of failure but the exploding joy of salvation.

CruiseControl.rb cron scheduler

Chicken florentine? More like chicken yum-entine. Get it with a couple of rolls for a delicious lunch!

I’ve been bumbling about with CruiseControl.rb lately and found it very enjoyable. The idea of continuous integration has intrigued me since I first learned about it, but I haven’t had the chance to put it into use until now. At first I was hideously confused about the difference between CC.rb and regular ol’ CruiseControl. It turns out that there is no commonality between the two except for the name, and that ThoughtWorks built both of them (although probably by separate teams). The full-blown CC is written in Java and seems to be an unwieldy beast that does everything you could think of. CC.rb is a complete from-scratch alternative written in Ruby that is very light and focused for Ruby on Rails applications.

When I say light, I mean light. It just sits there and runs rake whenever somebody checks something in to your repository. Out of the box, it does not support the ability to, say, run a task on a schedule. If you want this type of feature, you either need to find someone who has written it already or you need to write it yourself. The former option is unlikely because CC.rb seems to be relatively new and, true to the theme of RoR, few people seem to use it for anything other than exactly what it was built for. However, I needed to run potentially lots of tasks on a schedule or at intervals, as part of the build system. For these reasons cron itself wouldn’t work, and Petrik’s cron scheduler wouldn’t work either.

That left writing it myself. This turns out not to be nearly as intimidating as it first sounds, partly because it’s Ruby (and not Java), partly because CC.rb is well architected, and partly because CC.rb is so lightweight that there’s just not that much complexity to muddle through. Just tell CC.rb “don’t use your scheduler, use mine!” and you’re off and running.

Here’s the setup I have: CC.rb runs its normal cycle, i.e. check for changes, build, notify. I then use the post_build_action plugin to kick off my Capistrano task, which deploys everything to the unstable server. This is neat, because whenever you visit the unstable server, you are guaranteed to be looking at the very latest version of the code (that actually built :P). Unfortunately, if you have a long-running task which interacts with said unstable server, you would really prefer if the code didn’t change underneath you. In my case, every night I want to start a large set of Selenium browser compatibility tests (which the built-in scheduler doesn’t support) and I need to block the build so that it doesn’t deploy while the tests are running (which CC.rb doesn’t support at all). I would also like to take the results of those Selenium tests and report them through the CC.rb dashboard.

I’ve written a scheduler that does the trick pretty well. The actual task scheduling part leaves a lot to be desired, and the reporting is not great (it just dumps the output from the task into the build artifacts directory). It’s a decent first-shot attempt though.

To configure, you’ll need to add the following lines to your cruise_config.rb:

project.scheduler = CronScheduler.new(project)
project.scheduler.tasks < < CronTask.new(:name => 'Test Units', :at => 15.seconds, :task => 'rake test:units', :disable_build => true)

The first line tells CC.rb to use CronScheduler as the project’s scheduler. The second line is an example task. You may add as many tasks as you like. Tasks are forked and execed so they run as their own process.

You can disable the build with the "disable_build option. This means that CC.rb will not poll the repository or listen for explicit build requests from the dashboard until the process has finished running. You may safely have overlapping tasks disable the build; the scheduler tracks the number of tasks that have disabled the build.

You can schedule a task with either the :at or :every option. at runs the task at a certain time; for example at 15.seconds past the minute (every minute), 17.minutes past the hour (every hour), or 23.hours past the day (every day). every runs the task every so often; for example every 19.minutes since the builder started. This part has a lot of room for improvement.

Okay, enough from me. Get the code! And, of course, contact me with comments, suggestions, or (better yet) patches.

(ChristmasList::2007 [beta 1]).release

http://stormsilver.net/christmaslist

There are a couple of issues still, most notably that the help is still from last year’s version (although it’s still pretty much applicable). Also, the group selector is not very well designed (you have to be in at least two groups to see it). But, go ahead, bang on it, see what breaks. :)

Let me know when you have questions. There’s actually a useful feedback function built-in, so you should use that because it goes straight to my inbox.

What I Did Today

6:11 – Woke up to alarm, sat up in bed, stared out the window into the night wishing I could lay my head back down
6:15 – finally motivated myself to get up and go to the shower
6:34 – got out of the shower, went downstairs to put on my shoes, sat on the stairs dozing
6:48 – roommate came down the stairs, I jumped up pretending like I had only been there a few seconds, went for a walk
7:00 – returned from walk, went upstairs for morning devotions with my housemates
7:30 – went up to the Fortress of Solitude for some time alone with Jesus
7:54 – came down, put on hoodie, realized I forgot to brush my teeth, took off hoodie, brushed teeth, put hoodie back on, stared in the mirror and dozed for a few moments
8:07 – left for work. Put on “Let’s Not Forget the Story” by Foolish Things. Good album. Decided to stop at McDonald’s for breakfast!
8:14 – arrived in drive thru, settled on a Sausage Egg McMuffin, Sausage McSkillet Burrito, and large coffee
8:17 – left McDonald’s $6.03 lighter, but with the delicious scent of coffee
8:27 – arrived at work, set my stuff down, went to my 8:30 all-hands meeting
9:15 – sat down at desk for the first time, checked email and received emails announcing the all-hands I just got out of, checked facebook
9:20 – prioritized task list and ate McSkillet Burrito
9:30 – went to daily stand-up meeting
9:40 – got to work on fixing task #1: intermittent mongrel timeout on the unstable server
10:15 – reheated the last bit of coffee (man I hate cold coffee)
10:57 – went to all-hands meeting with The Consultant
12:06 – sat down at desk again, checked calendar for the afternoon (meetings), decided not to work on task #1 anymore (too hard), decided not to work on task #2 (also too hard), checked facebook, thought about reheating Sausage McMuffin for lunch, read news
12:20 – started writing list of things I did today
12:30 – finished first half of list, reheated Sausage McMuffin and fixed a nice hot cup of tea (Irish Breakfast)
12:43 – decided to work on task #2 after all, researched some stuff about it on the Web-o-tubes
1:15 – went to my 1:00 technical discussion meeting when everyone arrived from lunch. the first tip that it was going to be a bad meeting was when I saw that 50% of the attendees were not technical people.
3:50 – left the meeting, having written down five interesting points in the first 40 minutes, no action items, doodled for 45 minutes, and surfed the web on my iPhone for 30 minutes.
4:01 – went to an all-hands meeting
5:02 – sat down at my desk again, having learned a few things, but overall just wanting to cry because I was so bored all day long and I didn’t get anything done.

Let me remind you about Acromania. I am wanting to wrap this thing up in the next few weeks in time to send you your prize for Christmas, so maybe I’ll do some speed rounds or lightning rounds. In fact, let’s start now: the winner for this week will receive double points!

Also, I have just installed a plugin which validates your humanity via some JavaScript. This will hopefully stop me from having to push my eyeballs past 300-400 comment spams every few days to make sure no actual comments slipped through. Let me know if it causes issues.