Inter-Office Memorandum
To Cedar Interest Date June 30, 1983
From Warren Teitelman Location Palo Alto
Subject Remember Package Organization PARC/ISL
XEROX
Release as [Indigo]<Cedar®>Documentation>RememberDoc.tioga, .press
By Warren Teitelman
Last edited By Ken Pier on March 13, 1984
Last edited by Pavel Curtis on June 11, 1984
Last edited by Carl Binding on August 28, 1984
Overview
Remember is a system for allowing the user to enter an event that 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.
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 in the 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.
In the newest version of Remember, it no longer uses a text file to store event descriptors on stable storage. Instead Remember is now a client of the Hickory data base. It is there where events are stored and from where event are retrieved on need. Browsing the data base as well as editing particular events stored in it is possible through the Calendar program. Remember prefetches events every two hours for a time of two hours. The integration between Remember and Hickory might not be optimal, the problem being the intrinsically complex structure of Remember. The propagations of user interaction to Remember into Hickory in particular might not necessarily provide the right semantics. ( I certainly don't know what this would be anyway...)
Entering an Event
Entering an event using the executive
Remember registers the command Remember for use in the CommandTool. 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 event will be stored in Hickory.
Entering an event using the Remind menu button
Remember allows users of either the Walnut or Peanut mail system to enter an event that is described in an electronic message by simply clicking 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 using the time the message was sent as the base time. 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 on the day the message was sent.
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.
When both 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 the Remind menu button located in the Peanut control window. 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. However, you can remove such an event by using the Forget button described below.
If you want to see a range of events, such as all the reminders that will be posted tomorrow, you can tell Remember to pretend its some range of times in the future by using the ShowReminders (also called ShowRem) command. For example, "ShowReminders now UpTo Thursday" if its Tuesday morning at 9 AM will show all the reminder events (as if PretendIts had been called for each of them) from Tuesday morning at 9 AM until Thursday at 0000 hours. Or, ShowRem April UpTo May will show you all the reminders to be displayed in the month of April.
Remember now only caches events from Hickory for the next two hours. Hence the above two commands will only consider the next two hours as far as events from Hickory are concerned. You can use Calendar to browse through Hickory ( it's easier that way...). Maintaining the old semantics would have been hard, complicated and useless anyway, but you are welcome to volunteer.
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 which 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), but not from Hickory.
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.
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. The change to the event is NOT propagated into Hickory.
For example, if the reminder was posted at Wedesnday, 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. The change of startTime is propagated into Hickory and therefore to any other Hickory clients ( Calendar).
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. Right-clicking Forget will also destroy the viewer. Forget changes the Remind attribute of the Hickory event, but does not destroy it. Hence, Remember will ignore the event in the future, but Calendar will still show it.
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: "
Remember.defaultIcon: Remember.icons 11 -- a calendar
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
"
Note that the icon file need not be on your local disk, e.g.
VolleyBall: [Ivy]<Beach>Icons>Sports.Icons 0
Bicycle: [Ivy]<Beach>Icons>Sports.Icons 3
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 rope literal time (e.g. "3:45 PM"). specifies the last time a repeated event occurrs.
KEEPUNTIL value is a rope literal time (e.g. "August 31, 1985"). specifies the time when an event can be destroyed in the Hickory data base.
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.
NAGTIME value is number of minutes. After this number of minutes from the time that the reminder is posted, if the reminder has not been reset, or destroyed, then more drastic steps are taken.
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 icon named Remember.defaultIcon will be used, if any, otherwise document.
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.
Getting started
Before starting to deal with Remember, you must have Hickory running. How to do this, see the Hickory documentation. ( /indigo/hickory/hickory/hickoryDog.tioga)
Bringover the most recent version of Remember.DF from /indigo/hickory/remember. Follow the instructions in Remember.Profile for editing your user profile. Then simply type the command ``Remember'', with no arguments, to the CommandTool. Ignore the (there are unbound imports) message - it is a result of the fact that Walnut or Peanut has not been loaded. Also ignore the message ``No Time Specified'' -- this is a harmless side-effect of invoking the command without any arguments.
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 have started Walnut and read some mail, it is a good idea to delete any existing message viewers, since the Remind button will only appear on those message viewers created subsequently to the time that you run Remember.
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.