Inter-Office Memorandum
To Cedar Interest Date June 23, 1983 2:28 pm
From Warren Teitelman Location Palo Alto
Subject Remember Package Organization PARC/ISL
XEROX
Release as [Indigo]<Cedar>Documentation>Remember.tioga, .press
Draft [Indigo]<PostCedar>Remember>Remember.tioga
By Warren Teitelman
Last edited By Warren Teitelman on June 23, 1983 2:28 pm
Overview
Remember is a system for allowing the user to enter an event which will occur at some specified time in the future, and to be reminded of the event when the corresponding time arrives. The form of the reminder is an appropriately shaped, blinking, iconic viewer called a reminder notice, or simply, a reminder. The viewer contains the information associated with the event, e.g. either a text string supplied by the user, or the contents of a Walnut or Peanut message. The user can destroy the reminder notice ("I have seen it"), reset it for some future time via a menu button ("remind me again later"), or simply turn off the blinker but leave the reminder around, ("I'll get it to it soon").
Events can be entered into the system either by typing a command to the Executive (either the UserExec or CommandTool), e.g. "Call Bob Taylor at 4PM", "Remember to see Frank Squires Monday", or via the Remind menu button on a Walnut message viewer or Peanut control window, or by editing the file RememberEvents.txt. The latter technique can also be used to delete an event that was previously entered, or to change some of its parameters. Editing the file RememberEvents.txt is also currently the only way to browse through the events that are currently entered. In the future, we intend to integrate the reminder system with the Hickory calendar system so as to provide alternative methods for examining events.
Background
In July, 1982, Paul Rovner sent a message to the cedar community announcing: "Nifty Cedar application available for testing: Cedar users need never miss or be late for meetings or appointments again!!" His reminder system was a "modest (2 pages) but useful program ... that reads a text file named Reminders.txt and FORKs a process to post notices as flashing, iconic viewers at or after the specified time."
Imitation is the sincerest form of flattery, and Remember system owes a great historical debt to Paul's original efforts, although it is currently almost three times the size (not counting the fancy date and time parser which is itself larger than the reminder system), and very little of Paul's original code has survived.
Remember retains the basic idea of a process which posts notices at specified times, although there are a great variety of options associated with the posting of reminder notices, and also in what the user can do once a reminder notice has been posted. The principal difference in this system vis a vis the previous system is in the user interface, i.e. how the user enters events. In the original system, the user entered events by editing a file. Each event was specified int he file via a stylized template. Although in many cases, this template could be obtained by copying a previous entry and suitably modifying it, it still required opening the file, making the edits, saving the file, etc. Furthermore, the user had to specify the time and date of the event fully and unambiguously, e.g. May 11, 1983 10:00 am.
Remember, on the other hand, strives to allow the user to enter an event as easily and informally as scribbling a note, e.g. "Remember lunch with Larry, wednesday noon". To this end, a very powerful date and time parser has been developed. Furthermore, for electronic messages announcing Forum, Dealer, hiring meetings, etc., the user can usually enter the event by simply clicking a menu button. The corresponding reminder notice will include the contents of the original electronic message.
Entering an Event
Entering an event using the executive
Remember registers the command Remember for use in either the CommandTool or the UserExec. For example, "Remember to meet with Bob at 1PM" will register an event which will be posted at 1PM today (or 1PM tomorrow if it is already past 1PM today), and whose text will consist of the given string. The time of the event is obtained from the text using the Tempus date and time parser, which can handle partially specified times such as "in 20 minutes", "Thursday 4PM", "a week from tomorrow", etc. If the parser is unable to find a date and time, the Remember command will give an appropriate error message, the event can then be reentered with the time specified more fully.
If '/' appears in the command, the text of the reminder is the command line up to that point, and anything following `/' is interpreted as parameters for the reminder (see discussion of Remember Options below). For example, "Remember Dealer Wednesday 1:15PM / Repeat Weekly Duration 60" will register an event which will be posted every Wedneday at 1:15PM with duration 60 minutes.
Whenever an event is successfully registered, the file RememberEvents.Txt will be rewritten so that if the user boots or rolls back newly entered reminders will not be lost.
Entering an event using the Remind menu button
When both Walnut and Remember system are loaded (in either order), each Walnut message viewer will contain a Remind menu button. Clicking this button will cause an event to be entered the contents of whose reminder will consist of the corresponding walnut message. The time for this event is obtained by parsing the Subject field of the message. For example, if the subject is: "Hiring Meeting for Rodeheffer and Presotto, Today at 1:30", then the event will be entered for 1:30 PM.
The contents of the Subject field can be augmented for the purposes of Remember by selecting additional material. This material is effectively prepended onto the Subject field for the purposes of obtaining the time. For example, if the subject of the message is: "Hiring meeting for Keith Marzullo" and the Remind button is clicked, the message window will flash "Specify (select) a time for the event". If the phrase "Thursday 2nd June at 1.30" appears somewhere in the message (or elsewhere), then selecting these characters and clicking Remind will cause the event to be entered for the corresponding time.
As with the Remember command, if '/' appears in the selected text ('/' in the Subject field is ignored), the material that follows the '/' is interpreted as parameters for the event. For example, if the subject of the message is "Rob Pike / Blit Tape 1:30 today", and the user selects: "/ LeadTime 30" and clicks Remind, then the event will be entered for 1:00PM.
If Peanut and Remember are loaded (in either order), the Remind menu button is posted in the Peanut control window. To enter a Peanut message as a reminder, first place the selection anywhere inside of the corresponding message, and then click Remind. As with Walnut, the contents of the selection are effectively prepended to the Subject field for the purpose of specifying the time of the event and other parameters.
"Testing, testing, one, two..."
If you want to see whether an event you entered will really be posted at the right time with all the right options, you can tell Remember to pretend its some time in the future for the purposes of posting reminders by using the PretendIts command. For example, "Remember Dealer Wednesday 1:15PM / Repeat Weekly Duration 60", followed by "PretendIts Wednesday 1:15PM" will post the corresponding reminder notice. If you destroy a reminder that was posted as a result of a PretendIts command, it is not removed from the system, since it is assumed that you were only just testing things out. (Currently this is not the case, i.e. the reminder is removed, due to a bug which I will fix shortly.)
Once a Reminder Notice is Posted
As mentioned earlier, a reminder notice consists of a blinking icon. The icon will continue to blink indefinitely unless a duration has been specified for the corresponding event, in whch case the icon will automatically self-destruct when the indicated interval has elapsed. The user can also explicitly destroy the icon or viewer, which also has the effect of removing the corresponding event from the Remember system (unless the event is a repeated event). In other words, if a reminder is posted which the user destroys, and then the user reboots or rollsback, the same reminder will not be posted again.
For repeated events, e.g. "Dealer Wednesday 1:15PM REPEAT Weekly", destroying the icon or viewer only affects this instance of the event; a new reminder will be posted when the next time rolls around. (However, repeated events can be removed from the system via the Forget menu button described below, or by editing the file RememberEvents.txt.)
Although most reminder icons have distinctive shapes, the underlying document in all cases is simply a Tioga document. Thus, if you open a reminder icon, you will see an ordinary Tioga viewer, but one whose second menu line contains various reminder-related operations: Blinker, Relabel, 15min/hour/day, NewTime, and Forget. The Blinker button is a toggle switch for turning on/off the blinking of the icon. The 15min/hour/day and NewTime buttons are used to reset the event for a new time as described below. The reminder can then be deleted and a new reminder will be posted at the indicated time. The Forget menu button explicitly deletes the corresponding event from the reminder system.
Blinker Toggle switch for turning blinker for icon on/off.
15min/hour/day left click = 15min, middle click = hour, right click = 1 day. Reset the event time for t + corresponding interval, where t = MAX[now, eventTime]. If the shift key is depressed while button is clicked, event time is decremented by the corresponding amount, i.e. reset the event time for t - corresponding interval. The new time is displayed in the message window.
For example, if the reminder was posted at 1PM but you were out of your office, and it is now 1:30, and you left click this button, the reminder will be reposted for 1:45. If you click the button again, it will be reposted for 2PM. Right clicking followed by middle clicking while holding the shift key down, will then reset the reminder for 1PM on Thursday. Note that you can always reset the reminder for an arbitrary time using the NewTime button.
NewTime The current selection is parsed as a time, using the current event's startTime as the base time, and the event is reset to the new time.
Forget remove this event from the Remember system. Note that destroying the viewer or icon also forgets the event except if it is a repeated event. The Forget button will forget repeated events.
User Profile Options
Remember.Keywords: TOKEN ← NIL
The Remember system recognizes a variety of parameters in connection with the posting of a reminder notice, such as Duration, Repeat, IconFlavor, etc. These are listed and explained in the section on Reminder Parameters below. However, typically the user does not specify such parameters explicitly, i.e. by typing or selecting them when an event is entered, but instead specifies them implicitly by the appearance of various keywords in the text of the event. These keywords are defined via the Remember.KeyWords entry of the user's profile. Whenever a keyword is encountered in the text for an event, the corresponding default parameters are implicitly specified, i.e. will be used unless the parameter is also explicitly specified in the event. For example, including in the Remember.KeyWords entry in your profile: "Meeting: Duration: 60, IconFlavor: Meeting" means for each event containing the word `Meeting' (where containing means in the case of an exec command that the word appears in the command line, and in the case of an event entered via the Remind button, that the word appears either in the Subject field of the message, or in the selected material), use a Duration of 60 minutes and the IconFlavor Meeting, unless of course these parameters are also specified explicitly via the '/' mechanism.
Below is the Remember.KeyWords entry contained in Remember.Profile. It is intended that the user add to, delete from, or otherwise modify this entry to suit his own tastes.
Remember.KeyWords: "
Meeting: Leadtime: 15, IconFlavor: Meeting, IconLabelType: Prev
Attend: Leadtime: 15, IconFlavor: Meeting, IconLabelType: Next
Forum: Leadtime: 15, IconFlavor: Meeting, IconLabel: Forum, Time: \"Thursday, 3:45PM\"
MDG: Leadtime: 15, IconFlavor: Meeting, IconLabel: MDG
Dealer: Leadtime: 15, IconFlavor: Meeting, IconLabel: Dealer, Time: \"Wednesday, 1:15PM"\
Call: Leadtime: 0, IconFlavor: Phone, IconLabelType: Next
Phone: Leadtime: 0, IconFlavor: Phone, IconLabelType: Next
See: IconFlavor: Conversation, IconLabelType: next
Write: IconFlavor: Envelope, IconLabelType: next
SoftBall: IconFlavor: SoftBall
Menu: IconFlavor: Lunch, Repeat: WeekDays, Time: NOON
"
Remember.Duration: INT ← -1
Specifies the default duration for events, in minutes. If no duration is specified in the event, or via a keyword contained in the event, then this duration is used. -1 means infinite duration.
Remember.LeadTime: INT ← 0
Specifies the default leadtime for events, in minutes. If no leadtime is specified in the event, or via a keyword contained in the event, then this leadtime is used.
Remember.CreateLog: BOOL ← FALSE
If TRUE, each reminder that is posted is also written to the log file, Remember.log.
RegisteredIcons: TOKEN ← NIL
Defines the mapping between an IconFlavor and the corresponding icon. (This profile option is actually implemented by the IconRegistry package, of which Remember is a client.) For example, if the keyword Forum specifies the IconFlavor Meeting, then Meeting might be defined by including Meeting: Remember.Icons 3 in the RegisteredIcons entry in your profile.
Here is the RegisteredIcons entry contained in Remember.Profile.
RegisteredIcons: "
Phone: Remember.Icons 0 -- pushbutton handset
Conversation: Remember.Icons 1 -- two people talking over a desk
Meeting: Remember.Icons 3 -- one person talking to a group of several
Envelope: Remember.Icons 4 -- an envelope
SoftBall: Remember.icons 8
Lunch: Remember.icons 9
"
Reminder Parameters
Remember recognizes a number of parameters associated with the posting of notices. These parameters can be specified when the event is entered, using '/' as described earlier in the section on Entering Events, or by associating them with keywords defined in the user's profile, as described in the section on User Profile Options.
A parameter is specified by a name/value pair, i.e. name: value, where the : is optional, and the case of the `name' is ignored. Values are single tokens, in the IO.GetToken sense. To specify a value that contains spaces or other separating characters, wrap "'s around the value, e.g. IconLabel: "Frank Squires".
The parameters that are currently implemented are:
REPEAT value = {HOURLY, DAILY, WEEKDAYS, WEEKLY, MONTHLY, YEARLY, or a rope that can be parsed by Tempus.Parse, e.g. "15 minutes", "3 days"}
DURATION value is life time of the reminder notice in number of minutes, i.e. automatically kill the notice after this duration
UNTIL value is a time. automatically kill the notice after this time
LEADTIME value is number of minutes. Post reminder this number of minutes prior to the indicated time. Primarily for use in conjunction with remind button, where the time of the event is specified by the message itself.
ICONFLAVOR the name of the flavor of icon to be used. The mapping from name to file is defined via the RegisteredIcons entry in the user profile. The corresponding icon flavor is obtained via the IconRegistry. If for some reason the corresponding icon flavor cannot be found or created, the document icon will be used.
ICONLABEL the label for the icon. If not present, the text of the notice will be used.
ICONLABELTYPE value = {prev, next, this}. provides a way of specifying an icon label in terms of the position of a keyword in the text (and is therefore not especially useful except in conjunction with keywords). For example, `next' means use the word following the keyword as the icon label, e.g. "Call Taylor in 10 minutes" would post a reminder whose icon label was Taylor.
RememberEvents.txt
RememberEvents.txt contains the events that have been entered into the system. It is a vanilla text file, i.e. cannot contain Tioga formatting, since the Remember system rewrites this file whenever an event is entered. The format of file is a sequence of events separated by a blank line. Each event begins with a time and ends with the text string for a reminder. In between are entries of the form parameter: value. The : is optional and case is ignored. Editing RememberEvents.txt will cause it to be rescanned.
Getting started
Bringover /a /p [Indigo]<PostCedar>Top>Remember.df. Follow the instructions in Remember.Profile for editing your user profile. Then simply run Remember.bcd. If you do not use the UserExec, follow the same procedure but run LeanMeanRemember.bcd instead of Remember.bcd. If you want to see if everything is working, try typing to the executive "Remember to call Warren in 10 minutes and tell him it all worked". Then type "PretendIts ten minutes from now". You should see a blinking phone icon.
Note if you previously used Reminder, the file Reminders.txt can be read by Remember, so you need only copy or rename it to be RememberEvents.txt (provided your Reminders.txt does not contain Tioga formatting) to automatically enter the events in this file. However, they will not use the various icon flavors unless you go in and edit RememberEvents.txt by hand.
Program interface
If you want to write programs which enter events from a program, e.g. implement your own menu buttons, Remember exports an interface, RememberDefs, which should allow you to do all (most?) of what you want. For examples of how this interface is used, look at RememberOpsImpl.mesa, which implements the Remember command and the Remind button using this interface.