summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main--chapters.vtt26
-rw-r--r--2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.vtt662
-rw-r--r--2024/info/water-after.md243
-rw-r--r--2024/info/water-before.md14
4 files changed, 943 insertions, 2 deletions
diff --git a/2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main--chapters.vtt b/2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main--chapters.vtt
new file mode 100644
index 00000000..cb5646ed
--- /dev/null
+++ b/2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main--chapters.vtt
@@ -0,0 +1,26 @@
+WEBVTT
+
+
+00:00:02.679 --> 00:00:25.676
+Introduction
+
+00:00:28.823 --> 00:00:47.234
+What is Astrobotany?
+
+00:00:48.914 --> 00:01:22.096
+What is Gemini?
+
+00:01:25.337 --> 00:03:34.999
+How do you play Astrobotany?
+
+00:03:37.000 --> 00:06:35.750
+Timers
+
+00:06:37.792 --> 00:09:03.843
+The code
+
+00:09:05.724 --> 00:13:02.246
+Managing the plant
+
+00:13:09.560 --> 00:13:47.471
+Conclusion
diff --git a/2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.vtt b/2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.vtt
new file mode 100644
index 00000000..2293a61e
--- /dev/null
+++ b/2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.vtt
@@ -0,0 +1,662 @@
+WEBVTT captioned by sachac
+
+NOTE Introduction
+
+00:00:02.679 --> 00:00:06.782
+Welcome to Watering My Digital Plant with Emacs Timers,
+
+00:00:07.503 --> 00:00:11.384
+a talk by Christopher Howard for Emacs Conference 2024.
+
+00:00:11.385 --> 00:00:16.989
+The goal of this talk is to give
+
+00:00:17.010 --> 00:00:19.431
+a brief introduction to Emacs timers
+
+00:00:20.892 --> 00:00:23.334
+using the illustration of how I created
+
+00:00:23.394 --> 00:00:25.676
+a bot for the Astrobotany service.
+
+NOTE What is Astrobotany?
+
+00:00:28.823 --> 00:00:30.004
+What is Astrobotany?
+
+00:00:30.924 --> 00:00:32.384
+Let me jump to the home page.
+
+00:00:38.649 --> 00:00:42.411
+Astrobotany is a botany game or a simulation
+
+00:00:42.611 --> 00:00:45.072
+that is played using the Gemini protocol
+
+00:00:45.893 --> 00:00:47.234
+and gemtext documents.
+
+NOTE What is Gemini?
+
+00:00:48.914 --> 00:00:49.615
+What is Gemini?
+
+00:00:50.700 --> 00:00:53.563
+The Gemini protocol is a small web protocol,
+
+00:00:54.263 --> 00:00:57.246
+similar to the HyperText Transfer Protocol,
+
+00:00:58.047 --> 00:01:00.109
+but with differing goals of simplicity,
+
+00:01:00.789 --> 00:01:03.712
+non-extensibility, and protecting privacy.
+
+00:01:05.453 --> 00:01:09.057
+Gemtext is a simple hyperlinking document format,
+
+00:01:09.557 --> 00:01:14.242
+the analog of the HyperText Markup Language, or HTML.
+
+00:01:16.095 --> 00:01:17.075
+Much more could be said
+
+00:01:17.135 --> 00:01:18.516
+about the design and goals
+
+00:01:18.576 --> 00:01:19.756
+of the Gemini project,
+
+00:01:20.236 --> 00:01:22.096
+but that is not the focus of this talk.
+
+NOTE How do you play Astrobotany?
+
+00:01:25.337 --> 00:01:27.057
+And how do you play Astrobotany?
+
+00:01:28.418 --> 00:01:30.518
+First, you need to get a Gemini client
+
+00:01:31.138 --> 00:01:32.838
+or what you might call a browser.
+
+00:01:34.079 --> 00:01:35.599
+Many clients are available,
+
+00:01:36.259 --> 00:01:39.860
+but I am using Elpher, a Gemini client for Emacs.
+
+00:01:41.340 --> 00:01:43.161
+Once you have your client running,
+
+00:01:43.801 --> 00:01:46.361
+navigate to the home page for Astrobotany,
+
+00:01:46.782 --> 00:01:48.842
+which is shown in this window.
+
+00:01:50.783 --> 00:01:53.023
+You'll see the URL for the home page
+
+00:01:53.103 --> 00:01:54.704
+displayed at the top of the window.
+
+00:01:57.865 --> 00:01:59.625
+On your first visit to Astrobotany,
+
+00:02:00.406 --> 00:02:02.586
+you will need to create a client certificate,
+
+00:02:03.426 --> 00:02:05.507
+which will be used instead of a password.
+
+00:02:06.067 --> 00:02:07.548
+Your Gemini client will help you
+
+00:02:07.588 --> 00:02:08.768
+to create the certificate.
+
+00:02:12.102 --> 00:02:16.306
+Then you will go to the Visit Your Plant page
+
+00:02:22.472 --> 00:02:24.553
+in order to view your plant,
+
+00:02:28.297 --> 00:02:32.781
+to water it, and to collect things from it,
+
+00:02:33.141 --> 00:02:37.928
+including money. So here you see
+
+00:02:37.968 --> 00:02:39.429
+the plant that I'm currently growing
+
+00:02:40.229 --> 00:02:41.910
+in glorious ASCII graphics.
+
+00:02:43.070 --> 00:02:46.691
+There's also a color version available from this page.
+
+00:02:56.895 --> 00:02:57.935
+Back at the home page,
+
+00:02:59.536 --> 00:03:00.836
+you can do other things
+
+00:03:02.537 --> 00:03:05.358
+like go to the item shop,
+
+00:03:07.165 --> 00:03:10.247
+to buy items like badges, fertilizer,
+
+00:03:11.607 --> 00:03:13.348
+or post on the message board.
+
+00:03:15.849 --> 00:03:18.991
+In Astrobotany, gardener bots are fully legal.
+
+00:03:20.852 --> 00:03:23.153
+And to do an action on your plant,
+
+00:03:23.693 --> 00:03:24.814
+like watering the plant,
+
+00:03:25.454 --> 00:03:26.915
+all your bot needs to do is
+
+00:03:27.035 --> 00:03:30.917
+to access the appropriate Gemini URL or page
+
+00:03:31.537 --> 00:03:33.998
+while presenting the appropriate certificate
+
+00:03:34.419 --> 00:03:34.999
+for your plant.
+
+NOTE Timers
+
+00:03:37.000 --> 00:03:39.862
+And this brings us to Emacs timers.
+
+00:03:42.904 --> 00:03:45.906
+So the main function of interest to us
+
+00:03:46.626 --> 00:03:49.288
+is the run-at-time function.
+
+00:04:00.714 --> 00:04:03.235
+Here is the help documentation,
+
+00:04:03.395 --> 00:04:07.036
+which is available in any recent Emacs installation.
+
+00:04:10.157 --> 00:04:13.277
+As you see, the purpose of the function
+
+00:04:13.498 --> 00:04:16.718
+is to perform an action at a specific time
+
+00:04:20.920 --> 00:04:25.801
+to repeat it after a specific number of seconds.
+
+00:04:29.770 --> 00:04:32.573
+And so basically, all you have to do is
+
+00:04:32.673 --> 00:04:35.795
+pass in a function to run-at-time,
+
+00:04:36.436 --> 00:04:39.058
+telling Emacs how soon you want to run the function,
+
+00:04:39.999 --> 00:04:41.541
+and then how often you want to run the
+
+00:04:41.581 --> 00:04:42.461
+function after that.
+
+00:04:44.403 --> 00:04:46.605
+The function has a variety of options for
+
+00:04:46.645 --> 00:04:48.887
+specifying the time parameter,
+
+00:04:49.347 --> 00:04:52.030
+that is, how soon you want the function to run.
+
+00:04:55.307 --> 00:04:57.428
+For our application, in which we'll be
+
+00:04:57.508 --> 00:04:58.409
+running our functions
+
+00:04:58.649 --> 00:05:01.030
+once or twice a day at specific times,
+
+00:05:03.152 --> 00:05:04.513
+it is most useful to
+
+00:05:04.553 --> 00:05:06.954
+specify the number of seconds until the event.
+
+00:05:08.515 --> 00:05:09.876
+This does, however, require
+
+00:05:10.436 --> 00:05:11.977
+calculating the number of seconds
+
+00:05:12.097 --> 00:05:15.399
+until a specific time of day. I will
+
+00:05:15.419 --> 00:05:16.800
+provide code for this shortly.
+
+00:05:18.860 --> 00:05:20.803
+The run-at-time function does allow you to
+
+00:05:20.864 --> 00:05:23.308
+specify the time parameter as a string,
+
+00:05:24.029 --> 00:05:25.672
+representing the hours and minutes.
+
+00:05:26.413 --> 00:05:32.149
+For example, 05:40.
+
+00:05:32.150 --> 00:05:34.051
+However, there is an oddity in the
+
+00:05:34.091 --> 00:05:35.392
+design of run-at-time,
+
+00:05:36.372 --> 00:05:41.395
+such that if the specified time of day has
+
+00:05:41.455 --> 00:05:42.216
+already passed,
+
+00:05:43.196 --> 00:05:44.877
+then the timer will run immediately,
+
+00:05:45.578 --> 00:05:46.638
+rather than in the future,
+
+00:05:46.958 --> 00:05:47.839
+as you might expect.
+
+00:05:49.280 --> 00:05:51.441
+This can be problematic, for example,
+
+00:05:51.661 --> 00:05:54.663
+if run-at-time is being called from your init file,
+
+00:05:55.583 --> 00:05:57.624
+since the timer will run immediately
+
+00:05:58.245 --> 00:06:00.426
+every time you restart Emacs for any reason.
+
+00:06:02.526 --> 00:06:04.691
+I noticed recently that run-at-time
+
+00:06:04.791 --> 00:06:07.217
+also allows you to pass in a value
+
+00:06:07.317 --> 00:06:17.657
+from encode-time, which maybe does what we want,
+
+00:06:18.378 --> 00:06:20.760
+but I never bothered with testing that.
+
+00:06:21.340 --> 00:06:23.041
+Actually, I have a vague memory of
+
+00:06:23.181 --> 00:06:25.743
+once looking into it and it didn't seem to do what I
+
+00:06:25.783 --> 00:06:29.286
+wanted, but honestly I can't clearly remember,
+
+00:06:29.946 --> 00:06:31.667
+so you may want to look into that yourself.
+
+00:06:32.728 --> 00:06:34.209
+What I ended up using was just
+
+00:06:34.309 --> 00:06:35.750
+passing in a number of seconds.
+
+NOTE The code
+
+00:06:37.792 --> 00:06:39.413
+So now we'll move over to the code.
+
+00:06:46.764 --> 00:06:49.426
+So I'll skip down here first
+
+00:06:49.966 --> 00:06:52.447
+to the code that I wrote for calculating the number of
+
+00:06:52.527 --> 00:06:52.887
+seconds.
+
+00:06:54.408 --> 00:06:57.790
+It's a function that calculates the number of seconds
+
+00:06:58.050 --> 00:07:01.012
+until a particular time of day in the future.
+
+00:07:04.214 --> 00:07:09.277
+You can see that you pass in the hour as a number from
+
+00:07:09.278 --> 00:07:19.137
+0 to 23 and the minutes as a number from 0 to 59. And
+
+00:07:20.078 --> 00:07:22.539
+here's the code, which will also be available later.
+
+00:07:25.700 --> 00:07:29.202
+I wrote another function, secs-until-weekly,
+
+00:07:29.522 --> 00:07:32.464
+which we do not need for this talk,
+
+00:07:32.604 --> 00:07:34.685
+but which is useful if you're running
+
+00:07:34.745 --> 00:07:36.746
+events which need to happen once per week.
+
+00:07:39.264 --> 00:07:44.025
+This function also requires a target hour
+
+00:07:44.085 --> 00:07:48.926
+and a target minute, but also requires passing in a
+
+00:07:48.966 --> 00:08:00.548
+target day. And while we're on the subject of timers
+
+00:08:00.568 --> 00:08:02.588
+specifically, I should mention that
+
+00:08:02.648 --> 00:08:05.929
+Emacs has a very useful function called list-timers.
+
+00:08:07.577 --> 00:08:09.959
+So if I call the interactive function list-timers,
+
+00:08:11.560 --> 00:08:14.542
+it will give me a list of all the timers
+
+00:08:14.842 --> 00:08:15.542
+currently running.
+
+00:08:16.723 --> 00:08:19.625
+This page shows not only which timers exist,
+
+00:08:20.186 --> 00:08:22.807
+but also how long it will be until they run again,
+
+00:08:23.848 --> 00:08:26.750
+along with the periodic repeat value that you
+
+00:08:26.770 --> 00:08:27.390
+specified.
+
+00:08:29.992 --> 00:08:33.034
+Furthermore, any timer can be canceled by moving point
+
+00:08:33.514 --> 00:08:38.515
+over the timer and running timer-list-cancel,
+
+00:08:38.696 --> 00:08:42.556
+which on my system is bound to the letter c by default.
+
+00:08:43.537 --> 00:08:45.417
+This is very helpful while you are developing
+
+00:08:45.497 --> 00:08:46.537
+some timer function.
+
+00:08:48.438 --> 00:08:52.158
+So I could cancel the timer that I already have running
+
+00:08:53.779 --> 00:08:55.059
+for shaking the plant,
+
+00:08:57.420 --> 00:08:59.360
+as well as the one for watering the plant.
+
+00:09:02.842 --> 00:09:03.843
+and back to the code.
+
+NOTE Managing the plant
+
+00:09:05.724 --> 00:09:08.566
+So now we'll talk about the actual code for
+
+00:09:08.646 --> 00:09:09.567
+managing the plant.
+
+00:09:14.210 --> 00:09:16.031
+So you see I have a variable set up here
+
+00:09:16.471 --> 00:09:19.353
+that specifies where the certificate file,
+
+00:09:20.994 --> 00:09:23.836
+the public certificate file, as well as
+
+00:09:23.936 --> 00:09:26.458
+the secret key file is located.
+
+00:09:27.918 --> 00:09:29.459
+This is where it is in my system.
+
+00:09:30.119 --> 00:09:33.181
+Of course, depending on your specific Gemini client,
+
+00:09:33.481 --> 00:09:36.722
+it may be in a different space and will likely have a
+
+00:09:36.762 --> 00:09:37.303
+different name.
+
+00:09:41.045 --> 00:09:43.486
+And here is the code for watering the plant,
+
+00:09:44.526 --> 00:09:45.967
+which I can call interactively.
+
+00:09:49.412 --> 00:09:52.334
+And the core of it here is that it uses the
+
+00:09:52.834 --> 00:09:57.937
+gmni utility, a command line utility to
+
+00:10:00.998 --> 00:10:06.982
+call a particular URL while also loading up
+
+00:10:07.702 --> 00:10:10.564
+or presenting the required certificate.
+
+00:10:12.505 --> 00:10:16.447
+So in this case, you can see it is the URL that is
+
+00:10:16.567 --> 00:10:18.088
+required for watering the plant.
+
+00:10:19.827 --> 00:10:24.952
+This idea is very simple and the gmni client
+
+00:10:26.353 --> 00:10:30.097
+or gmni command line program
+
+00:10:30.758 --> 00:10:31.999
+makes this very simple to do.
+
+00:10:34.554 --> 00:10:36.535
+Here's another function for shaking the plant.
+
+00:10:37.696 --> 00:10:40.758
+Again it is almost identical except that we
+
+00:10:40.958 --> 00:10:43.300
+use a different URL,
+
+00:10:44.180 --> 00:10:46.982
+one for shaking the plant instead of watering it.
+
+00:10:47.562 --> 00:10:49.183
+And again we want to shake the plant
+
+00:10:50.044 --> 00:10:51.745
+in order to get money to fall off of it.
+
+00:10:55.847 --> 00:10:59.290
+You need to water your plant at least once per day or
+
+00:11:00.791 --> 00:11:01.251
+it'll die.
+
+00:11:02.930 --> 00:11:09.953
+I usually water mine twice and just in case something
+
+00:11:10.013 --> 00:11:13.314
+happens where Emacs was turned off because of
+
+00:11:13.414 --> 00:11:15.035
+power outage or something like that
+
+00:11:15.595 --> 00:11:17.196
+that I'm more likely to get it watered,
+
+00:11:19.036 --> 00:11:21.957
+and I shake it once per day because there isn't
+
+00:11:23.398 --> 00:11:25.339
+any purpose to shaking it more than that.
+
+00:11:25.619 --> 00:11:27.240
+If you try to shake it more than that,
+
+00:11:27.420 --> 00:11:29.560
+then money no more money will fall off,
+
+00:11:30.321 --> 00:11:30.821
+or not much.
+
+00:11:37.242 --> 00:11:39.526
+So you see down here, I have the code that
+
+00:11:39.627 --> 00:11:41.209
+actually calls run-at-time.
+
+00:11:42.560 --> 00:11:45.141
+I left here commented my original forms of this
+
+00:11:45.661 --> 00:11:50.024
+which used the just specify directly the time of day.
+
+00:11:50.644 --> 00:11:52.225
+As I mentioned the problem with that
+
+00:11:53.505 --> 00:11:54.466
+was that it would...
+
+00:11:54.786 --> 00:11:57.187
+these functions would also get called
+
+00:11:59.208 --> 00:12:02.649
+whenever I restarted Emacs for any
+
+00:12:02.709 --> 00:12:04.250
+reason and that was kind of annoying.
+
+00:12:05.011 --> 00:12:07.352
+So instead we have here the functions down here
+
+00:12:07.452 --> 00:12:09.533
+which uses secs-until-daily
+
+00:12:10.913 --> 00:12:11.754
+to water the plant
+
+00:12:12.294 --> 00:12:14.756
+and then secs-until-daily to shake the plant.
+
+00:12:16.057 --> 00:12:20.821
+You see, I've specified the plant to get watered
+
+00:12:21.181 --> 00:12:26.025
+at 4 in the morning and then the function is run again
+
+00:12:26.125 --> 00:12:31.269
+after that, every 43,200 seconds, which translates to
+
+00:12:31.389 --> 00:12:32.270
+every 12 hours,
+
+00:12:33.711 --> 00:12:36.353
+and then I shake the plants, shake the plant
+
+00:12:38.760 --> 00:12:43.341
+every morning at 4.15 a.m. and once every [24] hours.
+
+00:12:45.742 --> 00:12:46.802
+With a little bit more
+
+00:12:46.902 --> 00:12:49.483
+sophistication, a little bit more work on the code,
+
+00:12:50.143 --> 00:12:53.964
+I could actually have multiple plants be watering and
+
+00:12:54.264 --> 00:12:57.985
+shaking multiple plants with multiple certificates,
+
+00:12:58.105 --> 00:12:59.885
+but I never got around to that.
+
+00:13:00.946 --> 00:13:02.246
+Didn't seem worth the bother to me.
+
+NOTE Conclusion
+
+00:13:09.560 --> 00:13:12.964
+So thank you for watching my video,
+
+00:13:13.825 --> 00:13:16.227
+Watering My Digital Plant with Emacs Timers.
+
+00:13:16.628 --> 00:13:18.189
+You'll see at the bottom of this page
+
+00:13:19.491 --> 00:13:21.613
+links to the code for this talk
+
+00:13:22.354 --> 00:13:24.096
+as well as other things that I mentioned
+
+00:13:24.677 --> 00:13:27.819
+like the source code for the
+
+00:13:27.979 --> 00:13:30.100
+Elpher Gemini client,
+
+00:13:30.801 --> 00:13:33.282
+the URL for the Astrobotany capsule,
+
+00:13:34.203 --> 00:13:36.865
+as well as a link to more information about
+
+00:13:36.925 --> 00:13:41.407
+Project Gemini and my own personal Gemini capsule
+
+00:13:42.808 --> 00:13:45.129
+that's being run off my own server at home.
+
+00:13:46.790 --> 00:13:47.471
+Thank you very much.
diff --git a/2024/info/water-after.md b/2024/info/water-after.md
index fca52a2e..87265d51 100644
--- a/2024/info/water-after.md
+++ b/2024/info/water-after.md
@@ -1,6 +1,249 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="water-mainVideo-transcript"></a>
+# Transcript
+
+
+[[!template new="1" text="""Introduction""" start="00:00:02.679" video="mainVideo-water" id="subtitle"]]
+
+[[!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"]]
+
+[[!template new="1" text="""What is Astrobotany?""" start="00:00:28.823" video="mainVideo-water" id="subtitle"]]
+
+[[!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"]]
+
+[[!template new="1" text="""What is Gemini?""" start="00:00:48.914" video="mainVideo-water" id="subtitle"]]
+
+[[!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"]]
+
+[[!template new="1" text="""How do you play Astrobotany?""" start="00:01:25.337" video="mainVideo-water" id="subtitle"]]
+
+[[!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"]]
+
+[[!template new="1" text="""Timers""" start="00:03:37.000" video="mainVideo-water" id="subtitle"]]
+
+[[!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"]]
+
+[[!template new="1" text="""The code""" start="00:06:37.792" video="mainVideo-water" id="subtitle"]]
+
+[[!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"]]
+
+[[!template new="1" text="""Managing the plant""" start="00:09:05.724" video="mainVideo-water" id="subtitle"]]
+
+[[!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"]]
+
+[[!template new="1" text="""Conclusion""" start="00:13:09.560" video="mainVideo-water" id="subtitle"]]
+
+[[!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"]]
+
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)
diff --git a/2024/info/water-before.md b/2024/info/water-before.md
index 82122627..51a5bff6 100644
--- a/2024/info/water-before.md
+++ b/2024/info/water-before.md
@@ -1,19 +1,29 @@
<!-- Automatically generated by emacsconf-publish-before-page -->
The following image shows where the talk is in the schedule for Sat 2024-12-07. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="water">
-<svg width="700" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="700" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2024/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(11,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2024/talks/papers" title="Writing academic papers in Org-Roam" data-slug="papers"> <title> 9:10- 9:20 Writing academic papers in Org-Roam</title> <rect x="13" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(24,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> papers</text></g></a> <a href="/2024/talks/project" title="Managing writing project metadata with org-mode" data-slug="project"> <title> 9:40-10:00 Managing writing project metadata with org-mode</title> <rect x="54" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(79,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> project</text></g></a> <a href="/2024/talks/org-update" title="The Future of Org" data-slug="org-update"> <title> 10:20-11:00 The Future of Org</title> <rect x="109" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(161,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-update</text></g></a> <a href="/2024/talks/color" title="Colour your Emacs with ease" data-slug="color"> <title> 11:20-11:30 Colour your Emacs with ease</title> <rect x="192" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(203,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> color</text></g></a> <a href="/2024/talks/theme" title="My journey of finding and creating the “perfect” Emacs theme" data-slug="theme"> <title> 1:00- 1:10 My journey of finding and creating the “perfect” Emacs theme</title> <rect x="329" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(340,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> theme</text></g></a> <a href="/2024/talks/water" title="Watering my (digital) plant with Emacs timers" data-slug="water"> <title> 1:30- 1:45 Watering my (digital) plant with Emacs timers</title> <rect stroke-width="3" x="370" y="15" opacity="0.8" width="20" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(388,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> water</text></g></a> <a href="/2024/talks/shell" title="Emacs as a shell" data-slug="shell"> <title> 1:55- 2:35 Emacs as a shell</title> <rect x="404" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(456,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> shell</text></g></a> <a href="/2024/talks/casual" title="Re-imagining the Emacs user experience with Casual Suite" data-slug="casual"> <title> 2:45- 3:05 Re-imagining the Emacs user experience with Casual Suite</title> <rect x="473" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> casual</text></g></a> <a href="/2024/talks/hyperdrive" title="New in hyperdrive.el: quick install, peer graph, transclusion!" data-slug="hyperdrive"> <title> 3:25- 3:45 New in hyperdrive.el: quick install, peer graph, transclusion!</title> <rect x="528" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(553,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperdrive</text></g></a> <a href="/2024/talks/writing" title="Emacs Writing Studio" data-slug="writing"> <title> 4:05- 4:15 Emacs Writing Studio</title> <rect x="583" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(594,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2024/talks/emacs30" title="Emacs 30 Highlights" data-slug="emacs30"> <title> 4:25- 4:50 Emacs 30 Highlights</title> <rect x="610" y="15" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(642,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> emacs30</text></g></a> <a href="/2024/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:00- 5:10 Saturday closing remarks</title> <rect x="658" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(669,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2024/talks/gypsum" title="Gypsum: my clone of Emacs and ELisp written in Scheme" data-slug="gypsum"> <title> 10:00-10:20 Gypsum: my clone of Emacs and ELisp written in Scheme</title> <rect x="82" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gypsum</text></g></a> <a href="/2024/talks/rust" title="An experimental Emacs core in Rust" data-slug="rust"> <title> 10:40-11:00 An experimental Emacs core in Rust</title> <rect x="137" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rust</text></g></a> <a href="/2024/talks/p-search" title="p-search: a local search engine in Emacs" data-slug="p-search"> <title> 11:20-11:45 p-search: a local search engine in Emacs</title> <rect x="192" y="75" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(224,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> p-search</text></g></a> <a href="/2024/talks/julia" title="Exploring shared philosophies in Julia and Emacs" data-slug="julia"> <title> 1:00- 1:10 Exploring shared philosophies in Julia and Emacs</title> <rect x="329" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(340,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> julia</text></g></a> <a href="/2024/talks/guile" title="Beguiling Emacs: Guile-Emacs relaunched!" data-slug="guile"> <title> 1:25- 1:45 Beguiling Emacs: Guile-Emacs relaunched!</title> <rect x="363" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(388,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> guile</text></g></a> <a href="/2024/talks/secrets" title="Committing secrets with git using sops-mode" data-slug="secrets"> <title> 1:55- 2:05 Committing secrets with git using sops-mode</title> <rect x="404" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(415,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> secrets</text></g></a> <a href="/2024/talks/mcclim" title="Elisp and McCLIM" data-slug="mcclim"> <title> 2:25- 3:25 Elisp and McCLIM</title> <rect x="446" y="75" opacity="0.5" width="82" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(526,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mcclim</text></g></a> <a href="/2024/talks/maxima" title="Emacs, eev, and Maxima - now!" data-slug="maxima"> <title> 3:45- 4:05 Emacs, eev, and Maxima - now!</title> <rect x="555" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(580,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maxima</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(82,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(164,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(247,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(329,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(411,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(494,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(576,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+<svg width="700" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="700" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2024/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(11,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2024/talks/papers" title="Writing academic papers in Org-Roam" data-slug="papers"> <title> 9:10- 9:20 Writing academic papers in Org-Roam</title> <rect x="13" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(24,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> papers</text></g></a> <a href="/2024/talks/project" title="Managing writing project metadata with org-mode" data-slug="project"> <title> 9:40-10:00 Managing writing project metadata with org-mode</title> <rect x="54" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(79,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> project</text></g></a> <a href="/2024/talks/org-update" title="The Future of Org" data-slug="org-update"> <title> 10:20-11:00 The Future of Org</title> <rect x="109" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(161,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-update</text></g></a> <a href="/2024/talks/color" title="Colour your Emacs with ease" data-slug="color"> <title> 11:20-11:30 Colour your Emacs with ease</title> <rect x="192" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(203,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> color</text></g></a> <a href="/2024/talks/theme" title="My journey of finding and creating the “perfect” Emacs theme" data-slug="theme"> <title> 1:00- 1:10 My journey of finding and creating the “perfect” Emacs theme</title> <rect x="329" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(340,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> theme</text></g></a> <a href="/2024/talks/water" title="Watering my (digital) plant with Emacs timers" data-slug="water"> <title> 1:30- 1:45 Watering my (digital) plant with Emacs timers</title> <rect stroke-width="3" x="370" y="15" opacity="0.8" width="20" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(388,73)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> water</text></g></a> <a href="/2024/talks/shell" title="Emacs as a shell" data-slug="shell"> <title> 1:55- 2:35 Emacs as a shell</title> <rect x="404" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(456,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> shell</text></g></a> <a href="/2024/talks/casual" title="Re-imagining the Emacs user experience with Casual Suite" data-slug="casual"> <title> 2:45- 3:05 Re-imagining the Emacs user experience with Casual Suite</title> <rect x="473" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> casual</text></g></a> <a href="/2024/talks/hyperdrive" title="New in hyperdrive.el: quick install, peer graph, transclusion!" data-slug="hyperdrive"> <title> 3:25- 3:45 New in hyperdrive.el: quick install, peer graph, transclusion!</title> <rect x="528" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(553,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperdrive</text></g></a> <a href="/2024/talks/writing" title="Emacs Writing Studio" data-slug="writing"> <title> 4:05- 4:15 Emacs Writing Studio</title> <rect x="583" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(594,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2024/talks/emacs30" title="Emacs 30 Highlights" data-slug="emacs30"> <title> 4:25- 4:50 Emacs 30 Highlights</title> <rect x="610" y="15" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(642,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> emacs30</text></g></a> <a href="/2024/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:00- 5:10 Saturday closing remarks</title> <rect x="658" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(669,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2024/talks/gypsum" title="Gypsum: my clone of Emacs and ELisp written in Scheme" data-slug="gypsum"> <title> 10:00-10:20 Gypsum: my clone of Emacs and ELisp written in Scheme</title> <rect x="82" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gypsum</text></g></a> <a href="/2024/talks/rust" title="An experimental Emacs core in Rust" data-slug="rust"> <title> 10:40-11:00 An experimental Emacs core in Rust</title> <rect x="137" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rust</text></g></a> <a href="/2024/talks/p-search" title="p-search: a local search engine in Emacs" data-slug="p-search"> <title> 11:20-11:45 p-search: a local search engine in Emacs</title> <rect x="192" y="75" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(224,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> p-search</text></g></a> <a href="/2024/talks/julia" title="Exploring shared philosophies in Julia and Emacs" data-slug="julia"> <title> 1:00- 1:10 Exploring shared philosophies in Julia and Emacs</title> <rect x="329" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(340,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> julia</text></g></a> <a href="/2024/talks/guile" title="Beguiling Emacs: Guile-Emacs relaunched!" data-slug="guile"> <title> 1:25- 1:45 Beguiling Emacs: Guile-Emacs relaunched!</title> <rect x="363" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(388,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> guile</text></g></a> <a href="/2024/talks/secrets" title="Committing secrets with git using sops-mode" data-slug="secrets"> <title> 1:55- 2:05 Committing secrets with git using sops-mode</title> <rect x="404" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(415,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> secrets</text></g></a> <a href="/2024/talks/mcclim" title="Elisp and McCLIM" data-slug="mcclim"> <title> 2:25- 3:25 Elisp and McCLIM</title> <rect x="446" y="75" opacity="0.5" width="82" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(526,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mcclim</text></g></a> <a href="/2024/talks/maxima" title="Emacs, eev, and Maxima - now!" data-slug="maxima"> <title> 3:45- 4:05 Emacs, eev, and Maxima - now!</title> <rect x="555" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(580,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maxima</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(82,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(164,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(247,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(329,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(411,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(494,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(576,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
</div>
[[!toc ]]
Format: 14-min talk ; Q&A: IRC <https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen> Etherpad: <https://pad.emacsconf.org/2024-water>
Etherpad: <https://pad.emacsconf.org/2024-water>
Discuss on IRC: [#emacsconf-gen](https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen)
-Status: Ready to stream
+Status: Now playing on the conference livestream
<div>Times in different time zones:</div><div class="times" start="2024-12-07T18:30:00Z" end="2024-12-07T18:45:00Z"><div class="conf-time">Saturday, Dec 7 2024, ~1:30 PM - 1:45 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 7 2024, ~12:30 PM - 12:45 PM CST (US/Central)<br />Saturday, Dec 7 2024, ~11:30 AM - 11:45 AM MST (US/Mountain)<br />Saturday, Dec 7 2024, ~10:30 AM - 10:45 AM PST (US/Pacific)<br />Saturday, Dec 7 2024, ~6:30 PM - 6:45 PM UTC <br />Saturday, Dec 7 2024, ~7:30 PM - 7:45 PM CET (Europe/Paris)<br />Saturday, Dec 7 2024, ~8:30 PM - 8:45 PM EET (Europe/Athens)<br />Sunday, Dec 8 2024, ~12:00 AM - 12:15 AM IST (Asia/Kolkata)<br />Sunday, Dec 8 2024, ~2:30 AM - 2:45 AM +08 (Asia/Singapore)<br />Sunday, Dec 8 2024, ~3:30 AM - 3:45 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2024/watch/gen/">Find out how to watch and participate</a></strong></div>
+<div class="vid"><video controls preload="none" id="water-mainVideo"><source src="https://media.emacsconf.org/2024/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.vtt" default />"""<track kind="chapters" label="Chapters" src="/2024/captions/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main--chapters.vtt" /><p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video>[[!template id="chapters" vidid="water-mainVideo" data="""
+00:02.679 Introduction
+00:28.823 What is Astrobotany?
+00:48.914 What is Gemini?
+01:25.337 How do you play Astrobotany?
+03:37.000 Timers
+06:37.792 The code
+09:05.724 Managing the plant
+13:09.560 Conclusion
+"""]]<div></div>Duration: 13:50 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2024-water">Open Etherpad</a></li><li><a href="https://chat.emacsconf.org/?join=emacsconf,emacsconf-gen">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main--chapters.vtt">Download --main--chapters.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.json">Download --main.json</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard--main.webm">Download --main.webm (37MB)</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-water--watering-my-digital-plant-with-emacs-timers--christopher-howard.mp4">Download .mp4 (21MB)</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file