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)