Sunday Sermon: Fixing the wrong problem

The sound of crying echoed down the hall, jolting my ears with the harsh harmonics natural to the vocal folds of your average one-year-old human child. For a few scant moments, in half-awake state, I reflected on how interesting it was that Nature has provided us with such a stimulus-response pattern, engendered in our forbears and, with rare exception, honored by parents, to force action to the distress of an infant. Equally remarkable are the changes to the tonality of their cries, such that even by the age of three years, their tone is not so tuned as to arouse paternal responses in strangers, but instead engender annoyance.

The sound of crying echoed down the hall, jolting my ears with the harsh harmonics natural to the vocal folds of your average one-year-old human child. For a few scant moments, in half-awake state, I reflected on how interesting it was that Nature has provided us with such a stimulus-response pattern, engendered in our forbears and, with rare exception, honored by parents, to force action to the distress of an infant. Equally remarkable are the changes to the tonality of their cries, such that even by the age of three years, their tone is not so tuned as to arouse paternal responses in strangers, but instead engender annoyance.

All these thoughts flashed through my head in the split-second before the next eardrum-throbbing shriek filtered into my half-awake consciousness. I could hear the blood rushing into my ears to compensate to repair the damage from the influx of sound with each subsequent scream. And yet, I remained, lethargic and unmoving. I briefly contemplated the conflicting desires inside my head: the one to honestly help my 18-month-old son, the second to remain sleeping in bed, the third, that little mean voice in the back of my head, to “just shut that kid up”.

Voice number two prevailed. I lay in bed, breathing shallowly, secretly hoping my spouse would arise to assist the boy.

No such luck.

I felt a hand rest gently on the outside of my right thigh. “Matthew, would you get him please?” my wife asked softly as the moonlight filtered in horizontal bands through the vinyl blinds of our bedroom window. I responded by arising and stumbling my way down to Elijah’s bedroom.

Upon my arrival in the room, the cries subsided to sniffling sobs. I picked up our youngster and held him for many long minutes. Within ten minutes, he calmed down, his head dropped to my shoulder, and soon thereafter I could hear the soft sounds of his regular breathing. I carefully laid him back down in his crib, covered him with a comforter, and returned to my bed.

My clock read 11:49.

I had just fallen into another dream, this one about a robot politician named “Fuzzy Logic” who was campaigning for the position of dog catcher for Tooele County, when those obnoxious sounds began percolating again into my subconscious.

“Mah!” (throb) “Mah!” (throb) “Mah-hah-hah-hah-waaaaaAAAAAAHHHHHHH!!”. Blood sounded as if it were being poured by the gallons through the capillaries in my eardrum at this point, a virtual Niagara Falls of whooshing sound in response to each cry.

This time, rather than silently losing to the “rule of the first one to ask”, I was proactive. (In case you’re unfamiliar with that rule, it is a marital convention for many couples, including mine, that if both you and your spouse want something done, the first to be asked to do it is the one who does it. Which often leads to races to be the first to ask the other to do some unpleasant task.) “Honey,” I began, and felt her body stiffen as leaned my hand on her back, “would you please get him this time?” Christy stood up. A few moments later, Elijah’s room-mate and older brother Zach sleepily grumbled into the bedroom, blankets and pillow wrapped around himself, and flopped onto our bedroom floor, snoring within moments. I could hear Christy gently consoling Elijah in the boys’ bedroom, speaking softly in his ear to calm him down. I could imagine her holding him, balanced against her several-months-pregnant belly, stroking his back and providing reassuring pats. Eventually, I could tell that she, too, was hearing the soft sounds of regular breathing from him, indicating that he was asleep, and she laid him down, then returned to our bed.

A few minutes later, nerve-wracking cries again echoed down the hall. Christy arose without prompting, less patient this time. She now spoke sternly to Elijah, informing him that this is sleeping time, not play time, and that he must sleep! She returned to bed, obviously agitated at the disturbance. I was equally upset at having my rest interrupted. “Sweetheart, would you like me to get you some earplugs so you can rest?” I asked.

“Sure, do you have some handy?” she responded.

