WEBVTT captioned by sachac, checked by sachac NOTE Intro 00:00:00.000 --> 00:00:04.839 Hi, I'm Sacha Chua. This presentation is a quick tour 00:00:04.840 --> 00:00:07.959 of some of the things we do to run EmacsConf. 00:00:07.960 --> 00:00:12.239 Since 2019, we've run it as an entirely online conference, 00:00:12.240 --> 00:00:14.699 and we do as much of the organization as possible 00:00:14.700 --> 00:00:16.579 within Emacs itself. NOTE Reasons 00:00:16.580 --> 00:00:19.759 I have three reasons for making this presentation. 00:00:19.760 --> 00:00:22.759 The first is entirely selfish: I need to figure out 00:00:22.760 --> 00:00:25.359 all the stuff I built for last year's EmacsConf, 00:00:25.360 --> 00:00:28.079 since it was a bit of a crazy scramble. 00:00:28.080 --> 00:00:30.159 The second is that I want to show people 00:00:30.160 --> 00:00:33.239 the process of thinking about a complex project, 00:00:33.240 --> 00:00:35.879 looking for little things to automate in Emacs, 00:00:35.880 --> 00:00:38.439 and building things up from small pieces. 00:00:38.440 --> 00:00:39.799 Maybe you'll get some ideas 00:00:39.800 --> 00:00:42.759 and start building tools for yourself, too. 00:00:42.760 --> 00:00:47.039 The third is that you find any of these little tools interesting, 00:00:47.040 --> 00:00:49.439 I want to point you to blog posts and source code 00:00:49.440 --> 00:00:51.239 where you can find out more. 00:00:51.240 --> 00:00:52.559 That way, you don't need to try 00:00:52.560 --> 00:00:55.399 to read and understand everything quickly. 00:00:55.400 --> 00:00:57.719 You can find this presentation and other links 00:00:57.720 --> 00:01:04.439 on the talk page at emacsconf.org/2023/talks/emacsconf. 00:01:04.440 --> 00:01:06.319 There are a lot of different parts, 00:01:06.320 --> 00:01:09.399 so I'll try to use this map to help make sense of it all. NOTE Information 00:01:09.400 --> 00:01:11.199 There's so much information to work with, 00:01:11.200 --> 00:01:14.919 so it probably doesn't surprise you that we use Org Mode a lot. 00:01:14.920 --> 00:01:17.999 Most of the conference coordination happens over e-mail, 00:01:18.000 --> 00:01:20.639 which I can quickly search with notmuch. 00:01:20.640 --> 00:01:22.359 Some of the information is private, 00:01:22.360 --> 00:01:24.519 like emergency contact numbers. 00:01:24.520 --> 00:01:28.079 We store the talk information in a private Org file. 00:01:28.080 --> 00:01:30.079 I try to put as much as possible 00:01:30.080 --> 00:01:32.319 into our public organizers' notebook 00:01:32.320 --> 00:01:35.359 so that processes and decisions are documented. 00:01:35.360 --> 00:01:36.919 We need a public website. 00:01:36.920 --> 00:01:39.039 We use Ikiwiki to make the webpages 00:01:39.040 --> 00:01:41.119 because we can work with plain text files 00:01:41.120 --> 00:01:42.599 in a Git repository. 00:01:42.600 --> 00:01:45.399 We also make a few static HTML pages 00:01:45.400 --> 00:01:48.119 for things where Ikiwiki is a little awkward. 00:01:48.120 --> 00:01:50.519 We post announcements to mailing lists. 00:01:50.520 --> 00:01:53.159 We also receive submissions in a private mailing list 00:01:53.160 --> 00:01:55.639 so that a number of people can review them. 00:01:55.640 --> 00:01:56.839 We have a backstage area 00:01:56.840 --> 00:01:59.959 for sharing files with volunteers and speakers. 00:01:59.960 --> 00:02:03.119 We share those files publicly when the talk goes live. 00:02:03.120 --> 00:02:06.319 And there's all the other stuff that goes into running EmacsConf, 00:02:06.320 --> 00:02:09.159 like shell scripts and configuration files. NOTE Properties 00:02:09.160 --> 00:02:12.319 First, speakers propose a talk by sending an e-mail. 00:02:12.320 --> 00:02:15.799 We take the info from that e-mail and store it in Org properties 00:02:15.800 --> 00:02:18.199 so that we can work with it later. 00:02:18.200 --> 00:02:20.599 Every talk is identified with an ID, 00:02:20.600 --> 00:02:24.119 but since `:ID:` and `:CUSTOM_ID:` have special meanings for Org, 00:02:24.120 --> 00:02:25.399 I use `:SLUG:` as the keyword. 00:02:25.600 --> 00:02:27.759 Speakers' names go into the `:NAME:` property, 00:02:27.760 --> 00:02:29.799 and a short version goes into `:NAME_SHORT:` 00:02:29.800 --> 00:02:32.199 so that we can include that in a greeting. 00:02:32.200 --> 00:02:34.439 If people follow the template closely... 00:02:34.440 --> 00:02:38.039 ...we can even automatically fill in the Org subtree for their talk. 00:02:38.040 --> 00:02:40.799 We can use regular expressions to recognize the text 00:02:40.800 --> 00:02:42.879 and extract the properties. 00:02:42.880 --> 00:02:45.359 Other properties need to be set by hand. 00:02:45.360 --> 00:02:47.559 I often mess things up when I retype them. 00:02:47.560 --> 00:02:51.039 To avoid typos, I have a function that sets a property 00:02:51.040 --> 00:02:56.039 based on the current region. I bind that to `C-c C-x p`. 00:02:56.040 --> 00:02:58.599 That makes it much easier to set properties 00:02:58.600 --> 00:03:01.239 that couldn't automatically be recognized. 00:03:01.240 --> 00:03:04.519 Sometimes it makes sense to dynamically generate a property 00:03:04.520 --> 00:03:07.679 and then edit it, like with filenames. 00:03:07.680 --> 00:03:10.399 We like to name all the talk files the same way, 00:03:10.400 --> 00:03:14.439 but sometimes special characters in talk titles or speaker names 00:03:14.440 --> 00:03:17.839 need a little tweaking. I'll put that in a `:FILE_PREFIX:` property 00:03:17.840 --> 00:03:19.439 so I can edit it. 00:03:19.440 --> 00:03:22.799 An Org property match can map over all the talk entries 00:03:22.800 --> 00:03:25.439 that don't have `:FILE_PREFIX:` defined. 00:03:25.440 --> 00:03:29.199 We can use that `:FILE_PREFIX:` to rename files from Emacs. 00:03:29.200 --> 00:03:32.639 With that property, we can then rename files using that prefix, 00:03:32.640 --> 00:03:35.639 some extra text, and the file extension. 00:03:35.640 --> 00:03:38.879 Sometimes it's easier to work with the data outside Emacs, 00:03:38.880 --> 00:03:42.119 like when I want to rename files with a shell script. 00:03:42.120 --> 00:03:45.319 If I export a subset of the data as JSON 00:03:45.320 --> 00:03:48.959 or JavaScript Object Notation, using `json-encode`... 00:03:48.960 --> 00:03:51.119 ... then I can extract the data with `jq` 00:03:51.120 --> 00:03:53.119 and use it in shell scripts. NOTE Timezones 00:03:53.120 --> 00:03:55.639 Another example of semi-structured information 00:03:55.640 --> 00:03:57.299 is speaker availability. 00:03:57.300 --> 00:03:59.619 We have speakers from all over the world, 00:03:59.620 --> 00:04:03.019 so we try to schedule live Q&A sessions when they're around. 00:04:03.020 --> 00:04:05.019 That means working with timezones. 00:04:05.020 --> 00:04:08.439 Completion makes it much easier to set the timezone property 00:04:08.440 --> 00:04:10.599 without worrying about typos. 00:04:10.600 --> 00:04:14.359 We can take advantage of the timezone list from the tzc package, 00:04:14.360 --> 00:04:17.159 which works with Unix timezone definitions. 00:04:17.160 --> 00:04:19.919 Then we can convert times using Emacs. 00:04:19.920 --> 00:04:22.639 Using a standard format to encode the availability 00:04:22.640 --> 00:04:24.399 makes it easier to parse. 00:04:24.400 --> 00:04:27.439 I can use those availability constraints to report errors 00:04:27.440 --> 00:04:29.719 when I'm experimenting with the schedule. NOTE Scheduling 00:04:29.720 --> 00:04:31.679 Now that I have the availability information, 00:04:31.680 --> 00:04:33.940 I can think about scheduling. 00:04:33.941 --> 00:04:38.239 When we were planning EmacsConf 2022, the schedule was so full, 00:04:38.240 --> 00:04:40.839 I wanted to see if we could make it more manageable 00:04:40.840 --> 00:04:43.039 by splitting it up into two tracks. 00:04:43.040 --> 00:04:45.919 It was hard to think about times with just a table. 00:04:45.920 --> 00:04:48.199 I was able to turn the schedule information 00:04:48.200 --> 00:04:51.279 into an SVG to convince the other organizers 00:04:51.280 --> 00:04:53.359 to get on board with this crazy plan. 00:04:53.360 --> 00:04:54.959 And the nice thing about SVGs is that 00:04:54.960 --> 00:04:57.519 they can even be clickable on the wiki. 00:04:57.520 --> 00:05:00.639 Being able to quickly make SVGs of different schedules 00:05:00.640 --> 00:05:04.199 also helped me test scheduling ideas and think out loud. 00:05:04.200 --> 00:05:06.879 I could change the time between talks, the order of the talks, 00:05:06.880 --> 00:05:08.939 and even what tracks the talks were in. 00:05:08.940 --> 00:05:10.719 This was helpful when I needed to include 00:05:10.720 --> 00:05:13.239 some late submissions or availability changes 00:05:13.240 --> 00:05:15.599 and I wanted to ask speakers what they thought. 00:05:15.600 --> 00:05:18.799 They could see the different schedule options themselves. 00:05:18.800 --> 00:05:22.679 It's really nice to have Emacs Lisp support for working with SVGs. 00:05:22.680 --> 00:05:25.399 I also love how I can have an Emacs Lisp block 00:05:25.400 --> 00:05:28.599 in an Org Mode document that updates an SVG 00:05:28.600 --> 00:05:31.999 that I can view right there in my text editor. 00:05:32.000 --> 00:05:34.799 Setting the timezone lets me automatically translate times 00:05:34.800 --> 00:05:37.819 to the speaker's local timezone when I e-mail them. 00:05:37.820 --> 00:05:41.779 That's mostly a matter of using `format-time-string` with a timezone. NOTE Templates 00:05:41.780 --> 00:05:43.159 There's a lot of text to work with, 00:05:43.160 --> 00:05:45.699 which means templates are super handy. 00:05:45.700 --> 00:05:48.119 There are a number of templating functions for Emacs Lisp, 00:05:48.120 --> 00:05:52.959 like the built-in `tempo.el` or `s-lex-format` from `s.el`. 00:05:52.960 --> 00:05:54.439 I ended up writing something 00:05:54.440 --> 00:05:58.019 that works with property lists (plists) instead, 00:05:58.020 --> 00:06:02.199 since we use plists all over the emacsconf-el library. 00:06:02.200 --> 00:06:03.999 All it does is replace `${variable}` 00:06:04.000 --> 00:06:05.519 with the value from a property list. 00:06:05.520 --> 00:06:07.559 I use this mostly because I have a hard time 00:06:07.560 --> 00:06:11.079 keeping track of which `%s` is which when I use `format`, 00:06:11.080 --> 00:06:14.299 and it's hard to get an overall view if I just use `concat`. 00:06:14.300 --> 00:06:17.599 The code looks for the properties and replaces them with the values. 00:06:17.600 --> 00:06:21.299 I just find it a little easier to think about sometimes. 00:06:21.300 --> 00:06:24.079 Getting all the information is just a matter of going over 00:06:24.080 --> 00:06:27.399 all the talk entries using `org-map-entries`. 00:06:27.400 --> 00:06:30.699 This builds the talk info by running a bunch of functions. 00:06:30.700 --> 00:06:33.819 Some functions get the information from the Org file. 00:06:33.820 --> 00:06:36.959 Other functions use the info already collected. 00:06:36.960 --> 00:06:39.259 This can take a while to do again and again. 00:06:39.260 --> 00:06:41.739 It's useful to `memoize` this function 00:06:41.740 --> 00:06:43.499 when I know I'll be using it a lot, 00:06:43.500 --> 00:06:45.959 like when I export the organizers notebook. 00:06:45.960 --> 00:06:48.399 Memoize caches recent values. NOTE Wiki 00:06:48.400 --> 00:06:50.239 We combine this templating function 00:06:50.240 --> 00:06:51.479 with the talk information 00:06:51.480 --> 00:06:53.439 to fill in the conference wiki, 00:06:53.440 --> 00:06:56.479 since that's a matter of writing templated strings to files. 00:06:56.480 --> 00:06:58.279 The talk pages are generated once 00:06:58.280 --> 00:07:00.279 and then left alone for manual editing, 00:07:00.280 --> 00:07:02.399 while the navigation is regenerated 00:07:02.400 --> 00:07:04.659 every time we change the details. 00:07:04.660 --> 00:07:05.799 Here are some examples 00:07:05.800 --> 00:07:07.919 of how we fill in the conference wiki. 00:07:07.920 --> 00:07:10.959 We put in the format of the talk, how Q&A works, 00:07:10.960 --> 00:07:12.319 and what the status is. 00:07:12.320 --> 00:07:14.959 Once the talk is live, we include the video 00:07:14.960 --> 00:07:17.079 and the links to the files, too. 00:07:17.080 --> 00:07:18.719 The code is a little bit long, 00:07:18.720 --> 00:07:20.079 but the important part is that 00:07:20.080 --> 00:07:22.879 we fill in a plist with the values we calculate, 00:07:22.880 --> 00:07:26.379 and then we can use `emacsconf-replace-plist-in-string` 00:07:26.380 --> 00:07:28.019 to put that all together. 00:07:28.020 --> 00:07:30.279 The schedule is a little more complicated. 00:07:30.280 --> 00:07:32.079 I wrote an Ikiwiki directive 00:07:32.080 --> 00:07:34.019 so that the markup is more manageable, 00:07:34.020 --> 00:07:36.519 and the Emacs Lisp function uses that. 00:07:36.520 --> 00:07:40.619 The Ikiwiki directive takes all the data and turns it into HTML... 00:07:40.620 --> 00:07:42.959 ...so we can use Emacs Lisp to iterate over 00:07:42.960 --> 00:07:44.819 a slightly smaller property list 00:07:44.820 --> 00:07:47.779 and put them into the format Ikiwiki expects. 00:07:47.780 --> 00:07:50.079 It's nice to be able to navigate between talks 00:07:50.080 --> 00:07:52.839 without going back to the schedule page each time. 00:07:52.840 --> 00:07:55.579 This is handled by keeping two extra copies of the list: 00:07:55.580 --> 00:07:57.559 one with the first talk popped off, 00:07:57.560 --> 00:08:00.359 and one with an extra element added to the beginning. 00:08:00.360 --> 00:08:02.439 Then we can use the heads of those lists 00:08:02.440 --> 00:08:04.379 for next/previous links. NOTE Etherpad 00:08:04.380 --> 00:08:06.679 Links to the next talks are also handy 00:08:06.680 --> 00:08:08.639 on the collaborative Etherpad documents 00:08:08.640 --> 00:08:12.039 that we use for collecting questions, answers, and notes 00:08:12.040 --> 00:08:12.839 during each talk. 00:08:12.840 --> 00:08:15.299 Etherpad has an API... 00:08:15.300 --> 00:08:17.319 ...so I can start the pads off with a template 00:08:17.320 --> 00:08:18.939 before the conference. 00:08:18.940 --> 00:08:21.239 I don't want to accidentally overwrite a pad 00:08:21.240 --> 00:08:22.939 that has been manually edited. 00:08:22.940 --> 00:08:25.719 We can save the timestamp of the last modification 00:08:25.720 --> 00:08:28.199 and then compare it before overwriting. NOTE E-mail 00:08:28.200 --> 00:08:31.239 Templates are also very handy when it comes to e-mail. 00:08:31.240 --> 00:08:33.599 Sometimes we send e-mails one at a time, 00:08:33.600 --> 00:08:35.199 like when we let a speaker know 00:08:35.200 --> 00:08:36.879 that we've received their proposal. 00:08:36.880 --> 00:08:39.559 That's mostly a matter of plugging the talk's properties 00:08:39.560 --> 00:08:41.559 into the right places in the template. 00:08:41.560 --> 00:08:45.019 Sometimes we send e-mails to lots of speakers at the same time, 00:08:45.020 --> 00:08:48.299 like when we send them instructions for uploading their files. 00:08:48.300 --> 00:08:51.619 Instead of sending one e-mail and Bcc-ing everyone, 00:08:51.620 --> 00:08:53.479 or sending people multiple e-mails 00:08:53.480 --> 00:08:55.139 because they have multiple talks, 00:08:55.140 --> 00:08:57.559 I like to draft these as individual e-mails 00:08:57.560 --> 00:08:59.799 to each speaker (or group of speakers, 00:08:59.800 --> 00:09:02.599 if more than one person is associated with a talk). 00:09:02.600 --> 00:09:05.919 That gives me an opportunity to personalize it further. NOTE BigBlueButton web conferences 00:09:05.920 --> 00:09:08.119 Many speakers answer questions live 00:09:08.120 --> 00:09:10.039 in BigBlueButton web conference rooms. 00:09:10.440 --> 00:09:12.639 Setting up one room per group of speakers 00:09:12.640 --> 00:09:15.199 makes it easy to give the speakers the details 00:09:15.400 --> 00:09:18.719 and associate the recorded video with the talk afterwards. 00:09:18.720 --> 00:09:20.599 For EmacsConf 2023, 00:09:20.600 --> 00:09:25.079 I used Spookfox to control Mozilla Firefox from Emacs 00:09:25.080 --> 00:09:27.479 so that I could automate creating the rooms 00:09:27.480 --> 00:09:30.919 and adding the URLs to the talk properties in my Org file. 00:09:30.957 --> 00:09:33.959 Then I can use mail merge to send each speaker 00:09:33.960 --> 00:09:36.899 the check-in instructions for their specific room. 00:09:36.900 --> 00:09:39.139 Some speakers will take questions by e-mail 00:09:39.140 --> 00:09:41.619 after the conference instead of attending live, 00:09:41.620 --> 00:09:43.359 so we send them shorter instructions 00:09:43.360 --> 00:09:45.539 just in case they want to drop by. 00:09:45.540 --> 00:09:47.799 [Live Q&A sessions]: After the first rush of questions, 00:09:47.800 --> 00:09:50.579 we can open it up for other people to join. 00:09:50.580 --> 00:09:53.039 This is handled by changing the public page 00:09:53.040 --> 00:09:55.119 from one that just refreshes in a loop 00:09:55.120 --> 00:09:58.820 to one that redirects to the actual web conference room. 00:09:58.821 --> 00:10:00.079 Just in case, we also 00:10:00.080 --> 00:10:02.159 generate static copies of those redirects 00:10:02.160 --> 00:10:04.299 so that we can copy them if needed. 00:10:04.300 --> 00:10:06.679 That way, I don't have to count on Emacs being able to 00:10:06.680 --> 00:10:08.120 publish them over TRAMP. NOTE Shortcuts 00:10:08.121 --> 00:10:11.659 During the conference, I'm often jumping from talk to talk. 00:10:11.660 --> 00:10:13.199 Instead of going to the Org file 00:10:13.200 --> 00:10:14.519 and then searching for the talk, 00:10:14.520 --> 00:10:17.239 I've made a little Hydra with keyboard shortcuts. 00:10:17.240 --> 00:10:19.079 One of these shortcuts lets me 00:10:19.080 --> 00:10:20.959 jump to a talk with completion 00:10:20.960 --> 00:10:24.259 so that I can just type in part of the talk ID, 00:10:24.260 --> 00:10:26.399 title, or speaker name. 00:10:26.400 --> 00:10:28.679 I've also defined some Embark actions 00:10:28.680 --> 00:10:32.079 so that I can act on a talk right from the completion menu. 00:10:32.080 --> 00:10:35.079 For example, I might want to jump to the wiki page 00:10:35.080 --> 00:10:36.699 or e-mail the speaker. NOTE Logbook 00:10:36.700 --> 00:10:40.099 I can also add notes to a talk while looking at an email, 00:10:40.100 --> 00:10:41.639 like when a speaker lets me know 00:10:41.640 --> 00:10:43.279 that their video will be late. 00:10:43.280 --> 00:10:45.799 Making it easy to add a note turns Emacs into 00:10:45.800 --> 00:10:49.959 a very basic contact relationship management system, or CRM. 00:10:49.960 --> 00:10:52.439 The way this works is that we have a function 00:10:52.440 --> 00:10:55.459 that lists all the email addresses associated with a talk. 00:10:55.460 --> 00:10:57.919 We can then map that over the list of talks, 00:10:57.920 --> 00:10:59.959 look up the author of the current email, 00:10:59.960 --> 00:11:03.679 prompt the user for the talk to add the note to, and add the note. NOTE Captions 00:11:03.680 --> 00:11:04.679 On to captions. 00:11:04.680 --> 00:11:07.239 We've been doing captions for the last couple of years, 00:11:07.240 --> 00:11:10.419 and now we have a small army of volunteer captioners. 00:11:10.420 --> 00:11:12.679 They get early access to the recorded talks 00:11:12.680 --> 00:11:16.159 and fix up misrecognized words, format keyboard shortcuts 00:11:16.160 --> 00:11:19.579 to follow Emacs conventions, spell names correctly, 00:11:19.580 --> 00:11:21.839 and do all sorts of other wonderful things. 00:11:21.840 --> 00:11:24.399 One of our evil plans with EmacsConf 00:11:24.400 --> 00:11:28.359 is to get cool stuff out of people's heads into videos 00:11:28.360 --> 00:11:32.039 and also make captions so that those videos can be searched. 00:11:32.040 --> 00:11:34.999 To make that possible, we first need a backstage area 00:11:35.000 --> 00:11:36.919 where volunteers can get the files. 00:11:36.920 --> 00:11:39.839 This is just a simple password-protected directory 00:11:39.840 --> 00:11:43.739 with a static HTML page that lists the talks by status 00:11:43.740 --> 00:11:46.379 and shows the files related to each talk. 00:11:46.380 --> 00:11:49.899 As a talk moves through the process, I update its TODO state 00:11:49.900 --> 00:11:51.359 and republish this index. 00:11:51.360 --> 00:11:54.519 Talks that are ready to be captioned show up in that section, 00:11:54.520 --> 00:11:58.179 and volunteers can call dibs on the talk they're interested in. 00:11:58.180 --> 00:12:00.979 That's all done with a function that formats the information 00:12:00.980 --> 00:12:04.319 and uses TRAMP to save the file directly to the server. 00:12:04.320 --> 00:12:06.679 You can find more details on our captioning process 00:12:06.680 --> 00:12:09.039 at emacsconf.org/captioning. 00:12:09.040 --> 00:12:13.219 I like using subed to edit subtitles within Emacs. NOTE Crontabs and playing the talks 00:12:13.220 --> 00:12:16.059 Let's talk about actually playing the talks. 00:12:16.060 --> 00:12:19.559 For EmacsConf 2022, we tried using Emacs timers 00:12:19.560 --> 00:12:20.939 to run the talks. 00:12:20.940 --> 00:12:24.079 It turns out that you can't call TRAMP from a timer 00:12:24.080 --> 00:12:26.719 when you're already using TRAMP from another timer 00:12:26.720 --> 00:12:27.799 at the same time. 00:12:27.800 --> 00:12:29.719 I thought about just tweaking the schedule 00:12:29.720 --> 00:12:31.799 so that we always start things at different times, 00:12:31.800 --> 00:12:35.119 but I figured there's probably a more elegant way to do this. 00:12:35.120 --> 00:12:37.519 This year, I'm planning to experiment with using cron 00:12:37.520 --> 00:12:39.599 to start talks on autopilot. 00:12:39.600 --> 00:12:42.479 The shell scripts will take care of playing the videos... 00:12:42.480 --> 00:12:44.839 ... figuring out the appropriate Q&A... 00:12:44.840 --> 00:12:47.579 ... and joining the web conference if needed. 00:12:47.580 --> 00:12:49.599 We just need to format the information... 00:12:49.600 --> 00:12:52.219 ...and install it as the track's crontab. 00:12:52.220 --> 00:12:54.079 It's useful to be able to switch tracks 00:12:54.080 --> 00:12:55.879 to manual mode independently, 00:12:55.880 --> 00:12:57.899 just in case things go haywire. 00:12:57.900 --> 00:13:00.119 Then we can start everything manually. 00:13:00.120 --> 00:13:02.799 I can also manually update a talk's status, 00:13:02.800 --> 00:13:06.519 like when the host tells me that it's okay to open up the Q&A. 00:13:06.520 --> 00:13:08.719 The shell scripts we run from the crontab 00:13:08.720 --> 00:13:11.279 can also update the talk status themselves. NOTE Transitions 00:13:11.280 --> 00:13:14.319 Then a bunch of things automatically happen based on 00:13:14.320 --> 00:13:15.599 the talk status changes. 00:13:15.600 --> 00:13:18.959 This uses `org-after-todo-state-change-hook`. 00:13:18.960 --> 00:13:20.359 We get the talk information 00:13:20.360 --> 00:13:22.519 and pass it to a list of functions. 00:13:22.520 --> 00:13:26.279 Internet Relay Chat or IRC is an easy way for people 00:13:26.280 --> 00:13:29.139 to join the conversation around EmacsConf. 00:13:29.140 --> 00:13:31.799 We announce a talk whenever it changes state. 00:13:31.800 --> 00:13:33.599 For example, when a talk starts, 00:13:33.600 --> 00:13:36.039 we post the URLs to the talk webpage 00:13:36.040 --> 00:13:39.439 and the Etherpad for questions. We change the topic as well, 00:13:39.440 --> 00:13:41.879 so anyone can see the current talk's information 00:13:41.880 --> 00:13:43.039 even if they're a little late. 00:13:43.180 --> 00:13:45.799 This is easy to do with a little bit of Emacs Lisp 00:13:45.800 --> 00:13:48.519 because (of course!) Emacs has an IRC client. 00:13:48.520 --> 00:13:49.879 In fact, it has several. NOTE Wrapping up 00:13:49.880 --> 00:13:53.139 It seems like a lot of automation and Emacs Lisp, 00:13:53.140 --> 00:13:56.899 but really, all of this was just built up little by little. 00:13:56.900 --> 00:13:59.279 And tinkering with this is *fun*, you know? 00:13:59.280 --> 00:14:01.259 It's like always being able to ask, 00:14:01.260 --> 00:14:03.300 "Hey, wouldn't it be cool if..." 00:14:03.301 --> 00:14:05.279 and then actually being able to go and do it. 00:14:05.280 --> 00:14:07.999 Sometimes it feels like EmacsConf is an excuse 00:14:08.000 --> 00:14:10.199 for me to play with Emacs. 00:14:10.200 --> 00:14:11.999 It's pretty amazing what you can do 00:14:12.000 --> 00:14:13.799 by combining a bunch of pieces. 00:14:13.800 --> 00:14:16.719 A way to store slightly-structured information. 00:14:16.720 --> 00:14:18.879 A way to get it out again. Templates. 00:14:18.880 --> 00:14:20.679 TRAMP, for working with remote files 00:14:20.680 --> 00:14:21.919 and running remote commands. 00:14:21.920 --> 00:14:23.839 A way to talk to a web browser. 00:14:23.840 --> 00:14:25.399 A way to work with SVGs. 00:14:25.400 --> 00:14:27.759 An email client. A chat client. 00:14:27.760 --> 00:14:29.639 You can smoosh them all together 00:14:29.640 --> 00:14:32.699 in a way that you couldn't if they were all separate things. 00:14:32.700 --> 00:14:36.279 The code is in the emacsconf-el repository. 00:14:36.280 --> 00:14:39.119 It's a bit of a tangle because it's accumulating organically 00:14:39.120 --> 00:14:40.879 and I haven't really had the brainspace 00:14:40.880 --> 00:14:42.579 to step back and clean it up. 00:14:42.580 --> 00:14:45.919 But if you spotted anything interesting in this presentation, 00:14:45.920 --> 00:14:48.619 you can go check it out and see what you can scavenge. 00:14:48.620 --> 00:14:50.999 The link and this presentation are available 00:14:51.000 --> 00:14:59.119 from this talk's webpage at emacsconf.org/2023/talks/emacsconf . 00:14:59.120 --> 00:15:05.200 Let's figure out how to make Emacsconf even awesomer next year!