Remind: The Ultimate Personal Calendar
In addition to issuing reminders on standard output or with pop-up windows, Remind can create high-quality PostScript and HTML calendars. The actual Remind “engine” knows nothing about PostScript or HTML. Rather, if invoked with a command-line option, it prints out reminders in a format convenient for back ends to process. The Rem2PS back end produces PostScript output (Figure 3) and rem2html produces HTML output. Remind itself can produce a passable text-only monthly calendar.
Remind uses classic UNIX pipes to communicate with back ends. In fact, TkRemind is a pure Tcl script which uses pipes to communicate with a background Remind process. In this way, all the hairy date-calculation code is contained in Remind, and the pretty GUI and formatting code in the appropriate back end. It should be fairly straightforward to write GNOME and KDE equivalents to TkRemind.
In addition to sending normal reminders to back ends, Remind can transmit “out-of-band” data which makes the back end do something magical. Currently, special mechanisms are defined for drawing moon phases and shading calendar blocks. The PostScript, Tk and HTML back ends all respect these mechanisms. Additional back ends can easily extend the mechanism for special purposes.
Not everyone speaks English. While you wouldn't know this from most software, things are changing and software authors are internationalizing their software. Remind is no exception; it has been translated into twelve different European languages. Unfortunately, this was done with a customized mechanism which does not recognize or respect the POSIX locale functions. You have to specify a language for Remind at compile time.
Different languages have different rules for forming plurals, expressing times and expressing time intervals. This makes simple message translation impossible; in some cases, the code for a language is specific to that language alone.
Remind has been designed so translators can port it to another language fairly easily; please see the source code for details. If anyone would like to make Remind recognize and respect the LC_* locale environment variables, that would be a great project.
Because I like to know when Jewish holidays fall, I included Remind functions for dealing with the Hebrew calendar. If anyone would like to contribute code for the Chinese and Muslim calendars, I'm open to input.
Two last bits of scripting. Suppose you want to be reminded of something every Friday the 13th. This does not work:
REM Fri 13 MSG Black Cat
because it would be issued on the first Friday on or after the 13th of every month. Try this instead:
REM 13 SATISFY [wkdaynum(trigdate()) == 5] MSG\ Black Cat.The SATISFY keyword causes Remind to iterate through all possible “13ths of the month” until it hits one where the weekday is Friday. This powerful mechanism makes very complex reminders quite simple.
Finally, here's some Remind code to figure out when a blue moon occurs. A blue moon is the second full moon in a calendar month. (Blue moons are quite rare.)
FSET isFirstFull(date) \ monnum(moondate(2, date)) == \ monnum(moondate(2, moondate(2, date)+1)) REM 1 SATISFY isFirstFull(trigdate()) set blue moondate(2, moondate(2,\ trigdate())+1)\ MSG Next blue moon is [trigger(blue)]
Running this script through Remind shows that the next blue moon will take place on October 31, 2001. The one after that is July 31, 2004.
I defy you to get Microsoft Schedule to warn you of an upcoming blue moon.
I've barely scratched the surface of Remind. For more exciting esoteric things like system variables, priority, SCHED and WARN, TAG and DURATION, the substitution filter, safe movable OMITs, security features, the OMIT context, expressions, functions, debugging features, and so on, please download Remind. It's free—covered by the GPL—and can be found at ftp://ftp.doe.carleton.ca/pub/remind-3.0/. Although Remind is quite full of features, it's a rather slim 20K lines of code and should compile and install easily on Linux and any other UNIX-like system.
May you never forget another birthday.
David F. Skoll (firstname.lastname@example.org) is the founder of Roaring Penguin Software Inc., a Linux consultancy firm (www.roaringpenguin.com). He spends so much time tinkering with Remind that he often forgets his appointments.