“Yes, they are just downstairs in my backpack,” I said. “I’m wide-awake right now, though, anyway.”

“Then why don’t you take him downstairs to snuggle and calm him down?” she suggested.

“OK,” I replied. I arose in my pajamas (even in mid-September, Utah nights get quite cold), blearily felt my way past the inert body of my oldest son on our floor, tried to avoid stubbing my toe on the toys scattered in the hallway, and returned once more to Elijah’s room. I picked him up, and it seemed as if he were ready to repeat the “calm me down, put me down” drill. This time, though, I finally decided to do things differently.

I carried my boy down to the family room, where we keep the diaper-changing supplies. I changed his diaper and found that he’d had a “stealth poopie”. This is poop that seems to have no odor, and if you are around for the emission, often also has no sound. The only reliable method of detection, short of changing a diaper, is to stick your finger in there and dig around. At least, that was my mother-in-law’s advice to me as a newlywed 🙂

Anyway, after a speedy change, I put him back to bed. I paused at my bedroom to deliver the earplugs to my still-awake spouse. This time, a bit wiser, I didn’t even attempt to return to my own bed. Sure enough, within moments Elijah was screaming, so I yet again picked him up and carried him back downstairs. I sat him in his chair in the kitchen and buckled him in.

A wide grin split his chubby face into a caricature of himself, as if to say “duh, Dad, you finally got it, and it only took you TWO HOURS!”

I heated up a frozen pancake dog (just like a corn dog, but it’s a sausage wrapped in pancake batter, rather than a hot dog wrapped in cornbread batter) in the microwave and handed it to him. He gratefully wolfed down half of it, then gave me a very meaningful look, one eyebrow raised, as he offered the remaining half of the pancake dog to me. I grabbed a small plastic bag and opened it. He dropped it in, and I wrapped the food up and put it into the refrigerator. Then Elijah raised his arms in the “all done” signal (we have a few sign language signals for various things, since he can’t speak yet — bizarre that, if the boy was hungry, he didn’t give me the “food” sign), I picked him up, wrapped him in a blanket, and returned him to bed. He snuggled his head in next to his special Build-A-Bear teddy bear, giving me a small smile. I softly closed the bedroom door behind me as I crept downstairs to my computer.

Finding myself still wide-awake, I flipped on the computer to write up my reflections on this midnight episode. All told, the situation wasn’t wrapped up until nearly 1:45 in the morning. It took us more than two hours to figure out what the child wanted, and once his needs were satisfied, he gratefully returned to our preferred late-night behavior of sleep rather than wailing.

This leads me to a question:

How often do we, misunderstanding the nature of a problem, repeatedly try to pursue avenues of treatment that aren’t working?

Too many times, I think humanity is simply fixing the wrong problem. We attempt to offer consolation and comfort an infant who is simply screaming because he’s hungry. Yet, for a while, the solution appears to work, until the next episode draws us from our comfortable slumber and into the pain of another human being.

I’ll leave it to you to draw the parallels in your own life. I’m reminded of the old definition for insanity: “Insanity is doing the same thing over and over again expecting a different result”. Tonight’s episodes were certainly an “eye-opener” for me!

Dang, this blog took an hour to write. It’s 3:43 in the morning. Back to bed for me. For sure, keeping up with this online journal is an effective treatment for the mental barricades I’ve built over the last decade.

Found an old friend!

I found an old friend’s web site. Jenny Gagne! I’m pretty sure the name means nothing to most of you, but her site looks interesting and promotional of her artwork. Which reminds me, I need to get a “listen to my music” and “buy my music” link up here some time so people don’t have to dig through months of old blog entries to find the songs that are going to show up on my CD in December.

Anyway, she keeps up with her weblog, I look forward to catching up on her life. We met back at Ridgeview Jr. High School. Unfortunately, I can’t remember exactly how we met. I think it was just through a class or something. There are some stories that are incredibly vivid because they were so weird (like meeting Jon Brusco on the bus, that was a very odd encounter), but in Jen’s case… darnit, I can’t quite remember. I remember her little brother, Stefan was fun, but incredibly, incredibly brainy. He’s pretty active in developing modules for Neverwinter Nights, a game I used to play more than I do now.

