| | Several years ago, it occurred to me to create a Psalm-o-matic for Lent. I have no idea why this occurred to me, it just popped into my head one day and I couldn't forget it. In theory, we are supposed to be a bit more focused on spiritual things, like scripture and prayer, during Lent. Just because we're Congregationalists—UCCs actually—why shouldn't we attempt to bow to tradition, at least a bit. So to make the scripture part a little more palatable—or so I thought at the time—how 'bout if we each read a Psalm each day? Rather than expect people actually to hunt up a Bible, and then figure out where the Psalms lay in that book, why not just e-mail out a Psalm? If we're to read Psalms, why focus on the three or four we already know. How 'bout we read a randomly selected Psalm? That way, in theory at least, we would get through Lent with a representative selection of Psalms, the familiar and the not-to familiar. Thus was born the idea of the Psalm o' matic. Now to figure out how to implement it. Of course, I thought it would be cool to write a computer program to do the work for me. I had a job at the time, and was a bit rusty on my programming, so I ended up with the coward's way. I used the random-number generator function in my spread sheet program to make up a list of numbers between 1 and 150. Then I copied the list over to a schedule, printed it out, and manually e-mailed out the Psalm scheduled for each day. Not all that o' matic, huh? I did that for a couple of years, but this year, since I was unemployed, I figured that I should brush off my very rusty shell scripting and try to make a real, bone fide psalm-o-matic. The shell script would, in theory at least, randomly pick out a number from 1 to 150, select the Psalm that related to that number, and do the e-mailing for me. All while I slept. The first thing I needed to do was come up with a method for generating random numbers from 1 to 150. Of course that's trivial if you are programming in C or C++, or using a spread sheet, but I was trying to do this in Unix shell scripting, the only way I knew how to send out e-mails automagically. It turned out that what I knew about sending out e-mails—learned in Intro to Unix back in the summer of 2000—was no longer valid, at least not on my system. But I didn't know that when I began this project. Anyway, it turned out that generating random numbers from the unix shell was relatively easy. My server at Joyent runs bash-shell scripts, and the bash shell has a build-in shell variable called $RANDOM. $RANDOM returns a random number from 0 to 32767 whenever it is called. To pare this selection down to 1 to 150, I merely had to multiply the $RANDOM variable by 150, divide by 32767, and then add 1 to take care of the fact that Psalms begin with 1 not 0 (zero).
psalmNo=$((1+150*$RANDOM/32767)) and the variable, $psalmNo would indeed be a number between 1 and 150. So far, so good. Now I just needed to select the appropriate Psalm and send it off. Selecting the appropriate Psalm was trivial, albeit tedious. I made up 150 text files with names like psalm_xxx.txt, where xxx was a number from 1 to 150. Then I just needed to combine three elements, the root of the text-file name, the Psalm number and the extension:
body="$filePath$fileRoot$psalmNo$fileExtension" Oh, yeah, I forgot to mention, the $filePath thing tells the computer where to find the directory that has all the Psalms in it. So now we get to what I assumed would be the easy part, e-mailing the Psalm. In olden days, we did something like the following:
mailx -s "e-mail subject" someone@somedomain.com <$body That is, the file in $body is inserted in an e-mail message to someone with the subject given. Well, it didn't work. After thrashing around for quite some time, I asked for help and was told that mailx no longer worked because of security issues. I had to use sendmail -t instead. I'd never heard about sendmail -t before. I guess it didn't work in the olden days. Or perhaps it just didn't work at UMass/Lowell, who tend to be a bit behind the times (when I took Java Script, I was told to be wary about things that caused problems with Netscape 2.0. WTF? we were in a post-Netscape era by the time I took that class.) Anyway, I had to learn about sendmail. That wasn't overly difficult. I discovered that the -t option meant that the system used the header information embedded in the file. So eventually, I figured out that meant I had to make up the files I e-mailed out with stuff like "To: someone@somedomain.com" at the top of the file, and the text file containing the Psalm at the end. Well, crap, I didn't want to go through 150 files and put in all the header stuff first. What if I wanted to do something else with the files later on? Fortunately, this wasn't a problem. I suddenly remembered about "appending" things to a file. To append things, you just did a double carat thingie, i.e.
cat $body<<$filePath$mailMsg and you get the stuff in $body, i.e. the Psalm file, appended to $mailMsg, the thing you created with all the header info. So I build it up a bit at a time, starting with the "To: someone@somedomain.com" stuff, adding in the From, Reply-to, and Subject stuff and finally ending with the Psalm file. So after all this ruminating, we ended up with
# !/usr/local/bin/bash # psalm o' matic script # # This works as follows: me@myServer$ /usr/local/bin/bash psalm-0-matic # If you don't precede with the "bash" it won't work. # The fully qualified paths through out are necessary to make this work as a cron script # # This uses my random number generator script # # Why in the hell am I using vi? # I'm not anymore -- using TextPad with sftpDrive (now ExpanDrive) filePath="/users/home/myUserName/domains/myDomain.org/web/public/Psalms/" fileRoot="Psalm_" fileExtension=".txt" # ***seed Random with a "random" number -- then select Psalm o' day RANDOM=$RANDOM psalmNo=$((1+150*$RANDOM/32767)) #all 150 -- Oh, yeah! # *****************prepare the message ****************** mailMsg="MailMsg" today=`/usr/xpg4/bin/date '+%A, %B %d, %Y'` # ***************** prepare header header ****************** dateField="Date: "$today #toField="To: me " #later on it would be fccr-ace. addressFile=pomList toField="To: "`cat "$filePath$addressFile"` #pomList is comma delimited: name , ... fromField="From: me " replyToField="Reply-to: me@myOtherDomain.net" #later on it would be fccr-ace? subjectField="Subject: Psalm for "$today"--Psalm "$psalmNo # ***************** assemble message ****************** body="$filePath$fileRoot$psalmNo$fileExtension" echo $dateField<$filePath$mailMsg echo $toField<<$filePath$mailMsg echo $fromField<<$filePath$mailMsg echo $replyToField<<$filePath$mailMsg echo $subjectField<<$filePath$mailMsg echo " " <<$filePath$mailMsg echo " " <<$filePath$mailMsg cat $body<<$filePath$mailMsg # *****************send the message ****************** /usr/local/bin/sendmail -t <$filePath$mailMsg Ok, this worked. Getting it to send out automagically turned out to be more trouble than I realized, but I eventually got so I was sending myself Psalms on an hourly basis. Just in time for Lent. Addendum: The scheme worked like a charm and we lucked out in that Ps. 119 never came up. Not sure anyone would have been able to slog through that one in one sitting. Addendum 2: Formatting this was a real PITA. I'd have been better off just doing raw xhtml on my static site. Then again, I suppose that I needed to (re?)learn that'code' is not a block-level element. Posted via email from Slothoughts Hypolite |
| | Posted 4/21/2009 10:40 PM - 5 Views - 0 eProps - 0 comments
- recommend
    - recs0
- share
- email
 - sent0
Give eProps or Post a Comment |