summaryrefslogtreecommitdiffstats
path: root/2024/info/water-after.md
blob: 33912287c6e3df30995752acbce7bf6af7cc812a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
<!-- Automatically generated by emacsconf-publish-after-page -->


<div class="transcript transcript-mainVideo"><a name="water-mainVideo-transcript"></a><h1>Transcript</h1>


<div class="transcript-heading">[[!template new="1" text="""Introduction""" start="00:00:02.679" video="mainVideo-water" id="subtitle"]]</div>[[!template text="""Welcome to Watering My Digital Plant with Emacs Timers,""" start="00:00:02.679" video="mainVideo-water" id="subtitle"]]
[[!template text="""a talk by Christopher Howard for Emacs Conference 2024.""" start="00:00:07.503" video="mainVideo-water" id="subtitle"]]
[[!template text="""The goal of this talk is to give""" start="00:00:11.385" video="mainVideo-water" id="subtitle"]]
[[!template text="""a brief introduction to Emacs timers""" start="00:00:17.010" video="mainVideo-water" id="subtitle"]]
[[!template text="""using the illustration of how I created""" start="00:00:20.892" video="mainVideo-water" id="subtitle"]]
[[!template text="""a bot for the Astrobotany service.""" start="00:00:23.394" video="mainVideo-water" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""What is Astrobotany?""" start="00:00:28.823" video="mainVideo-water" id="subtitle"]]</div>[[!template text="""What is Astrobotany?""" start="00:00:28.823" video="mainVideo-water" id="subtitle"]]
[[!template text="""Let me jump to the home page.""" start="00:00:30.924" video="mainVideo-water" id="subtitle"]]
[[!template text="""Astrobotany is a botany game or a simulation""" start="00:00:38.649" video="mainVideo-water" id="subtitle"]]
[[!template text="""that is played using the Gemini protocol""" start="00:00:42.611" video="mainVideo-water" id="subtitle"]]
[[!template text="""and gemtext documents.""" start="00:00:45.893" video="mainVideo-water" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""What is Gemini?""" start="00:00:48.914" video="mainVideo-water" id="subtitle"]]</div>[[!template text="""What is Gemini?""" start="00:00:48.914" video="mainVideo-water" id="subtitle"]]
[[!template text="""The Gemini protocol is a small web protocol,""" start="00:00:50.700" video="mainVideo-water" id="subtitle"]]
[[!template text="""similar to the HyperText Transfer Protocol,""" start="00:00:54.263" video="mainVideo-water" id="subtitle"]]
[[!template text="""but with differing goals of simplicity,""" start="00:00:58.047" video="mainVideo-water" id="subtitle"]]
[[!template text="""non-extensibility, and protecting privacy.""" start="00:01:00.789" video="mainVideo-water" id="subtitle"]]
[[!template text="""Gemtext is a simple hyperlinking document format,""" start="00:01:05.453" video="mainVideo-water" id="subtitle"]]
[[!template text="""the analog of the HyperText Markup Language, or HTML.""" start="00:01:09.557" video="mainVideo-water" id="subtitle"]]
[[!template text="""Much more could be said""" start="00:01:16.095" video="mainVideo-water" id="subtitle"]]
[[!template text="""about the design and goals""" start="00:01:17.135" video="mainVideo-water" id="subtitle"]]
[[!template text="""of the Gemini project,""" start="00:01:18.576" video="mainVideo-water" id="subtitle"]]
[[!template text="""but that is not the focus of this talk.""" start="00:01:20.236" video="mainVideo-water" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""How do you play Astrobotany?""" start="00:01:25.337" video="mainVideo-water" id="subtitle"]]</div>[[!template text="""And how do you play Astrobotany?""" start="00:01:25.337" video="mainVideo-water" id="subtitle"]]
[[!template text="""First, you need to get a Gemini client""" start="00:01:28.418" video="mainVideo-water" id="subtitle"]]
[[!template text="""or what you might call a browser.""" start="00:01:31.138" video="mainVideo-water" id="subtitle"]]
[[!template text="""Many clients are available,""" start="00:01:34.079" video="mainVideo-water" id="subtitle"]]
[[!template text="""but I am using Elpher, a Gemini client for Emacs.""" start="00:01:36.259" video="mainVideo-water" id="subtitle"]]
[[!template text="""Once you have your client running,""" start="00:01:41.340" video="mainVideo-water" id="subtitle"]]
[[!template text="""navigate to the home page for Astrobotany,""" start="00:01:43.801" video="mainVideo-water" id="subtitle"]]
[[!template text="""which is shown in this window.""" start="00:01:46.782" video="mainVideo-water" id="subtitle"]]
[[!template text="""You'll see the URL for the home page""" start="00:01:50.783" video="mainVideo-water" id="subtitle"]]
[[!template text="""displayed at the top of the window.""" start="00:01:53.103" video="mainVideo-water" id="subtitle"]]
[[!template text="""On your first visit to Astrobotany,""" start="00:01:57.865" video="mainVideo-water" id="subtitle"]]
[[!template text="""you will need to create a client certificate,""" start="00:02:00.406" video="mainVideo-water" id="subtitle"]]
[[!template text="""which will be used instead of a password.""" start="00:02:03.426" video="mainVideo-water" id="subtitle"]]
[[!template text="""Your Gemini client will help you""" start="00:02:06.067" video="mainVideo-water" id="subtitle"]]
[[!template text="""to create the certificate.""" start="00:02:07.588" video="mainVideo-water" id="subtitle"]]
[[!template text="""Then you will go to the Visit Your Plant page""" start="00:02:12.102" video="mainVideo-water" id="subtitle"]]
[[!template text="""in order to view your plant,""" start="00:02:22.472" video="mainVideo-water" id="subtitle"]]
[[!template text="""to water it, and to collect things from it,""" start="00:02:28.297" video="mainVideo-water" id="subtitle"]]
[[!template text="""including money. So here you see""" start="00:02:33.141" video="mainVideo-water" id="subtitle"]]
[[!template text="""the plant that I'm currently growing""" start="00:02:37.968" video="mainVideo-water" id="subtitle"]]
[[!template text="""in glorious ASCII graphics.""" start="00:02:40.229" video="mainVideo-water" id="subtitle"]]
[[!template text="""There's also a color version available from this page.""" start="00:02:43.070" video="mainVideo-water" id="subtitle"]]
[[!template text="""Back at the home page,""" start="00:02:56.895" video="mainVideo-water" id="subtitle"]]
[[!template text="""you can do other things""" start="00:02:59.536" video="mainVideo-water" id="subtitle"]]
[[!template text="""like go to the item shop,""" start="00:03:02.537" video="mainVideo-water" id="subtitle"]]
[[!template text="""to buy items like badges, fertilizer,""" start="00:03:07.165" video="mainVideo-water" id="subtitle"]]
[[!template text="""or post on the message board.""" start="00:03:11.607" video="mainVideo-water" id="subtitle"]]
[[!template text="""In Astrobotany, gardener bots are fully legal.""" start="00:03:15.849" video="mainVideo-water" id="subtitle"]]
[[!template text="""And to do an action on your plant,""" start="00:03:20.852" video="mainVideo-water" id="subtitle"]]
[[!template text="""like watering the plant,""" start="00:03:23.693" video="mainVideo-water" id="subtitle"]]
[[!template text="""all your bot needs to do is""" start="00:03:25.454" video="mainVideo-water" id="subtitle"]]
[[!template text="""to access the appropriate Gemini URL or page""" start="00:03:27.035" video="mainVideo-water" id="subtitle"]]
[[!template text="""while presenting the appropriate certificate""" start="00:03:31.537" video="mainVideo-water" id="subtitle"]]
[[!template text="""for your plant.""" start="00:03:34.419" video="mainVideo-water" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Timers""" start="00:03:37.000" video="mainVideo-water" id="subtitle"]]</div>[[!template text="""And this brings us to Emacs timers.""" start="00:03:37.000" video="mainVideo-water" id="subtitle"]]
[[!template text="""So the main function of interest to us""" start="00:03:42.904" video="mainVideo-water" id="subtitle"]]
[[!template text="""is the run-at-time function.""" start="00:03:46.626" video="mainVideo-water" id="subtitle"]]
[[!template text="""Here is the help documentation,""" start="00:04:00.714" video="mainVideo-water" id="subtitle"]]
[[!template text="""which is available in any recent Emacs installation.""" start="00:04:03.395" video="mainVideo-water" id="subtitle"]]
[[!template text="""As you see, the purpose of the function""" start="00:04:10.157" video="mainVideo-water" id="subtitle"]]
[[!template text="""is to perform an action at a specific time""" start="00:04:13.498" video="mainVideo-water" id="subtitle"]]
[[!template text="""to repeat it after a specific number of seconds.""" start="00:04:20.920" video="mainVideo-water" id="subtitle"]]
[[!template text="""And so basically, all you have to do is""" start="00:04:29.770" video="mainVideo-water" id="subtitle"]]
[[!template text="""pass in a function to run-at-time,""" start="00:04:32.673" video="mainVideo-water" id="subtitle"]]
[[!template text="""telling Emacs how soon you want to run the function,""" start="00:04:36.436" video="mainVideo-water" id="subtitle"]]
[[!template text="""and then how often you want to run the""" start="00:04:39.999" video="mainVideo-water" id="subtitle"]]
[[!template text="""function after that.""" start="00:04:41.581" video="mainVideo-water" id="subtitle"]]
[[!template text="""The function has a variety of options for""" start="00:04:44.403" video="mainVideo-water" id="subtitle"]]
[[!template text="""specifying the time parameter,""" start="00:04:46.645" video="mainVideo-water" id="subtitle"]]
[[!template text="""that is, how soon you want the function to run.""" start="00:04:49.347" video="mainVideo-water" id="subtitle"]]
[[!template text="""For our application, in which we'll be""" start="00:04:55.307" video="mainVideo-water" id="subtitle"]]
[[!template text="""running our functions""" start="00:04:57.508" video="mainVideo-water" id="subtitle"]]
[[!template text="""once or twice a day at specific times,""" start="00:04:58.649" video="mainVideo-water" id="subtitle"]]
[[!template text="""it is most useful to""" start="00:05:03.152" video="mainVideo-water" id="subtitle"]]
[[!template text="""specify the number of seconds until the event.""" start="00:05:04.553" video="mainVideo-water" id="subtitle"]]
[[!template text="""This does, however, require""" start="00:05:08.515" video="mainVideo-water" id="subtitle"]]
[[!template text="""calculating the number of seconds""" start="00:05:10.436" video="mainVideo-water" id="subtitle"]]
[[!template text="""until a specific time of day. I will""" start="00:05:12.097" video="mainVideo-water" id="subtitle"]]
[[!template text="""provide code for this shortly.""" start="00:05:15.419" video="mainVideo-water" id="subtitle"]]
[[!template text="""The run-at-time function does allow you to""" start="00:05:18.860" video="mainVideo-water" id="subtitle"]]
[[!template text="""specify the time parameter as a string,""" start="00:05:20.864" video="mainVideo-water" id="subtitle"]]
[[!template text="""representing the hours and minutes.""" start="00:05:24.029" video="mainVideo-water" id="subtitle"]]
[[!template text="""For example, 05:40.""" start="00:05:26.413" video="mainVideo-water" id="subtitle"]]
[[!template text="""However, there is an oddity in the""" start="00:05:32.150" video="mainVideo-water" id="subtitle"]]
[[!template text="""design of run-at-time,""" start="00:05:34.091" video="mainVideo-water" id="subtitle"]]
[[!template text="""such that if the specified time of day has""" start="00:05:36.372" video="mainVideo-water" id="subtitle"]]
[[!template text="""already passed,""" start="00:05:41.455" video="mainVideo-water" id="subtitle"]]
[[!template text="""then the timer will run immediately,""" start="00:05:43.196" video="mainVideo-water" id="subtitle"]]
[[!template text="""rather than in the future,""" start="00:05:45.578" video="mainVideo-water" id="subtitle"]]
[[!template text="""as you might expect.""" start="00:05:46.958" video="mainVideo-water" id="subtitle"]]
[[!template text="""This can be problematic, for example,""" start="00:05:49.280" video="mainVideo-water" id="subtitle"]]
[[!template text="""if run-at-time is being called from your init file,""" start="00:05:51.661" video="mainVideo-water" id="subtitle"]]
[[!template text="""since the timer will run immediately""" start="00:05:55.583" video="mainVideo-water" id="subtitle"]]
[[!template text="""every time you restart Emacs for any reason.""" start="00:05:58.245" video="mainVideo-water" id="subtitle"]]
[[!template text="""I noticed recently that run-at-time""" start="00:06:02.526" video="mainVideo-water" id="subtitle"]]
[[!template text="""also allows you to pass in a value""" start="00:06:04.791" video="mainVideo-water" id="subtitle"]]
[[!template text="""from encode-time, which maybe does what we want,""" start="00:06:07.317" video="mainVideo-water" id="subtitle"]]
[[!template text="""but I never bothered with testing that.""" start="00:06:18.378" video="mainVideo-water" id="subtitle"]]
[[!template text="""Actually, I have a vague memory of""" start="00:06:21.340" video="mainVideo-water" id="subtitle"]]
[[!template text="""once looking into it and it didn't seem to do what I""" start="00:06:23.181" video="mainVideo-water" id="subtitle"]]
[[!template text="""wanted, but honestly I can't clearly remember,""" start="00:06:25.783" video="mainVideo-water" id="subtitle"]]
[[!template text="""so you may want to look into that yourself.""" start="00:06:29.946" video="mainVideo-water" id="subtitle"]]
[[!template text="""What I ended up using was just""" start="00:06:32.728" video="mainVideo-water" id="subtitle"]]
[[!template text="""passing in a number of seconds.""" start="00:06:34.309" video="mainVideo-water" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""The code""" start="00:06:37.792" video="mainVideo-water" id="subtitle"]]</div>[[!template text="""So now we'll move over to the code.""" start="00:06:37.792" video="mainVideo-water" id="subtitle"]]
[[!template text="""So I'll skip down here first""" start="00:06:46.764" video="mainVideo-water" id="subtitle"]]
[[!template text="""to the code that I wrote for calculating the number of""" start="00:06:49.966" video="mainVideo-water" id="subtitle"]]
[[!template text="""seconds.""" start="00:06:52.527" video="mainVideo-water" id="subtitle"]]
[[!template text="""It's a function that calculates the number of seconds""" start="00:06:54.408" video="mainVideo-water" id="subtitle"]]
[[!template text="""until a particular time of day in the future.""" start="00:06:58.050" video="mainVideo-water" id="subtitle"]]
[[!template text="""You can see that you pass in the hour as a number from""" start="00:07:04.214" video="mainVideo-water" id="subtitle"]]
[[!template text="""0 to 23 and the minutes as a number from 0 to 59. And""" start="00:07:09.278" video="mainVideo-water" id="subtitle"]]
[[!template text="""here's the code, which will also be available later.""" start="00:07:20.078" video="mainVideo-water" id="subtitle"]]
[[!template text="""I wrote another function, secs-until-weekly,""" start="00:07:25.700" video="mainVideo-water" id="subtitle"]]
[[!template text="""which we do not need for this talk,""" start="00:07:29.522" video="mainVideo-water" id="subtitle"]]
[[!template text="""but which is useful if you're running""" start="00:07:32.604" video="mainVideo-water" id="subtitle"]]
[[!template text="""events which need to happen once per week.""" start="00:07:34.745" video="mainVideo-water" id="subtitle"]]
[[!template text="""This function also requires a target hour""" start="00:07:39.264" video="mainVideo-water" id="subtitle"]]
[[!template text="""and a target minute, but also requires passing in a""" start="00:07:44.085" video="mainVideo-water" id="subtitle"]]
[[!template text="""target day. And while we're on the subject of timers""" start="00:07:48.966" video="mainVideo-water" id="subtitle"]]
[[!template text="""specifically, I should mention that""" start="00:08:00.568" video="mainVideo-water" id="subtitle"]]
[[!template text="""Emacs has a very useful function called list-timers.""" start="00:08:02.648" video="mainVideo-water" id="subtitle"]]
[[!template text="""So if I call the interactive function list-timers,""" start="00:08:07.577" video="mainVideo-water" id="subtitle"]]
[[!template text="""it will give me a list of all the timers""" start="00:08:11.560" video="mainVideo-water" id="subtitle"]]
[[!template text="""currently running.""" start="00:08:14.842" video="mainVideo-water" id="subtitle"]]
[[!template text="""This page shows not only which timers exist,""" start="00:08:16.723" video="mainVideo-water" id="subtitle"]]
[[!template text="""but also how long it will be until they run again,""" start="00:08:20.186" video="mainVideo-water" id="subtitle"]]
[[!template text="""along with the periodic repeat value that you""" start="00:08:23.848" video="mainVideo-water" id="subtitle"]]
[[!template text="""specified.""" start="00:08:26.770" video="mainVideo-water" id="subtitle"]]
[[!template text="""Furthermore, any timer can be canceled by moving point""" start="00:08:29.992" video="mainVideo-water" id="subtitle"]]
[[!template text="""over the timer and running timer-list-cancel,""" start="00:08:33.514" video="mainVideo-water" id="subtitle"]]
[[!template text="""which on my system is bound to the letter c by default.""" start="00:08:38.696" video="mainVideo-water" id="subtitle"]]
[[!template text="""This is very helpful while you are developing""" start="00:08:43.537" video="mainVideo-water" id="subtitle"]]
[[!template text="""some timer function.""" start="00:08:45.497" video="mainVideo-water" id="subtitle"]]
[[!template text="""So I could cancel the timer that I already have running""" start="00:08:48.438" video="mainVideo-water" id="subtitle"]]
[[!template text="""for shaking the plant,""" start="00:08:53.779" video="mainVideo-water" id="subtitle"]]
[[!template text="""as well as the one for watering the plant.""" start="00:08:57.420" video="mainVideo-water" id="subtitle"]]
[[!template text="""and back to the code.""" start="00:09:02.842" video="mainVideo-water" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Managing the plant""" start="00:09:05.724" video="mainVideo-water" id="subtitle"]]</div>[[!template text="""So now we'll talk about the actual code for""" start="00:09:05.724" video="mainVideo-water" id="subtitle"]]
[[!template text="""managing the plant.""" start="00:09:08.646" video="mainVideo-water" id="subtitle"]]
[[!template text="""So you see I have a variable set up here""" start="00:09:14.210" video="mainVideo-water" id="subtitle"]]
[[!template text="""that specifies where the certificate file,""" start="00:09:16.471" video="mainVideo-water" id="subtitle"]]
[[!template text="""the public certificate file, as well as""" start="00:09:20.994" video="mainVideo-water" id="subtitle"]]
[[!template text="""the secret key file is located.""" start="00:09:23.936" video="mainVideo-water" id="subtitle"]]
[[!template text="""This is where it is in my system.""" start="00:09:27.918" video="mainVideo-water" id="subtitle"]]
[[!template text="""Of course, depending on your specific Gemini client,""" start="00:09:30.119" video="mainVideo-water" id="subtitle"]]
[[!template text="""it may be in a different space and will likely have a""" start="00:09:33.481" video="mainVideo-water" id="subtitle"]]
[[!template text="""different name.""" start="00:09:36.762" video="mainVideo-water" id="subtitle"]]
[[!template text="""And here is the code for watering the plant,""" start="00:09:41.045" video="mainVideo-water" id="subtitle"]]
[[!template text="""which I can call interactively.""" start="00:09:44.526" video="mainVideo-water" id="subtitle"]]
[[!template text="""And the core of it here is that it uses the""" start="00:09:49.412" video="mainVideo-water" id="subtitle"]]
[[!template text="""gmni utility, a command line utility to""" start="00:09:52.834" video="mainVideo-water" id="subtitle"]]
[[!template text="""call a particular URL while also loading up""" start="00:10:00.998" video="mainVideo-water" id="subtitle"]]
[[!template text="""or presenting the required certificate.""" start="00:10:07.702" video="mainVideo-water" id="subtitle"]]
[[!template text="""So in this case, you can see it is the URL that is""" start="00:10:12.505" video="mainVideo-water" id="subtitle"]]
[[!template text="""required for watering the plant.""" start="00:10:16.567" video="mainVideo-water" id="subtitle"]]
[[!template text="""This idea is very simple and the gmni client""" start="00:10:19.827" video="mainVideo-water" id="subtitle"]]
[[!template text="""or gmni command line program""" start="00:10:26.353" video="mainVideo-water" id="subtitle"]]
[[!template text="""makes this very simple to do.""" start="00:10:30.758" video="mainVideo-water" id="subtitle"]]
[[!template text="""Here's another function for shaking the plant.""" start="00:10:34.554" video="mainVideo-water" id="subtitle"]]
[[!template text="""Again it is almost identical except that we""" start="00:10:37.696" video="mainVideo-water" id="subtitle"]]
[[!template text="""use a different URL,""" start="00:10:40.958" video="mainVideo-water" id="subtitle"]]
[[!template text="""one for shaking the plant instead of watering it.""" start="00:10:44.180" video="mainVideo-water" id="subtitle"]]
[[!template text="""And again we want to shake the plant""" start="00:10:47.562" video="mainVideo-water" id="subtitle"]]
[[!template text="""in order to get money to fall off of it.""" start="00:10:50.044" video="mainVideo-water" id="subtitle"]]
[[!template text="""You need to water your plant at least once per day or""" start="00:10:55.847" video="mainVideo-water" id="subtitle"]]
[[!template text="""it'll die.""" start="00:11:00.791" video="mainVideo-water" id="subtitle"]]
[[!template text="""I usually water mine twice and just in case something""" start="00:11:02.930" video="mainVideo-water" id="subtitle"]]
[[!template text="""happens where Emacs was turned off because of""" start="00:11:10.013" video="mainVideo-water" id="subtitle"]]
[[!template text="""power outage or something like that""" start="00:11:13.414" video="mainVideo-water" id="subtitle"]]
[[!template text="""that I'm more likely to get it watered,""" start="00:11:15.595" video="mainVideo-water" id="subtitle"]]
[[!template text="""and I shake it once per day because there isn't""" start="00:11:19.036" video="mainVideo-water" id="subtitle"]]
[[!template text="""any purpose to shaking it more than that.""" start="00:11:23.398" video="mainVideo-water" id="subtitle"]]
[[!template text="""If you try to shake it more than that,""" start="00:11:25.619" video="mainVideo-water" id="subtitle"]]
[[!template text="""then money no more money will fall off,""" start="00:11:27.420" video="mainVideo-water" id="subtitle"]]
[[!template text="""or not much.""" start="00:11:30.321" video="mainVideo-water" id="subtitle"]]
[[!template text="""So you see down here, I have the code that""" start="00:11:37.242" video="mainVideo-water" id="subtitle"]]
[[!template text="""actually calls run-at-time.""" start="00:11:39.627" video="mainVideo-water" id="subtitle"]]
[[!template text="""I left here commented my original forms of this""" start="00:11:42.560" video="mainVideo-water" id="subtitle"]]
[[!template text="""which used the just specify directly the time of day.""" start="00:11:45.661" video="mainVideo-water" id="subtitle"]]
[[!template text="""As I mentioned the problem with that""" start="00:11:50.644" video="mainVideo-water" id="subtitle"]]
[[!template text="""was that it would...""" start="00:11:53.505" video="mainVideo-water" id="subtitle"]]
[[!template text="""these functions would also get called""" start="00:11:54.786" video="mainVideo-water" id="subtitle"]]
[[!template text="""whenever I restarted Emacs for any""" start="00:11:59.208" video="mainVideo-water" id="subtitle"]]
[[!template text="""reason and that was kind of annoying.""" start="00:12:02.709" video="mainVideo-water" id="subtitle"]]
[[!template text="""So instead we have here the functions down here""" start="00:12:05.011" video="mainVideo-water" id="subtitle"]]
[[!template text="""which uses secs-until-daily""" start="00:12:07.452" video="mainVideo-water" id="subtitle"]]
[[!template text="""to water the plant""" start="00:12:10.913" video="mainVideo-water" id="subtitle"]]
[[!template text="""and then secs-until-daily to shake the plant.""" start="00:12:12.294" video="mainVideo-water" id="subtitle"]]
[[!template text="""You see, I've specified the plant to get watered""" start="00:12:16.057" video="mainVideo-water" id="subtitle"]]
[[!template text="""at 4 in the morning and then the function is run again""" start="00:12:21.181" video="mainVideo-water" id="subtitle"]]
[[!template text="""after that, every 43,200 seconds, which translates to""" start="00:12:26.125" video="mainVideo-water" id="subtitle"]]
[[!template text="""every 12 hours,""" start="00:12:31.389" video="mainVideo-water" id="subtitle"]]
[[!template text="""and then I shake the plants, shake the plant""" start="00:12:33.711" video="mainVideo-water" id="subtitle"]]
[[!template text="""every morning at 4.15 a.m. and once every [24] hours.""" start="00:12:38.760" video="mainVideo-water" id="subtitle"]]
[[!template text="""With a little bit more""" start="00:12:45.742" video="mainVideo-water" id="subtitle"]]
[[!template text="""sophistication, a little bit more work on the code,""" start="00:12:46.902" video="mainVideo-water" id="subtitle"]]
[[!template text="""I could actually have multiple plants be watering and""" start="00:12:50.143" video="mainVideo-water" id="subtitle"]]
[[!template text="""shaking multiple plants with multiple certificates,""" start="00:12:54.264" video="mainVideo-water" id="subtitle"]]
[[!template text="""but I never got around to that.""" start="00:12:58.105" video="mainVideo-water" id="subtitle"]]
[[!template text="""Didn't seem worth the bother to me.""" start="00:13:00.946" video="mainVideo-water" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Conclusion""" start="00:13:09.560" video="mainVideo-water" id="subtitle"]]</div>[[!template text="""So thank you for watching my video,""" start="00:13:09.560" video="mainVideo-water" id="subtitle"]]
[[!template text="""Watering My Digital Plant with Emacs Timers.""" start="00:13:13.825" video="mainVideo-water" id="subtitle"]]
[[!template text="""You'll see at the bottom of this page""" start="00:13:16.628" video="mainVideo-water" id="subtitle"]]
[[!template text="""links to the code for this talk""" start="00:13:19.491" video="mainVideo-water" id="subtitle"]]
[[!template text="""as well as other things that I mentioned""" start="00:13:22.354" video="mainVideo-water" id="subtitle"]]
[[!template text="""like the source code for the""" start="00:13:24.677" video="mainVideo-water" id="subtitle"]]
[[!template text="""Elpher Gemini client,""" start="00:13:27.979" video="mainVideo-water" id="subtitle"]]
[[!template text="""the URL for the Astrobotany capsule,""" start="00:13:30.801" video="mainVideo-water" id="subtitle"]]
[[!template text="""as well as a link to more information about""" start="00:13:34.203" video="mainVideo-water" id="subtitle"]]
[[!template text="""Project Gemini and my own personal Gemini capsule""" start="00:13:36.925" video="mainVideo-water" id="subtitle"]]
[[!template text="""that's being run off my own server at home.""" start="00:13:42.808" video="mainVideo-water" id="subtitle"]]
[[!template text="""Thank you very much.""" start="00:13:46.790" video="mainVideo-water" id="subtitle"]]

</div>Questions or comments? Please e-mail [christopher@librehacker.com](mailto:christopher@librehacker.com?subject=Comment%20for%20EmacsConf%202023%20water%3A%20Watering%20my%20%28digital%29%20plant%20with%20Emacs%20timers)


<!-- End of emacsconf-publish-after-page -->