The older I get, the more I need friends who knew me when I was young.

I found an old friend’s web site. Jenny Gagne! I’m pretty sure the name means nothing to most of you, but her site looks interesting and promotional of her artwork. Which reminds me, I need to get a “listen to my music” and “buy my music” link up here some time so people don’t have to dig through months of old blog entries to find the songs that are going to show up on my CD in December.

Anyway, she keeps up with her weblog, I look forward to catching up on her life. We met back at Ridgeview Jr. High School. Unfortunately, I can’t remember exactly how we met. I think it was just through a class or something. There are some stories that are incredibly vivid because they were so weird (like meeting Jon Brusco on the bus, that was a very odd encounter), but in Jen’s case… darnit, I can’t quite remember. I remember her little brother, Stefan was fun, but incredibly, incredibly brainy. He’s pretty active in developing modules for Neverwinter Nights, a game I used to play more than I do now.

The older I get, the more I need friends who knew me when I was young.

mod_gzip and barnson.org

I just enabled mod_gzip for barnson.org, brusco.org, and outlanders-outfit.org. I hope you notice a really big speedup! gzip compression is supported on newer versions of Internet Explorer, Mozilla, and other browsers.

Setting it up was a really straightforward process on this FreeBSD server (as root):

  1. # cd /usr/ports/www/mod_gzip/
  2. # make
  3. # make install
  4. I then edited /usr/local/etc/apache/httpd.conf and removed the pound sign from the front of these two lines:
    • LoadModule gzip_module libexec/apache/mod_gzip.so
    • AddModule mod_gzip.c
  5. Then I tacked the following lines onto the end of the httpd.conf:

    # [mod_gzip configuration]

I just enabled mod_gzip for barnson.org, brusco.org, and outlanders-outfit.org. I hope you notice a really big speedup! gzip compression is supported on newer versions of Internet Explorer, Mozilla, and other browsers.

Setting it up was a really straightforward process on this FreeBSD server (as root):

  1. # cd /usr/ports/www/mod_gzip/
  2. # make
  3. # make install
  4. I then edited /usr/local/etc/apache/httpd.conf and removed the pound sign from the front of these two lines:
    • LoadModule gzip_module libexec/apache/mod_gzip.so
    • AddModule mod_gzip.c
  5. Then I tacked the following lines onto the end of the httpd.conf:

    # [mod_gzip configuration]
    mod_gzip_on Yes
    mod_gzip_minimum_file_size 300
    mod_gzip_maximum_file_size 0
    mod_gzip_maximum_inmem_size 100000
    mod_gzip_keep_workfiles No
    mod_gzip_temp_dir /tmp
    mod_gzip_dechunk Yes
    mod_gzip_item_include file \.htm$
    mod_gzip_item_include file \.html$
    mod_gzip_item_include file \.php$
    mod_gzip_item_include file \.pl$
    mod_gzip_item_include file \.cgi$
    mod_gzip_item_include file \.phps$
    mod_gzip_item_include mime text/.*

That’s all there is to it! And the speedup, even on my DSL line, is pretty amazing. I’m in the middle of downloading a bunch of stuff at the moment, and the barnson.org pages squeak through so much faster it’s insane! I did several tests with it turned on and off, and gzipping pages to my Mozilla browser is noticeably faster. It should reduce main-page load times for people on modems from about 22 seconds to around 7 seconds.

How to use WebCalendar

I noticed with interest that, although the product WebCalendar has an excellent installation guide, and decent on-line help, it has no real basic description of how to do things.

Since I work at a bank with non-technically-skilled co-workers, I felt we needed something that would gently introduce them to how to use WebCalendar. You are free to copy the below text for use on your own Intranet or wherever else; as usual, my blanket copyright at the bottom of this site covers this document as well as others. All I require is a prominent link back to the URL from which you initially copied the text.

If you choose to use this as an introduction for your users, won’t you please leave a comment? It’s not much, but it is encouraging.

I made one code modification to WebCalendar: I changed the includes/styles.php file, in the “.navlinks” section, to:

text-decoration: underline

My users are not very technically competent, and although the default css causes “hover” actions over links to glow, they still have trouble finding the links unless they are underlined like everywhere else on the web.

And away we go!

HowToUseWebCalendar

The WebCalendar program is remarkably simple to use, yet has some very powerful features if you choose to take advantage of them.

I noticed with interest that, although the product WebCalendar has an excellent installation guide, and decent on-line help, it has no real basic description of how to do things.

Since I work at a bank with non-technically-skilled co-workers, I felt we needed something that would gently introduce them to how to use WebCalendar. You are free to copy the below text for use on your own Intranet or wherever else; as usual, my blanket copyright at the bottom of this site covers this document as well as others. All I require is a prominent link back to the URL from which you initially copied the text.

If you choose to use this as an introduction for your users, won’t you please leave a comment? It’s not much, but it is encouraging.

I made one code modification to WebCalendar: I changed the includes/styles.php file, in the “.navlinks” section, to:

 text-decoration: underline 

My users are not very technically competent, and although the default css causes “hover” actions over links to glow, they still have trouble finding the links unless they are underlined like everywhere else on the web.

And away we go!

HowToUseWebCalendar

The WebCalendar program is remarkably simple to use, yet has some very powerful features if you choose to take advantage of them.

BASIC USAGE

To create an appointment:

  1. Click the plus sign (+) for the day and hour in which you wish the appointment to start, or click the “Go To: Add New Entry” link at the bottom of your screen. non-geek translation: Look for the phrase “Go to:” at the bottom of your screen, and read to the right until you see the underlined words “Add New Entry”.
  2. You will now be at the Add Entry screen. Most options here are self-explanatory. Enter appropriate values for the date, time, duration, and priority. Note: “access” is a special field! If you leave it at “public”, any other user may view this appointment. If you set it to “confidential”, only you or those you have designated as your assistants may view it.
  3. Note that you and others will not be emailed reminders of your appointment at scheduled times by default. You first need to check “yes” next to “Send Reminder:”, then enter the time before the appointment at which the reminder will be sent. Times less than five minutes are not useful, since the calendar application only checks to see which appointments it should notify about at five-minute intervals.
  4. From this point on, the options in the screen are more advanced, and only necessary if you wish to set e-mail reminders, invite other participants, or schedule repeating events. Important Note: WebCalendar? will notify you of conflicts in scheduling with your invitee, and allow them to correct it. It is not configured to allow multiple appointments scheduled for the same time, as some other calendars do.

To allow someone else to write to your calendar:

  1. WebCalendar? allows you to designate Assistants who can read, create, modify, and delete both public and confidential calendar items. Without you designating someone as assistant, nobody can change your calendar or read your confidential items — not even an administrator. Click the “Assistants” option in the “Admin” menu at the bottom of your screen.
  2. Select the assistant(s) name(s) you wish to allow to read, delete, and create confidential appointments for you. Hold down the CTRL key to select multiple assistants.
  3. When that assistant next logs on, s/he’ll have a new option to manage your calendar at the bottom of his/her screen. Note: You don’t need to make someone an assistant in order for them to invite you to a meeting, or to read the “Public” entries in your calendar.

Layering someone else’s calendar over yours

  1. WebCalendar? allows you to layer an arbitrary number of other users’ public calendars overtop your own. Initially, this feature is turned off. Click the “Admin: Enable Layers” link to turn layers on.
  2. Click the “Admin: Edit Layers” link.
  3. Click the “Add Layer” link.
  4. Choose the source user name for the calendar you wish to layer over your own, and choose an appropriate color for the user’s calendar using the “Select” button.
  5. You can choose to show other users’ events that duplicate your own by selecting the “Duplicates” check box. I’m not sure why you’d want to do that, but hey, it’s there.
  6. Click the “Save” button.
  7. Repeat this procedure for all other public calendars you wish to layer over your own.

Advanced Usage

Managing Views

  1. You can create multiple-user views of all the public entries in other people’s calendars (for instance, to view the calendars of everyone in your department at a glance). Click the “Manage Views” link under the “Views” menu at the bottom of your screen.
  2. Click the “Add New View” link.
  3. Give this view a name.
  4. Select the view type you wish to display. There are several different powerful formatting options; play with them.
  5. Select the user(s) you wish to have a one-click view for. Hold down the CTRL button to select multiple users.
  6. Click the “Add” button to add this view.
  7. You now have one-click instant action to the view of calendars you have saved, by name, in your “Views” menu at the bottom of your screen.

Creating Reports

  1. In the “Reports” menu at the bottom of your screen, click on “Manage Reports”.
  2. Give your report a name, and select the user for whom you wish to run a report.
  3. For “Include standard header/trailer”, this is simply a formatting option. Choose “no” if you wish to create a printer-friendly report, or leave it at the default of “yes” for web display.
  4. Categories are an unused field. “previous/next” links are only useful if this report is to be a regularly referenced web report and not printed out. Including empty dates seems a silly option for a report, but there it is.
  5. Now, as far as Page, Day, and Event templates, until you’ve run a few reports, I suggest you steer clear of modifying the default values. The defaults will give you a reasonable report on appointments for the user. Note: You can only run Reports on yourself. Right now, even if you select a different user to run the report on, it still runs it against yourself. It seems to be a bug… erm, a security feature at this point. I’ll update these docs if the situation changes.

Additional notes for those who’ve managed to read this far without falling asleep:

  • Due to the way we have configured WebCalendar, the “Admin: Account” link just doesn’t work. Options appear if you click it, but they don’t do anything except tell you about yourself.
  • You can change your colors under your “Admin: Preferences” link.
  • You can export appointments to Palm Pilot format. Unfortunately, you can’t import them later, and exporting them to your Pilot twice results in two identical appointments. Use with caution. You can also export to iCal format, which is pretty convenient for various other Personal Information Management applications.
  • The “Go to: Search” link only searches your own calendar. It’s a known bug… erm, feature, I mean. Yeah, it’s a pain that you can’t search someone else’s calendar for whom you are an assistant. And, before you ask, you can’t dodge the searching problem by adding other users to layers on your calendar. The fix for this problem is in the works, but is certainly at least some months away.
  • WebCalendar allows you to use it as an iCal source for iCal-compliant calendaring applications. Unfortunately, if you wish to do this (using Mozilla Calendar, for instance), you’re breaking new ground, since we’re not quite sure how to do it yet.

What happened to Summer Movies?

I would never have the wherewithall to create my own blogging page, so I joined the ranks of Barnson.org, just to state my humble opinion. I have in one way or another contributed countless hours to debating matt on this here website, so I figured I’d step forward and introduce myself.

Hi.

That being said, I’ve been enjoying a conversation with many of my friends and family about the Summer Movie Saeon this year, and have been lamenting the lack of excitement present in this movie season.

It was only a year ago when STAR WARS came out 2 weeks after Spider-Man and kicked off one of the most successful summers in Movie History. After a summer of Men in Black, Austin Powers, and the like, I was already prepping for a year or fun fun fun.

I would never have the wherewithall to create my own blogging page, so I joined the ranks of Barnson.org, just to state my humble opinion. I have in one way or another contributed countless hours to debating matt on this here website, so I figured I’d step forward and introduce myself.

Hi.

That being said, I’ve been enjoying a conversation with many of my friends and family about the Summer Movie Saeon this year, and have been lamenting the lack of excitement present in this movie season.

It was only a year ago when STAR WARS came out 2 weeks after Spider-Man and kicked off one of the most successful summers in Movie History. After a summer of Men in Black, Austin Powers, and the like, I was already prepping for a year or fun fun fun.

Right around November, my faith was shattered by STAR TREK: NEMESIS, which not only was a depressing dark rusty razor blade of a film, but bombed after coming in 2nd on its opening weekend and then being steamrolled by a deserving and incredible LORD OF THE RINGS.

BUT: After DAREDEVIL’S guilty goodness, March and Oscar Season rolled around, it was all about Chicago, and I sat waiting patiently for the SUMMER MOVIE SEASON to begin.

Well, after skipping THE CORE (along with the rest of America) ANGER MANAGEMENT started things off with more of a pop than a bang.. But X2: XMEN UNITED ripped the theatre screens apart with adamantium goodness, and I was set for the summer of PURE COOLNESS…

Until THE MATRIX RELOADED, which gave me about 40 minutes of cool and 90 minutes of scratching my head, wondering who thought a Rave, a Sex Scene, and what looked like a badly animated video game was doing in this movie I had so hotly anticipated.

Undaunted, I was relieved to find some humor in BRUCE ALMIGHTY, some neat twists in THE ITALIAN JOB, but was immediately subjected to the abject Horror that was CHARLIE’S ANGELS FULL THROTTLE.

I found some scares in 28 DAYS LATER, but snored through the ridiculous HULK, and Skipped LXG altogether. DUmb got dumberer without me, although I was there to see Bad Boys get bloodier.

And what I saw was okay..like the moldy twice warmed over piece of AMERICAN PIE.. I mean Wedding.. and the WOMB.. that is TOMB raider sequel.

I skipped NEMO and SEABISCUIT, but hear they’re good, and I’ll watch them on video..

And the highlights post X2 were T3 and PIRATES OF THE CARRIBEAN (okay and FREDDY VS JASON.. but thats personal).. both of which were really fun and really good, and I liked.. but..

Well, its just I remember standing in line for CLONES and SPIDEY and AUSTIN, and I remember great summers past..And this year an animated fish stole the show in a movie everyone who saw it agrees is, well, pretty good.

I miss my big summer excitement, and I hope next year, Harry Potter and SPIDEY 2 and THE PUNISHER can restore my faith.. until then, I guess I’ll keep trying to find internet trailers for THE TWO TOWERS and REVOLUTIONS and ELF… maybe Christmas is the best season for giving after all..

Migrating IMAP mailboxes using Linux and Mailsync

IMPORTANT NOTE: This is a “running blog” today, updated as I complete several steps. It will continue to change until I’ve nailed this process down — I just wanted it recorded, and my blog seems a good spot to put up technical documentation.

This is my personal how-to on how I am migrating users from Groupwise to Cyrus Mail. I know this may sound backwards to some people! If it sounds odd to you, guess you’re not a free/open-source software aficianado.

Background

We were given a directive by our CIO that was quite simple. “Replace Groupwise. We’re done running Novell stuff on our network. If you choose an alternative where we can own the source code, you may implement it without question. If you choose a proprietary alternative, you must provide written cost justification.”

Exhibiting the enthusiasm that all systems administrators show for options that require cost-justification, I, of course, chose the free software option 🙂 Spencer Tuttle did the initial Cyrus implementation and LDAP integration (a process well-documented elsewhere on the web), and eventually it fell to me to figure out how to migrate the Groupwise mailboxes to Cyrus. This, unfortunately, is much tougher than it sounds. Yeah, there’s an easy way, but given the choice between doing it the easy way and relying on users to get it right, and doing it the hard way but being in control of the process and knowing it’s done right, I’d rather be in control.

Products evaluated

  1. Mozilla Thunderbird. This is our chosen mail client for post-Groupwise life, so we figured we could just have all the users log into both their Groupwise and Cyrus mail accounts at the same time, and copy the folders over that they want to keep.

    Upsides:

    • It just works™. You can log into both mailstores and drag folders.
    • Users gain complete control over what gets moved.

IMPORTANT NOTE: This is a “running blog” today, updated as I complete several steps. It will continue to change until I’ve nailed this process down — I just wanted it recorded, and my blog seems a good spot to put up technical documentation.

This is my personal how-to on how I am migrating users from Groupwise to Cyrus Mail. I know this may sound backwards to some people! If it sounds odd to you, guess you’re not a free/open-source software aficianado.

Background

We were given a directive by our CIO that was quite simple. “Replace Groupwise. We’re done running Novell stuff on our network. If you choose an alternative where we can own the source code, you may implement it without question. If you choose a proprietary alternative, you must provide written cost justification.”

Exhibiting the enthusiasm that all systems administrators show for options that require cost-justification, I, of course, chose the free software option 🙂 Spencer Tuttle did the initial Cyrus implementation and LDAP integration (a process well-documented elsewhere on the web), and eventually it fell to me to figure out how to migrate the Groupwise mailboxes to Cyrus. This, unfortunately, is much tougher than it sounds. Yeah, there’s an easy way, but given the choice between doing it the easy way and relying on users to get it right, and doing it the hard way but being in control of the process and knowing it’s done right, I’d rather be in control.

Products evaluated

  1. Mozilla Thunderbird. This is our chosen mail client for post-Groupwise life, so we figured we could just have all the users log into both their Groupwise and Cyrus mail accounts at the same time, and copy the folders over that they want to keep.

    Upsides:

    • It just works™. You can log into both mailstores and drag folders.
    • Users gain complete control over what gets moved.

    Downsides:

    • It requires training on the part of every user.
    • If the user screws it up (deleting the folder, for instance), I’m left holding the bag to restore a Groupwise mailbox from backup. That’s really something that’s painful and time-consuming! Particularly if they continue to receive messages between the incident and the mailbox restore.

    All things considered, I’d rather avoid this option.

  2. imapcp, the IMAP Copy Tool.

    Upsides:

    • Written in Python. I know Python a little, and it’s pretty easy to read and debug.
    • A single script, rather than a hard-to-compile collection of utilities.
    • Straightforward usage. Typing “python mbcp.py” gives you a brief help, and the README provides sufficient instructions for synchronizing your mailbox.
    • Copies folders as well as messages, so you can just point to, say, INBOX, and get all the subfolders.

    The downsides:

    • The single biggest downside to this, and I need to stress this for all the Googlers who are coming here searching for mbcp.py: THIS SCRIPT DOES NOT WORK!. I’m trying to hack it now, but at the moment it creates mailbox names with the first letter truncated, fails with many obscure errors for no apparent reason, and appears to build some kind of table in memory, leading to crashes due to out of memory errors on very large mailboxes.
    • It doesn’t do differential comparisons between mailboxes, just a blind copy. Which means if you have the messages already in your box, you’ll get ’em again if you run the program again.
    • It doesn’t seem to handle the “alternative namespace” we use in Cyrus Mail very well. It crashes, actually, trying to create more folders.
    • It doesn’t read Groupwise mailboxes; it appears the Groupwise mailstore occasionally stores messages with an odd message ID (or something, haven’t fully debugged it). The program dumps out right after reading the Groupwise INBOX.

    The problems with this script prevented me from using it, although I might revisit it if I can’t create a superior working option.

  3. The IMAP Migration Tool

    Upsides:

    • With just a little hacking, this script seems to mostly work.
    • Follows a disconnected mode of operation: define your parameters, then set up cron (or whatever) to actually run the shell script and migrate the mailbox.

    Downsides:

    • Required hacking to make it work 🙂 But I think I’m resolved that this will be the case no matter what.
    • Created a unique set of interdependent shell scripts and PHP for management of each mailbox. It seems to be geared towards a “one user at a time” approach rather than all 160+ users in our corporation.
    • It seemed sloppily coded and documented. For instance, the fact that it deletes and expunges all the messages in the old mailbox without checking that the message was actually migrated is a big downside, and completely undocumented. I could hack around it, but would rather not if I can find a tool that doesn’t have this unfriendly behavior.
    • No two-way diff mechanism to synchronize boxes rather than a blind copy.

    Overall, it seems a really nifty piece of coding, and is pretty cool in that it invokes PHP from a shell script for processing (leveraging the strengths of both languages), but combining hard-coded nuking of old messages with blind copying and no error checking makes for a package I’m uncomfortable using.

  4. Mailsync. This little utility is designed to keep various mailboxes synchronized in varying formats, including IMAP and POP.

    Upsides:

    • Very mature, been around many years.
    • Has non-live test modes to enumerate mailboxes.
    • Can handle arbitrary namespaces.
    • Reasonably well-documented and well-commented code; at least, it’s better than the alternatives.
    • Is the only utility I’ve found that can be run multiple times without copying the same messages over and over. It’s designed to synchronize stuff like CVS does — and that’s pretty cool.

    Downsides:

    • Relies on a library called “c-client”, which is turning out to be a real bummer to compile and make work, particularly if you want SSL support. I eventually gave up trying to compile this library. Even though I’d built it, and pointed mailsync’s “./configure –with-c-client=/some/path/” appropriately, it refused to recognize it as a working c-client. Instead, I just installed the “imap” and “imap-devel” libraries from my Redhat 9 CD, and they worked fine.
    • Little support to speak of. The maintainer of the project really, really doesn’t want you emailing him for free support (and I empathize!). The sole mailing list runs about 2 or 3 posts a month, and is housed with the Project Home on Sourceforge.
    • Lots of unnecessary complexity for our task — we just want to sync up some IMAP mailboxes, not handle tons of other mail formats.
    • Confusing configuration file syntax. I’m sure I’ll get a handle on it with usage, and like Fetchmail eventually come to regard it as “normal”, but right now it’s fairly cryptic.

Important tips:

  • It appears that cyrus and the imap package (yeah, c-client is just the usual “imap” package on redhat) conflict. So you can’t run Mailsync on your Cyrus mail server.
  • If you are running Redhat9 and have the imap and imap-devel packages installed, getting mailsync compiled relies on the standard five-step:
    1. tar xzvf mailsync_5.1.0.orig.tar.gz
    2. cd mailsync-5.1.0
    3. ./configure
    4. make
    5. (And, if you wish)

    6. make install
    7. Me, I chose not to install it, and instead ran it out of the src/ directory.

  • You need to be triple-careful with your .mailsync file in your home directory. I recommend in the strongest possible way that you test this on a non-important mailbox first! Otherwise, you are nearly certain to regret it.
  • If you’re using Cyrus with an alternate namespace, your delimeter on mailboxes is a “/” instead of a “.”. This is very important! Some scripts assume, if the IMAP server says it’s Cyrus, that it uses the Cyrus default namespace separator of “.” which just isn’t so in our case.

EDIT 5 September 2003: Unfortunately, after getting mailsync working fine, I discovered it only can import/export folders that are already set up with the exact same folder names on both sides. For instance, you can have a /sync folder in IMAP where you store messages you want to sync, and that will work. In this case, though, we need it to propagate folder names as well. I’m sure I can do manual c-client commands to create these folders and then mailsync them (and I may yet do that), but at this point just debugging the problems with imapcp seems easier.

Beauty

I had a wonderful Labor Day weekend, and enjoyed my time with my family and children. We celebrated Zach’s sixth birthday on Sunday with grandparents, cousins, aunts, an uncles. I had a chance to meet up with a friend from a common mailing list in person, and he was very interesting and fun to talk to — can’t wait to do it again, with more people. We went to the park tonight and played while picnicking with a neighbor family. I’m just about to retire for the night and snuggle with my beloved.

Of course, due to all this activity, I had zero blog entries 🙂

“Beauty is the bait which with delight allures man to enlarge his kind.” –Socrates

“The pursuit of truth and beauty is a sphere of activity in which we are permitted to remain children all our lives.” –Albert Einstein

“Youth is happy because it has the capacity to see Beauty. Anyone who keeps the ability to see Beauty never grows old. –Frank Kafka”

My life is beautiful.

I had a wonderful Labor Day weekend, and enjoyed my time with my family and children. We celebrated Zach’s sixth birthday on Sunday with grandparents, cousins, aunts, an uncles. I had a chance to meet up with a friend from a common mailing list in person, and he was very interesting and fun to talk to — can’t wait to do it again, with more people. We went to the park tonight and played while picnicking with a neighbor family. I’m just about to retire for the night and snuggle with my beloved.

Of course, due to all this activity, I had zero blog entries 🙂

“Beauty is the bait which with delight allures man to enlarge his kind.” –Socrates

“The pursuit of truth and beauty is a sphere of activity in which we are permitted to remain children all our lives.” –Albert Einstein

“Youth is happy because it has the capacity to see Beauty. Anyone who keeps the ability to see Beauty never grows old. –Frank Kafka”

My life is beautiful.